API Reference Overview
This section provides comprehensive API documentation for all Canopy-App modules, functions, and data structures.
Documentation Structure
The API documentation is automatically generated from the Fortran source code using Doxygen and organized into the following sections:
📋 Quick Navigation
- Module List - All Fortran modules in the codebase
- Function Index - Alphabetical list of all functions and subroutines
- Variable Reference - Global variables and parameters
- Generated Doxygen API - Complete auto-generated documentation
Module Categories
New Feature (2025)
- Urban/non-vegetated aerosol dry deposition: Added Pleim et al. (2022) equations for urban and bare soil areas. See
canopy_aero_ddep_pleim2022and output variablesddep_aero. - User Options:
ifcanaeroddep(logical): enables/disables aerosol dry deposition calculations via the namelist file. When.TRUE., activates all sub-canopy aerosol dry deposition routines and outputs.aeroddep_optselects the resistance parameterization for sub-canopy aerosol dry deposition (see README for options and references).
Core System Modules
canopy_app- Main program entry pointcanopy_init- Model initialization routinescanopy_alloc- Memory allocation managementcanopy_dealloc- Memory cleanup routines
Configuration and I/O
canopy_readnml- Namelist reading and parsingcanopy_files_mod- File management utilitiescanopy_ncf_io_mod- NetCDF input/output operationscanopy_txt_io_mod- Text file I/O operationscanopy_check_input- Input validation and quality control
Physical Process Modules
canopy_canmet_mod- Canopy meteorology calculationscanopy_rad_mod- Radiation transfer computationscanopy_bioemi_mod- Biogenic emission algorithmscanopy_drydep_mod- Dry deposition calculationscanopy_phot_mod- Photolysis rate computations
Supporting Modules
canopy_const_mod- Physical and mathematical constantscanopy_utils_mod- General utility functionscanopy_coord_mod- Coordinate system utilitiescanopy_date_mod- Date and time handling
Using the API Documentation
Finding Functions
- Browse by module to see related functions grouped together
- Use the function index for alphabetical lookup
- Search the Doxygen API for detailed parameter information
Understanding Parameters
Each function/subroutine is documented with: - Purpose - What the routine does - Input parameters - Required inputs with types and units - Output parameters - Results and their formats - Side effects - Any global state changes - Dependencies - Required modules or external libraries
Code Examples
Many API entries include usage examples showing:
! Example function call
call canopy_function(input_param, output_result, status)
if (status /= 0) then
write(*,*) 'Error in canopy_function'
endif
API Conventions
Naming Conventions
- Modules:
canopy_<purpose>_mod - Subroutines:
<action>_<object>(e.g.,calc_windspeed) - Functions:
<object>_<property>(e.g.,temperature_profile) - Variables:
<type>_<name>(e.g.,real_windspeed)
Parameter Conventions
intent(in)- Input parameters (read-only)intent(out)- Output parameters (write-only)intent(inout)- Input/output parameters (read-write)optional- Optional parameters with defaults
Error Handling
Most routines follow consistent error handling: - Return status codes (0 = success, non-zero = error) - Error messages written to standard output - Graceful degradation when possible
Common Usage Patterns
Model Initialization
! Standard initialization sequence
call canopy_alloc_arrays(status)
call canopy_read_namelist('namelist.canopy', status)
call canopy_init_physics(status)
call canopy_check_inputs(status)
Main Calculation Loop
! Typical calculation sequence
call canopy_calc_meteorology(status)
call canopy_calc_radiation(status)
call canopy_calc_biogenic_emissions(status)
call canopy_calc_dry_deposition(status)
call canopy_write_outputs(status)
Memory Management
! Proper cleanup sequence
call canopy_write_final_outputs(status)
call canopy_dealloc_arrays(status)
Performance Considerations
Computational Efficiency
- Most calculations are vectorized for array operations
- Optional physics modules can be disabled to improve performance
- Memory allocation is optimized for typical canopy layer counts
Memory Usage
- Arrays are allocated dynamically based on canopy configuration
- Large arrays use double precision only when necessary
- Intermediate arrays are deallocated when no longer needed
Extending the API
Adding New Modules
- Follow the naming convention:
canopy_<name>_mod.F90 - Include proper Doxygen documentation headers
- Implement consistent error handling
- Add appropriate unit tests
Modifying Existing Functions
- Maintain backward compatibility when possible
- Update documentation for any parameter changes
- Add version notes for significant modifications
- Test thoroughly before committing changes