0.1.8
Loading...
Searching...
No Matches
StomatalConductance.py
Go to the documentation of this file.
1"""
2High-level StomatalConductance interface for PyHelios.
3
4This module provides a user-friendly interface to the stomatal conductance modeling
5capabilities with graceful plugin handling and informative error messages.
6"""
7
8import logging
9from typing import List, Optional, Union, NamedTuple
10from contextlib import contextmanager
11
12from .plugins.registry import get_plugin_registry
13from .wrappers import UStomatalConductanceWrapper as stomatal_wrapper
14from .Context import Context
15from .exceptions import HeliosError
16
17logger = logging.getLogger(__name__)
18
19
21 """Exception raised for StomatalConductance-specific errors."""
22 pass
23
24
25# Model Coefficient Classes for type safety and clarity
26class BWBCoefficients(NamedTuple):
27 """Ball-Woodrow-Berry model coefficients."""
28 gs0: float # mol/m²/s - minimum stomatal conductance
29 a1: float # dimensionless - sensitivity parameter
30
31
32class BBLCoefficients(NamedTuple):
33 """Ball-Berry-Leuning model coefficients."""
34 gs0: float # mol/m²/s - minimum stomatal conductance
35 a1: float # dimensionless - sensitivity parameter
36 D0: float # mmol/mol - VPD parameter
37
38
39class MOPTCoefficients(NamedTuple):
40 """Medlyn et al. optimality model coefficients."""
41 gs0: float # mol/m²/s - minimum stomatal conductance
42 g1: float # (kPa)^0.5 - marginal water use efficiency
43
44
45class BMFCoefficients(NamedTuple):
46 """Buckley-Mott-Farquhar model coefficients."""
47 Em: float # mmol/m²/s - maximum transpiration rate
48 i0: float # μmol/m²/s - minimum radiation
49 k: float # μmol/m²/s·mmol/mol - light response parameter
50 b: float # mmol/mol - humidity response parameter
51
52
53class BBCoefficients(NamedTuple):
54 """Bailey model coefficients."""
55 pi_0: float # MPa - turgor pressure at full closure
56 pi_m: float # MPa - turgor pressure at full opening
57 theta: float # μmol/m²/s - light saturation parameter
58 sigma: float # dimensionless - shape parameter
59 chi: float # mol/m²/s/MPa - hydraulic conductance parameter
60
61
63 """
64 High-level interface for stomatal conductance modeling and gas exchange calculations.
65
66 This class provides a user-friendly wrapper around the native Helios
67 stomatal conductance plugin with automatic plugin availability checking and
68 graceful error handling.
69
70 The stomatal conductance model implements five different stomatal response models:
71 - BWB: Ball, Woodrow, Berry (1987) - original model
72 - BBL: Ball, Berry, Leuning (1990, 1995) - includes VPD response
73 - MOPT: Medlyn et al. (2011) - optimality-based model
74 - BMF: Buckley, Mott, Farquhar - simplified mechanistic model
75 - BB: Bailey - hydraulic-based model
76
77 The plugin includes a species library with pre-calibrated coefficients for
78 common plant species (Almond, Apple, Avocado, Grape, Lemon, Olive, Walnut, etc.).
79
80 Both steady-state and dynamic (time-stepping) calculations are supported,
81 with configurable time constants for stomatal opening and closing dynamics.
82
83 System requirements:
84 - Cross-platform support (Windows, Linux, macOS)
85 - No GPU required
86 - No special dependencies
87 - Stomatal conductance plugin compiled into PyHelios
88
89 Example:
90 >>> with Context() as context:
91 ... # Add leaf geometry
92 ... leaf_uuid = context.addPatch(center=[0, 0, 1], size=[0.1, 0.1])
93 ...
94 ... with StomatalConductanceModel(context) as stomatal:
95 ... # Set model coefficients using species library
96 ... stomatal.setBMFCoefficientsFromLibrary("Almond")
97 ...
98 ... # Run steady-state calculation
99 ... stomatal.run()
100 ...
101 ... # Or run dynamic simulation with timestep
102 ... stomatal.run(dt=60.0) # 60 second timestep
103 ...
104 ... # Set custom BMF coefficients for specific leaves
105 ... bmf_coeffs = BMFCoefficients(Em=258.25, i0=38.65, k=232916.82, b=609.67)
106 ... stomatal.setBMFCoefficients(bmf_coeffs, uuids=[leaf_uuid])
107 """
108
109 def __init__(self, context: Context):
110 """
111 Initialize StomatalConductanceModel with graceful plugin handling.
112
113 Args:
114 context: Helios Context instance
115
116 Raises:
117 TypeError: If context is not a Context instance
118 StomatalConductanceModelError: If stomatal conductance plugin is not available
119 """
120 # Validate context type - use duck typing to handle import state issues during testing
121 if not (hasattr(context, '__class__') and
122 (isinstance(context, Context) or
123 context.__class__.__name__ == 'Context')):
124 raise TypeError(f"StomatalConductanceModel requires a Context instance, got {type(context).__name__}")
125
126 self.context = context
127 self.stomatal_model = None
129 # Check plugin availability using registry
130 registry = get_plugin_registry()
131
132 if not registry.is_plugin_available('stomatalconductance'):
133 # Get helpful information about the missing plugin
134 plugin_info = registry.get_plugin_capabilities()
135 available_plugins = registry.get_available_plugins()
136
137 error_msg = (
138 "StomatalConductanceModel requires the 'stomatalconductance' plugin which is not available.\n\n"
139 "The stomatal conductance plugin provides gas exchange calculations using five validated models:\n"
140 "- Ball-Woodrow-Berry (BWB) - classic stomatal response\n"
141 "- Ball-Berry-Leuning (BBL) - includes vapor pressure deficit\n"
142 "- Medlyn et al. optimality (MOPT) - optimal stomatal behavior\n"
143 "- Buckley-Mott-Farquhar (BMF) - mechanistic approach\n"
144 "- Bailey (BB) - hydraulic-based model\n\n"
145 "Features:\n"
146 "- Species library with pre-calibrated coefficients\n"
147 "- Dynamic time-stepping with configurable time constants\n"
148 "- No GPU or special dependencies required\n\n"
149 "To enable stomatal conductance modeling:\n"
150 "1. Build PyHelios with stomatal conductance plugin:\n"
151 " build_scripts/build_helios --plugins stomatalconductance\n"
152 "2. Or build with multiple plugins:\n"
153 " build_scripts/build_helios --plugins stomatalconductance,energybalance,photosynthesis\n"
154 f"\nCurrently available plugins: {available_plugins}"
155 )
156
157 # Suggest alternatives if available
158 alternatives = registry.suggest_alternatives('stomatalconductance')
159 if alternatives:
160 error_msg += f"\n\nAlternative plugins available: {alternatives}"
161 error_msg += "\nConsider using photosynthesis or energybalance for related plant physiology modeling."
162
163 raise StomatalConductanceModelError(error_msg)
164
165 # Plugin is available - create stomatal conductance model
166 try:
167 self.stomatal_model = stomatal_wrapper.createStomatalConductanceModel(context.getNativePtr())
168 if self.stomatal_model is None:
170 "Failed to create StomatalConductanceModel instance. "
171 "This may indicate a problem with the native library."
172 )
173 logger.info("StomatalConductanceModel created successfully")
174
175 except Exception as e:
176 raise StomatalConductanceModelError(f"Failed to initialize StomatalConductanceModel: {e}")
177
178 def __enter__(self):
179 """Context manager entry."""
180 return self
182 def __exit__(self, exc_type, exc_value, traceback):
183 """Context manager exit with proper cleanup."""
184 if self.stomatal_model is not None:
185 try:
186 stomatal_wrapper.destroyStomatalConductanceModel(self.stomatal_model)
187 logger.debug("StomatalConductanceModel destroyed successfully")
188 except Exception as e:
189 logger.warning(f"Error destroying StomatalConductanceModel: {e}")
190 finally:
191 self.stomatal_model = None
192
193 def getNativePtr(self):
194 """Get the native pointer for advanced operations."""
195 return self.stomatal_model
197 def enableMessages(self) -> None:
198 """
199 Enable console output messages from the stomatal conductance model.
200
201 Raises:
202 StomatalConductanceModelError: If operation fails
203 """
204 try:
205 stomatal_wrapper.enableMessages(self.stomatal_model)
206 except Exception as e:
207 raise StomatalConductanceModelError(f"Failed to enable messages: {e}")
208
209 def disableMessages(self) -> None:
210 """
211 Disable console output messages from the stomatal conductance model.
212
213 Raises:
214 StomatalConductanceModelError: If operation fails
215 """
216 try:
217 stomatal_wrapper.disableMessages(self.stomatal_model)
218 except Exception as e:
219 raise StomatalConductanceModelError(f"Failed to disable messages: {e}")
220
221 def run(self, uuids: Optional[List[int]] = None, dt: Optional[float] = None) -> None:
222 """
223 Run the stomatal conductance model.
224
225 This method supports multiple execution modes:
226 - Steady state for all primitives: run()
227 - Dynamic with timestep for all primitives: run(dt=60.0)
228 - Steady state for specific primitives: run(uuids=[1, 2, 3])
229 - Dynamic with timestep for specific primitives: run(uuids=[1, 2, 3], dt=60.0)
230
231 Args:
232 uuids: Optional list of primitive UUIDs to process. If None, processes all primitives.
233 dt: Optional timestep in seconds for dynamic simulation. If None, runs steady-state.
234
235 Raises:
236 ValueError: If parameters are invalid
237 StomatalConductanceModelError: If calculation fails
238
239 Example:
240 >>> # Steady state for all primitives
241 >>> stomatal.run()
242
243 >>> # Dynamic simulation with 60-second timestep
244 >>> stomatal.run(dt=60.0)
245
246 >>> # Steady state for specific leaves
247 >>> stomatal.run(uuids=[leaf1_uuid, leaf2_uuid])
248
249 >>> # Dynamic simulation for specific leaves
250 >>> stomatal.run(uuids=[leaf1_uuid, leaf2_uuid], dt=30.0)
251 """
252 try:
253 if dt is not None and uuids is not None:
254 # Dynamic simulation for specific UUIDs
255 stomatal_wrapper.runForUUIDsDynamic(self.stomatal_model, uuids, dt)
256 elif dt is not None:
257 # Dynamic simulation for all primitives
258 stomatal_wrapper.runDynamic(self.stomatal_model, dt)
259 elif uuids is not None:
260 # Steady state for specific UUIDs
261 stomatal_wrapper.runForUUIDs(self.stomatal_model, uuids)
262 else:
263 # Steady state for all primitives
264 stomatal_wrapper.run(self.stomatal_model)
265
266 except Exception as e:
267 raise StomatalConductanceModelError(f"Failed to run stomatal conductance model: {e}")
268
269 # BWB Model Methods
270 def setBWBCoefficients(self, coeffs: BWBCoefficients, uuids: Optional[List[int]] = None) -> None:
271 """
272 Set Ball-Woodrow-Berry model coefficients.
273
274 Args:
275 coeffs: BWB model coefficients (gs0, a1)
276 uuids: Optional list of primitive UUIDs. If None, applies to all primitives.
277
278 Raises:
279 ValueError: If coefficients are invalid
280 StomatalConductanceModelError: If operation fails
281
282 Example:
283 >>> bwb_coeffs = BWBCoefficients(gs0=0.0733, a1=9.422)
284 >>> stomatal.setBWBCoefficients(bwb_coeffs)
285 """
286 if not isinstance(coeffs, BWBCoefficients):
287 raise ValueError("coeffs must be a BWBCoefficients instance")
288 if coeffs.gs0 < 0.0:
289 raise ValueError("gs0 must be non-negative")
290 if coeffs.a1 < 0.0:
291 raise ValueError("a1 must be non-negative")
292
293 try:
294 if uuids is not None:
295 stomatal_wrapper.setBWBCoefficientsForUUIDs(self.stomatal_model, coeffs.gs0, coeffs.a1, uuids)
296 else:
297 stomatal_wrapper.setBWBCoefficients(self.stomatal_model, coeffs.gs0, coeffs.a1)
298 except Exception as e:
299 raise StomatalConductanceModelError(f"Failed to set BWB coefficients: {e}")
300
301 # BBL Model Methods
302 def setBBLCoefficients(self, coeffs: BBLCoefficients, uuids: Optional[List[int]] = None) -> None:
303 """
304 Set Ball-Berry-Leuning model coefficients.
305
306 Args:
307 coeffs: BBL model coefficients (gs0, a1, D0)
308 uuids: Optional list of primitive UUIDs. If None, applies to all primitives.
309
310 Raises:
311 ValueError: If coefficients are invalid
312 StomatalConductanceModelError: If operation fails
313
314 Example:
315 >>> bbl_coeffs = BBLCoefficients(gs0=0.0743, a1=4.265, D0=14570.0)
316 >>> stomatal.setBBLCoefficients(bbl_coeffs)
317 """
318 if not isinstance(coeffs, BBLCoefficients):
319 raise ValueError("coeffs must be a BBLCoefficients instance")
320 if coeffs.gs0 < 0.0:
321 raise ValueError("gs0 must be non-negative")
322 if coeffs.a1 < 0.0:
323 raise ValueError("a1 must be non-negative")
324 if coeffs.D0 <= 0.0:
325 raise ValueError("D0 must be positive")
326
327 try:
328 if uuids is not None:
329 stomatal_wrapper.setBBLCoefficientsForUUIDs(self.stomatal_model, coeffs.gs0, coeffs.a1, coeffs.D0, uuids)
330 else:
331 stomatal_wrapper.setBBLCoefficients(self.stomatal_model, coeffs.gs0, coeffs.a1, coeffs.D0)
332 except Exception as e:
333 raise StomatalConductanceModelError(f"Failed to set BBL coefficients: {e}")
334
335 # MOPT Model Methods
336 def setMOPTCoefficients(self, coeffs: MOPTCoefficients, uuids: Optional[List[int]] = None) -> None:
337 """
338 Set Medlyn et al. optimality model coefficients.
339
340 Args:
341 coeffs: MOPT model coefficients (gs0, g1)
342 uuids: Optional list of primitive UUIDs. If None, applies to all primitives.
343
344 Raises:
345 ValueError: If coefficients are invalid
346 StomatalConductanceModelError: If operation fails
347
348 Example:
349 >>> mopt_coeffs = MOPTCoefficients(gs0=0.0825, g1=2.637)
350 >>> stomatal.setMOPTCoefficients(mopt_coeffs)
351 """
352 if not isinstance(coeffs, MOPTCoefficients):
353 raise ValueError("coeffs must be a MOPTCoefficients instance")
354 if coeffs.gs0 < 0.0:
355 raise ValueError("gs0 must be non-negative")
356 if coeffs.g1 <= 0.0:
357 raise ValueError("g1 must be positive")
358
359 try:
360 if uuids is not None:
361 stomatal_wrapper.setMOPTCoefficientsForUUIDs(self.stomatal_model, coeffs.gs0, coeffs.g1, uuids)
362 else:
363 stomatal_wrapper.setMOPTCoefficients(self.stomatal_model, coeffs.gs0, coeffs.g1)
364 except Exception as e:
365 raise StomatalConductanceModelError(f"Failed to set MOPT coefficients: {e}")
366
367 # BMF Model Methods
368 def setBMFCoefficients(self, coeffs: BMFCoefficients, uuids: Optional[List[int]] = None) -> None:
369 """
370 Set Buckley-Mott-Farquhar model coefficients.
371
372 Args:
373 coeffs: BMF model coefficients (Em, i0, k, b)
374 uuids: Optional list of primitive UUIDs. If None, applies to all primitives.
375
376 Raises:
377 ValueError: If coefficients are invalid
378 StomatalConductanceModelError: If operation fails
379
380 Example:
381 >>> bmf_coeffs = BMFCoefficients(Em=258.25, i0=38.65, k=232916.82, b=609.67)
382 >>> stomatal.setBMFCoefficients(bmf_coeffs)
383 """
384 if not isinstance(coeffs, BMFCoefficients):
385 raise ValueError("coeffs must be a BMFCoefficients instance")
386 if coeffs.Em <= 0.0:
387 raise ValueError("Em must be positive")
388 if coeffs.i0 < 0.0:
389 raise ValueError("i0 must be non-negative")
390 if coeffs.k <= 0.0:
391 raise ValueError("k must be positive")
392 if coeffs.b <= 0.0:
393 raise ValueError("b must be positive")
394
395 try:
396 if uuids is not None:
397 stomatal_wrapper.setBMFCoefficientsForUUIDs(self.stomatal_model, coeffs.Em, coeffs.i0, coeffs.k, coeffs.b, uuids)
398 else:
399 stomatal_wrapper.setBMFCoefficients(self.stomatal_model, coeffs.Em, coeffs.i0, coeffs.k, coeffs.b)
400 except Exception as e:
401 raise StomatalConductanceModelError(f"Failed to set BMF coefficients: {e}")
402
403 # BB Model Methods
404 def setBBCoefficients(self, coeffs: BBCoefficients, uuids: Optional[List[int]] = None) -> None:
405 """
406 Set Bailey model coefficients.
407
408 Args:
409 coeffs: BB model coefficients (pi_0, pi_m, theta, sigma, chi)
410 uuids: Optional list of primitive UUIDs. If None, applies to all primitives.
411
412 Raises:
413 ValueError: If coefficients are invalid
414 StomatalConductanceModelError: If operation fails
415
416 Example:
417 >>> bb_coeffs = BBCoefficients(pi_0=1.0, pi_m=1.67, theta=211.22, sigma=0.4408, chi=2.076)
418 >>> stomatal.setBBCoefficients(bb_coeffs)
419 """
420 if not isinstance(coeffs, BBCoefficients):
421 raise ValueError("coeffs must be a BBCoefficients instance")
422 if coeffs.pi_0 <= 0.0:
423 raise ValueError("pi_0 must be positive")
424 if coeffs.pi_m <= 0.0:
425 raise ValueError("pi_m must be positive")
426 if coeffs.theta <= 0.0:
427 raise ValueError("theta must be positive")
428 if coeffs.sigma <= 0.0:
429 raise ValueError("sigma must be positive")
430 if coeffs.chi <= 0.0:
431 raise ValueError("chi must be positive")
432
433 try:
434 if uuids is not None:
435 stomatal_wrapper.setBBCoefficientsForUUIDs(self.stomatal_model, coeffs.pi_0, coeffs.pi_m, coeffs.theta, coeffs.sigma, coeffs.chi, uuids)
436 else:
437 stomatal_wrapper.setBBCoefficients(self.stomatal_model, coeffs.pi_0, coeffs.pi_m, coeffs.theta, coeffs.sigma, coeffs.chi)
438 except Exception as e:
439 raise StomatalConductanceModelError(f"Failed to set BB coefficients: {e}")
440
441 # Species Library Methods
442 def setBMFCoefficientsFromLibrary(self, species: str, uuids: Optional[List[int]] = None) -> None:
443 """
444 Set BMF model coefficients using the built-in species library.
445
446 Args:
447 species: Species name from the library (e.g., "Almond", "Apple", "Grape", "Walnut")
448 uuids: Optional list of primitive UUIDs. If None, applies to all primitives.
449
450 Raises:
451 ValueError: If species name is invalid
452 StomatalConductanceModelError: If operation fails
453
454 Example:
455 >>> # Set coefficients for almond tree
456 >>> stomatal.setBMFCoefficientsFromLibrary("Almond")
457
458 >>> # Set coefficients for specific leaves only
459 >>> stomatal.setBMFCoefficientsFromLibrary("Grape", uuids=[leaf1_uuid, leaf2_uuid])
460 """
461 if not species:
462 raise ValueError("Species name cannot be empty")
463
464 # Common species available in the library
465 available_species = [
466 "Almond", "Apple", "Avocado", "Cherry", "Grape", "Lemon",
467 "Olive", "Orange", "Peach", "Pear", "Plum", "Walnut"
468 ]
469
470 try:
471 if uuids is not None:
472 stomatal_wrapper.setBMFCoefficientsFromLibraryForUUIDs(self.stomatal_model, species, uuids)
473 else:
474 stomatal_wrapper.setBMFCoefficientsFromLibrary(self.stomatal_model, species)
475 except Exception as e:
476 error_msg = f"Failed to set BMF coefficients from library for species '{species}': {e}"
477 if "species not found" in str(e).lower() or "invalid species" in str(e).lower():
478 error_msg += f"\nAvailable species: {', '.join(available_species)}"
479 raise StomatalConductanceModelError(error_msg)
480
481 # Dynamic Time Constants
482 def setDynamicTimeConstants(self, tau_open: float, tau_close: float, uuids: Optional[List[int]] = None) -> None:
483 """
484 Set time constants for dynamic stomatal opening and closing.
485
486 Args:
487 tau_open: Time constant (seconds) for stomatal opening
488 tau_close: Time constant (seconds) for stomatal closing
489 uuids: Optional list of primitive UUIDs. If None, applies to all primitives.
490
491 Raises:
492 ValueError: If time constants are invalid
493 StomatalConductanceModelError: If operation fails
494
495 Example:
496 >>> # Set time constants for all leaves
497 >>> stomatal.setDynamicTimeConstants(tau_open=120.0, tau_close=240.0)
498
499 >>> # Set different time constants for specific leaves
500 >>> stomatal.setDynamicTimeConstants(tau_open=60.0, tau_close=180.0, uuids=[leaf1_uuid])
501 """
502 if tau_open <= 0.0:
503 raise ValueError("Opening time constant must be positive")
504 if tau_close <= 0.0:
505 raise ValueError("Closing time constant must be positive")
506
507 try:
508 if uuids is not None:
509 stomatal_wrapper.setDynamicTimeConstantsForUUIDs(self.stomatal_model, tau_open, tau_close, uuids)
510 else:
511 stomatal_wrapper.setDynamicTimeConstants(self.stomatal_model, tau_open, tau_close)
512 except Exception as e:
513 raise StomatalConductanceModelError(f"Failed to set dynamic time constants: {e}")
514
515 # Utility Methods
516 def optionalOutputPrimitiveData(self, label: str) -> None:
517 """
518 Add optional output primitive data to the Context.
520 Args:
521 label: Name of primitive data to output (e.g., "Ci", "gs", "E")
522
523 Raises:
524 ValueError: If label is invalid
525 StomatalConductanceModelError: If operation fails
526
527 Example:
528 >>> # Output stomatal conductance values
529 >>> stomatal.optionalOutputPrimitiveData("gs")
530
531 >>> # Output intercellular CO2 concentration
532 >>> stomatal.optionalOutputPrimitiveData("Ci")
533 """
534 if not label:
535 raise ValueError("Label cannot be empty")
536
537 try:
538 stomatal_wrapper.optionalOutputPrimitiveData(self.stomatal_model, label)
539 except Exception as e:
540 raise StomatalConductanceModelError(f"Failed to add optional output data '{label}': {e}")
541
542 def printDefaultValueReport(self, uuids: Optional[List[int]] = None) -> None:
543 """
544 Print a report detailing usage of default input values.
545
546 Args:
547 uuids: Optional list of primitive UUIDs. If None, reports on all primitives.
548
549 Raises:
550 StomatalConductanceModelError: If operation fails
551
552 Example:
553 >>> # Print report for all primitives
554 >>> stomatal.printDefaultValueReport()
555
556 >>> # Print report for specific leaves
557 >>> stomatal.printDefaultValueReport(uuids=[leaf1_uuid, leaf2_uuid])
558 """
559 try:
560 if uuids is not None:
561 stomatal_wrapper.printDefaultValueReportForUUIDs(self.stomatal_model, uuids)
562 else:
563 stomatal_wrapper.printDefaultValueReport(self.stomatal_model)
564 except Exception as e:
565 raise StomatalConductanceModelError(f"Failed to print default value report: {e}")
566
567 def is_available(self) -> bool:
568 """
569 Check if StomatalConductanceModel is available in current build.
570
571 Returns:
572 True if plugin is available, False otherwise
573 """
574 registry = get_plugin_registry()
575 return registry.is_plugin_available('stomatalconductance')
576
577
578# Convenience function
579def create_stomatal_conductance_model(context: Context) -> StomatalConductanceModel:
580 """
581 Create StomatalConductanceModel instance with context.
582
583 Args:
584 context: Helios Context
585
586 Returns:
587 StomatalConductanceModel instance
588 """
589 return StomatalConductanceModel(context)
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.
None setBMFCoefficients(self, BMFCoefficients coeffs, Optional[List[int]] uuids=None)
Set Buckley-Mott-Farquhar model coefficients.
None setMOPTCoefficients(self, MOPTCoefficients coeffs, Optional[List[int]] uuids=None)
Set Medlyn et al.
None printDefaultValueReport(self, Optional[List[int]] uuids=None)
Print a report detailing usage of default input values.
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 setBBLCoefficients(self, BBLCoefficients coeffs, Optional[List[int]] uuids=None)
Set Ball-Berry-Leuning model coefficients.
__init__(self, Context context)
Initialize StomatalConductanceModel with graceful plugin handling.
None setBWBCoefficients(self, BWBCoefficients coeffs, Optional[List[int]] uuids=None)
Set Ball-Woodrow-Berry model coefficients.
__exit__(self, exc_type, exc_value, traceback)
Context manager exit with proper cleanup.
getNativePtr(self)
Get the native pointer for advanced operations.
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 setBMFCoefficientsFromLibrary(self, str species, Optional[List[int]] uuids=None)
Set BMF model coefficients using the built-in species library.
None disableMessages(self)
Disable console output messages from the stomatal conductance model.
None setBBCoefficients(self, BBCoefficients coeffs, Optional[List[int]] uuids=None)
Set Bailey model coefficients.
Exception classes for PyHelios library.
Definition exceptions.py:10
StomatalConductanceModel create_stomatal_conductance_model(Context context)
Create StomatalConductanceModel instance with context.