fvs-python 0.2.4__tar.gz → 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fvs_python-0.3.0/PKG-INFO +287 -0
- fvs_python-0.3.0/README.md +221 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/pyproject.toml +19 -14
- fvs_python-0.3.0/src/fvs_python.egg-info/PKG-INFO +287 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/fvs_python.egg-info/SOURCES.txt +24 -1
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/__init__.py +9 -8
- fvs_python-0.3.0/src/pyfvs/bark_ratio.py +821 -0
- fvs_python-0.3.0/src/pyfvs/cfg/cs/cs_bark_ratio_coefficients.json +36 -0
- fvs_python-0.3.0/src/pyfvs/cfg/cs/cs_crown_ratio_coefficients.json +112 -0
- fvs_python-0.3.0/src/pyfvs/cfg/cs/cs_mortality_coefficients.json +107 -0
- fvs_python-0.3.0/src/pyfvs/cfg/ls/ls_bark_ratio_coefficients.json +82 -0
- fvs_python-0.3.0/src/pyfvs/cfg/ls/ls_crown_ratio_coefficients.json +64 -0
- fvs_python-0.3.0/src/pyfvs/cfg/ls/ls_large_tree_height_growth_coefficients.json +39 -0
- fvs_python-0.3.0/src/pyfvs/cfg/ne/ne_bark_ratio_coefficients.json +37 -0
- fvs_python-0.3.0/src/pyfvs/cfg/ne/ne_crown_ratio_coefficients.json +123 -0
- fvs_python-0.3.0/src/pyfvs/cfg/ne/ne_mortality_coefficients.json +118 -0
- fvs_python-0.3.0/src/pyfvs/cfg/pn/pn_bark_ratio_coefficients.json +143 -0
- fvs_python-0.3.0/src/pyfvs/cfg/pn/pn_crown_ratio_coefficients.json +75 -0
- fvs_python-0.3.0/src/pyfvs/cfg/taper/clark_r8_coefficients.json +345 -0
- fvs_python-0.3.0/src/pyfvs/cfg/taper/clark_r9_coefficients.json +364 -0
- fvs_python-0.3.0/src/pyfvs/cfg/taper/flewelling_coefficients.json +98 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/competition.py +14 -5
- fvs_python-0.3.0/src/pyfvs/crown_ratio.py +914 -0
- fvs_python-0.3.0/src/pyfvs/merchandising.py +483 -0
- fvs_python-0.3.0/src/pyfvs/mortality.py +866 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/pn_diameter_growth.py +3 -4
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/stand.py +12 -4
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/stand_metrics.py +219 -15
- fvs_python-0.3.0/src/pyfvs/taper.py +1234 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/tree.py +43 -32
- fvs_python-0.3.0/src/pyfvs/volume_library.py +766 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/wc_diameter_growth.py +21 -10
- fvs_python-0.3.0/tests/test_cs_variant.py +417 -0
- fvs_python-0.3.0/tests/test_ls_variant.py +592 -0
- fvs_python-0.3.0/tests/test_ne_variant.py +433 -0
- fvs_python-0.3.0/tests/test_op_variant.py +482 -0
- fvs_python-0.3.0/tests/test_pn_variant.py +528 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/tests/test_stand_metrics.py +4 -4
- fvs_python-0.3.0/tests/test_taper.py +914 -0
- fvs_python-0.3.0/tests/test_wc_variant.py +448 -0
- fvs_python-0.2.4/PKG-INFO +0 -261
- fvs_python-0.2.4/README.md +0 -194
- fvs_python-0.2.4/src/fvs_python.egg-info/PKG-INFO +0 -261
- fvs_python-0.2.4/src/pyfvs/bark_ratio.py +0 -340
- fvs_python-0.2.4/src/pyfvs/crown_ratio.py +0 -419
- fvs_python-0.2.4/src/pyfvs/mortality.py +0 -432
- fvs_python-0.2.4/src/pyfvs/volume_library.py +0 -416
- {fvs_python-0.2.4 → fvs_python-0.3.0}/LICENSE +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/setup.cfg +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/fvs_python.egg-info/dependency_links.txt +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/fvs_python.egg-info/requires.txt +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/fvs_python.egg-info/top_level.txt +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/ca_diameter_growth.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/CFG_README.md +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ca/ca_diameter_growth_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ca/ca_height_diameter_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ca/ca_species_config.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ca/species/df_douglas_fir.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ca/species/gs_giant_sequoia.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ca/species/jp_jeffrey_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ca/species/pp_ponderosa_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ca/species/rw_redwood.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ca/species/wf_white_fir.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/cs/cs_diameter_growth_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/cs/cs_height_diameter_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/cs/cs_species_config.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/cs/species/bc_black_cherry.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/cs/species/rm_red_maple.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/cs/species/ro_northern_red_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/cs/species/sh_shagbark_hickory.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/cs/species/sm_sugar_maple.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/cs/species/wn_black_walnut.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/cs/species/wo_white_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/cs/species/yp_tuliptree.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/dbh_bounding_table_4_7_1_8.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ecounit_coefficients_table_4_7_1_5.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ecounit_coefficients_table_4_7_1_6.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/forest_type_mapping_table_4_7_1_4.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/fortype_coefficients_table_4_7_1_3.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/functional_forms.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/growth_model_parameters.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/ls_diameter_growth_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/ls_height_diameter_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/ls_mortality_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/ls_species_config.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/ab_american_beech.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/ac_american_chestnut.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/ae_american_elm.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/ah_american_hornbeam.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/ap_apple.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/ba_black_ash.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/bc_black_cherry.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/be_beech.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/bf_balsam_fir.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/bg_black_gum.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/bh_bitternut_hickory.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/bk_birch_species.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/bl_black_locust.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/bm_black_maple.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/bn_butternut.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/bo_black_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/bp_balsam_poplar.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/br_bur_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/bs_black_spruce.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/bt_bigtooth_aspen.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/bw_black_willow.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/cc_chokecherry.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/ck_chinkapin_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/dm_boxelder.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/dw_dogwood.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/ec_eastern_cottonwood.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/eh_eastern_hemlock.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/ga_green_ash.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/hh_hophornbeam.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/hk_hickory_species.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/ht_hackberry.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/jp_jack_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/ma_mulberry.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/mm_mountain_maple.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/np_norway_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/ns_norway_spruce.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/oh_other_hardwood.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/os_other_softwood.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/pb_paper_birch.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/ph_pignut_hickory.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/pl_plum_species.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/pr_pin_cherry.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/qa_quaking_aspen.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/rc_eastern_redcedar.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/re_slippery_elm.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/rl_rock_elm.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/rm_red_maple.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/rn_red_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/ro_northern_red_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/rp_red_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/sc_scotch_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/sh_shagbark_hickory.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/sm_sugar_maple.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/ss_sassafras.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/st_striped_maple.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/sv_silver_maple.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/sw_swamp_white_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/sy_sycamore.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/ta_tamarack.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/wa_white_ash.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/wc_white_cedar.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/wi_willow.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/wn_black_walnut.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/wo_white_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/wp_white_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/ws_white_spruce.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ls/species/yb_yellow_birch.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ne/ne_diameter_growth_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ne/ne_height_diameter_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ne/ne_species_config.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ne/species/bc_black_cherry.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ne/species/bf_balsam_fir.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ne/species/rm_red_maple.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ne/species/ro_northern_red_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ne/species/rs_red_spruce.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ne/species/sm_sugar_maple.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ne/species/wp_white_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ne/species/yb_yellow_birch.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/oc/oc_diameter_growth_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/oc/oc_height_diameter_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/oc/oc_species_config.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/oc/species/df.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/op/op_diameter_growth_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/op/op_height_diameter_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/op/op_species_config.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/op/species/df_douglas_fir.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/op/species/ra_red_alder.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/op/species/rc_western_red_cedar.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/op/species/wh_western_hemlock.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/plant_values_table_4_7_1_7.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/pn/pn_diameter_growth_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/pn/pn_height_diameter_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/pn/pn_species_config.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/pn/species/df_douglas_fir.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/pn/species/rc_western_red_cedar.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/pn/species/wh_western_hemlock.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/site_index_transformation.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/sn_bark_ratio_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/sn_crown_competition_factor.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/sn_crown_ratio_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/sn_crown_width_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/sn_diameter_growth_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/sn_height_diameter_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/sn_large_tree_diameter_growth.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/sn_large_tree_height_growth.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/sn_large_tree_height_growth_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/sn_mortality_model.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/sn_regeneration_model.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/sn_relative_site_index.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/sn_small_tree_height_growth.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/sn_species_codes_table.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/sn_stand_density_index.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ab_american_basswood.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ab_american_beech.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ae_american_elm.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ah_american_hornbeam.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ap_american_plum.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ap_apple.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/as_american_sycamore.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ba_black_ash.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/bb_american_basswood.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/bb_basswood.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/bc_black_cherry.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/bd_sweet_birch.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/be_american_beech.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/bg_black_gum.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/bj_blackjack_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/bj_blue_jay.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/bk_black_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/bn_butternut.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/bo_blackjack_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/bt_bigtooth_aspen.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/bu_buckeye.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/by_bald_cypress.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ca_american_chestnut.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ca_catalpa.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/cb_cherrybark_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/cb_cucumber_tree.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ck_chinkapin_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/co_atlantic_white_cedar.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ct_catalpa.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/cw_chestnut_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/dw_dogwood.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/el_american_hornbeam.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/el_elm.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/fm_flowering_dogwood.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/fr_fraser_fir.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ga_green_ash.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ha_hawthorn.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/hb_hornbeam.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/hh_dogwood.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/hh_hophornbeam.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/hi_hickory_species.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/hl_holly.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/hm_eastern_hemlock.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/hy_american_holly.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/hy_holly.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ju_eastern_juniper.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/lb_loblolly_bay.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/lk_laurel_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ll_longleaf_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/lo_live_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/lp_loblolly_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/mb_mountain_birch.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/mb_mulberry.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/mg_magnolia.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ml_bigleaf_magnolia.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ml_maple_leaf.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ms_maple_species.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/mv_magnolia_vine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/mv_sweetbay.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/oh_other_hardwood.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/os_other_softwood.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ot_other_tree.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ov_overcup_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/pc_pond_cypress.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/pd_pitch_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/pi_pine_species.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/po_post_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/pp_pond_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ps_persimmon.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/pu_pond_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/qs_oak_species.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ra_red_ash.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/rd_redbud.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/rl_red_elm.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/rl_slippery_elm.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/rm_red_maple.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ro_northern_red_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/sa_slash_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/sb_sweet_birch.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/sd_sand_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/sk_southern_red_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/sk_swamp_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/sm_sugar_maple.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/sn_sourwood.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/so_scarlet_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/so_southern_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/sp_shortleaf_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/sr_spruce_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ss_sassafras.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/su_sweetgum.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/sv_silver_maple.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/sy_american_sycamore.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/sy_sycamore.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/tm_tamarack.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/to_tulip_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/to_turkey_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ts_swamp_tupelo.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/ts_tulip_tree.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/vp_virginia_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/wa_white_ash.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/we_white_elm.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/we_winged_elm.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/wi_willow.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/wk_water_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/wn_black_walnut.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/wn_walnut.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/wo_white_oak.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/wp_white_pine.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/wt_water_tupelo.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species/yp_yellow_poplar.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/species_config.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/wc/species/df_douglas_fir.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/wc/species/rc_western_red_cedar.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/wc/species/wh_western_hemlock.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/wc/wc_diameter_growth_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/wc/wc_height_diameter_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/wc/wc_species_config.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ws/species/sp.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ws/ws_diameter_growth_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ws/ws_height_diameter_coefficients.json +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cfg/ws/ws_species_config.yaml +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/clark_profile.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/config_loader.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/crown_competition_factor.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/crown_width.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/cs_diameter_growth.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/data_export.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/ecological_unit.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/exceptions.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/fia_integration.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/forest_type.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/growth_parameters.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/growth_plots.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/harvest.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/height_diameter.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/large_tree_height_growth.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/logging_config.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/ls_diameter_growth.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/main.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/model_base.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/ne_diameter_growth.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/oc_diameter_growth.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/op_diameter_growth.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/simulation_engine.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/sn_diameter_growth.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/species.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/stand_output.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/tree_utils.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/utils/__init__.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/utils/age_lookup.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/utils/string_utils.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/validation.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/src/pyfvs/ws_diameter_growth.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/tests/test_competition.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/tests/test_configuration.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/tests/test_crown_ratio.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/tests/test_documentation_examples.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/tests/test_fia_integration.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/tests/test_harvest.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/tests/test_height_diameter.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/tests/test_integration.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/tests/test_manuscript_validation.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/tests/test_model_validation.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/tests/test_mortality.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/tests/test_performance.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/tests/test_stand.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/tests/test_stand_output.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/tests/test_tree.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/tests/test_tree_comprehensive.py +0 -0
- {fvs_python-0.2.4 → fvs_python-0.3.0}/tests/test_validation.py +0 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: fvs-python
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: Python implementation of the USDA Forest Vegetation Simulator (FVS) with 10 regional variants, taper-based volume, and 500+ species configurations
|
|
5
|
+
Author-email: Chris Mihiar <chris.mihiar@gmail.com>
|
|
6
|
+
Maintainer-email: Chris Mihiar <chris.mihiar@gmail.com>
|
|
7
|
+
License: MIT
|
|
8
|
+
Project-URL: Homepage, https://fiatools.org/tools/pyfvs/
|
|
9
|
+
Project-URL: Repository, https://github.com/mihiarc/pyfvs
|
|
10
|
+
Project-URL: Documentation, https://mihiarc.github.io/pyfvs/
|
|
11
|
+
Project-URL: Source Code, https://github.com/mihiarc/pyfvs
|
|
12
|
+
Project-URL: Bug Tracker, https://github.com/mihiarc/pyfvs/issues
|
|
13
|
+
Project-URL: Changelog, https://github.com/mihiarc/pyfvs/releases
|
|
14
|
+
Project-URL: FIA Ecosystem, https://fiatools.org
|
|
15
|
+
Keywords: fvs,forest-vegetation-simulator,growth-simulation,yield-tables,forestry,timber-volume,taper-equations,southern-variant,lake-states,pacific-northwest,northeast,central-states,organon,douglas-fir,loblolly-pine,red-maple,individual-tree-growth,stand-projection,chapman-richards,nvel,fia,forest-inventory,usda,forest-service
|
|
16
|
+
Classifier: Development Status :: 4 - Beta
|
|
17
|
+
Classifier: Intended Audience :: Science/Research
|
|
18
|
+
Classifier: Intended Audience :: Developers
|
|
19
|
+
Classifier: Topic :: Scientific/Engineering
|
|
20
|
+
Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
|
|
21
|
+
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
22
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
23
|
+
Classifier: Operating System :: OS Independent
|
|
24
|
+
Classifier: Natural Language :: English
|
|
25
|
+
Classifier: Environment :: Console
|
|
26
|
+
Classifier: Programming Language :: Python :: 3
|
|
27
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
28
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
29
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
30
|
+
Requires-Python: >=3.12
|
|
31
|
+
Description-Content-Type: text/markdown
|
|
32
|
+
License-File: LICENSE
|
|
33
|
+
Requires-Dist: numpy>=1.21.0
|
|
34
|
+
Requires-Dist: pandas>=1.3.0
|
|
35
|
+
Requires-Dist: scipy>=1.7.0
|
|
36
|
+
Requires-Dist: matplotlib>=3.4.0
|
|
37
|
+
Requires-Dist: seaborn>=0.11.0
|
|
38
|
+
Requires-Dist: pyyaml>=6.0.0
|
|
39
|
+
Requires-Dist: pydantic>=2.5.0
|
|
40
|
+
Requires-Dist: tomli>=2.0.0; python_version < "3.11"
|
|
41
|
+
Requires-Dist: tomli-w>=1.0.0
|
|
42
|
+
Requires-Dist: tabulate>=0.9.0
|
|
43
|
+
Requires-Dist: openpyxl>=3.0.0
|
|
44
|
+
Requires-Dist: rich>=12.0.0
|
|
45
|
+
Provides-Extra: dev
|
|
46
|
+
Requires-Dist: pytest>=6.0.0; extra == "dev"
|
|
47
|
+
Requires-Dist: pytest-cov>=3.0.0; extra == "dev"
|
|
48
|
+
Requires-Dist: black>=22.0.0; extra == "dev"
|
|
49
|
+
Requires-Dist: flake8>=4.0.0; extra == "dev"
|
|
50
|
+
Requires-Dist: mypy>=0.900; extra == "dev"
|
|
51
|
+
Requires-Dist: pre-commit>=2.15.0; extra == "dev"
|
|
52
|
+
Requires-Dist: mkdocs>=1.6.0; extra == "dev"
|
|
53
|
+
Requires-Dist: mkdocs-material>=9.5.0; extra == "dev"
|
|
54
|
+
Requires-Dist: mkdocstrings[python]>=0.24.0; extra == "dev"
|
|
55
|
+
Provides-Extra: test
|
|
56
|
+
Requires-Dist: pytest>=6.0.0; extra == "test"
|
|
57
|
+
Requires-Dist: pytest-cov>=3.0.0; extra == "test"
|
|
58
|
+
Requires-Dist: pytest-xdist>=2.0.0; extra == "test"
|
|
59
|
+
Requires-Dist: polars>=0.20.0; extra == "test"
|
|
60
|
+
Provides-Extra: docs
|
|
61
|
+
Requires-Dist: mkdocs>=1.6.0; extra == "docs"
|
|
62
|
+
Requires-Dist: mkdocs-material>=9.5.0; extra == "docs"
|
|
63
|
+
Requires-Dist: mkdocstrings[python]>=0.24.0; extra == "docs"
|
|
64
|
+
Requires-Dist: pymdown-extensions>=10.7; extra == "docs"
|
|
65
|
+
Dynamic: license-file
|
|
66
|
+
|
|
67
|
+
<div align="center">
|
|
68
|
+
<h1>pyFVS</h1>
|
|
69
|
+
|
|
70
|
+
<p><strong>Forest growth and yield simulation in Python</strong></p>
|
|
71
|
+
|
|
72
|
+
<p>
|
|
73
|
+
<a href="https://pypi.org/project/fvs-python/"><img src="https://img.shields.io/pypi/v/fvs-python?color=006D6D&label=PyPI" alt="PyPI"></a>
|
|
74
|
+
<a href="https://mihiarc.github.io/pyfvs/"><img src="https://img.shields.io/badge/docs-GitHub%20Pages-006D6D" alt="Documentation"></a>
|
|
75
|
+
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-006D6D" alt="License: MIT"></a>
|
|
76
|
+
<a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.12+-006D6D" alt="Python 3.12+"></a>
|
|
77
|
+
</p>
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
A Python implementation of the USDA [Forest Vegetation Simulator](https://www.fs.usda.gov/fmsc/fvs/) (FVS) supporting **10 regional variants**, **taper-based volume calculations**, and **500+ species configurations** for simulating individual tree growth and yield across the United States.
|
|
83
|
+
|
|
84
|
+
## Features
|
|
85
|
+
|
|
86
|
+
- **10 Regional Variants** — Southern, Lake States, Pacific Northwest, West Cascades, Northeast, Central States, ORGANON, and more
|
|
87
|
+
- **Taper-Based Volume** — Clark (Eastern) and Flewelling (Western) taper models with NVEL-compatible merchandising
|
|
88
|
+
- **500+ Species Configs** — Individual species parameters for height-diameter, bark ratio, crown ratio, and growth
|
|
89
|
+
- **Individual Tree Growth** — Diameter, height, crown ratio, and mortality modeled per tree per cycle
|
|
90
|
+
- **Stand Management** — Thinning from below/above, selection harvest, clearcut, and custom prescriptions
|
|
91
|
+
- **FIA Integration** — Initialize stands directly from Forest Inventory and Analysis plot data
|
|
92
|
+
- **Export Formats** — Yield tables, CSV, Excel, and tree lists
|
|
93
|
+
|
|
94
|
+
## Supported Variants
|
|
95
|
+
|
|
96
|
+
| Variant | Region | Species | Key Species | Volume Model |
|
|
97
|
+
|---------|--------|---------|-------------|--------------|
|
|
98
|
+
| **SN** | Southern US | 90 | Loblolly Pine, Longleaf Pine, Slash Pine | Clark (R8) |
|
|
99
|
+
| **LS** | Lake States (MI, WI, MN) | 67 | Red Pine, Jack Pine, Sugar Maple | Clark (R9) |
|
|
100
|
+
| **NE** | Northeast (13 states) | 108 | Red Maple, Sugar Maple, Northern Red Oak | Clark (R9) |
|
|
101
|
+
| **CS** | Central States (IL, IN, IA, MO) | 96 | White Oak, Black Walnut, Yellow-Poplar | Clark (R9) |
|
|
102
|
+
| **PN** | Pacific NW Coast (WA, OR) | 39 | Douglas-fir, Western Hemlock, Sitka Spruce | Flewelling |
|
|
103
|
+
| **WC** | West Cascades (OR, WA) | 37 | Douglas-fir, Western Hemlock, Western Red Cedar | Flewelling |
|
|
104
|
+
| **OP** | ORGANON Pacific NW | 18 | Douglas-fir, Red Alder | Flewelling |
|
|
105
|
+
| **CA** | Inland California | — | White Fir, Ponderosa Pine | — |
|
|
106
|
+
| **OC** | ORGANON SW Oregon | — | Douglas-fir, Tanoak | — |
|
|
107
|
+
| **WS** | Western Sierra Nevada | — | White Fir, Giant Sequoia | — |
|
|
108
|
+
|
|
109
|
+
Variants marked with — use default (SN) infrastructure and are pending full implementation.
|
|
110
|
+
|
|
111
|
+
## Installation
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
pip install fvs-python
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Quick Start
|
|
118
|
+
|
|
119
|
+
```python
|
|
120
|
+
from pyfvs import Stand
|
|
121
|
+
|
|
122
|
+
# Southern loblolly pine plantation
|
|
123
|
+
stand = Stand.initialize_planted(
|
|
124
|
+
trees_per_acre=500,
|
|
125
|
+
site_index=70,
|
|
126
|
+
species="LP",
|
|
127
|
+
ecounit="M231"
|
|
128
|
+
)
|
|
129
|
+
stand.grow(years=50)
|
|
130
|
+
metrics = stand.get_metrics()
|
|
131
|
+
print(f"TPA: {metrics['tpa']:.0f} QMD: {metrics['qmd']:.1f}\" "
|
|
132
|
+
f"BA: {metrics['basal_area']:.0f} ft² Volume: {metrics['volume']:.0f} ft³/ac")
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Multi-Variant Examples
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
from pyfvs import Stand
|
|
139
|
+
|
|
140
|
+
# Pacific Northwest Douglas-fir (PN variant)
|
|
141
|
+
stand = Stand.initialize_planted(400, 120, "DF", variant="PN")
|
|
142
|
+
stand.grow(years=50)
|
|
143
|
+
# ~333 TPA, 14.5" QMD, 383 BA, 15,029 ft³/ac
|
|
144
|
+
|
|
145
|
+
# Lake States Red Pine (LS variant)
|
|
146
|
+
stand = Stand.initialize_planted(500, 65, "RN", variant="LS")
|
|
147
|
+
stand.grow(years=50)
|
|
148
|
+
# ~459 TPA, 10.4" QMD, 270 BA, 7,774 ft³/ac
|
|
149
|
+
|
|
150
|
+
# Northeast Red Maple (NE variant)
|
|
151
|
+
stand = Stand.initialize_planted(500, 60, "RM", variant="NE")
|
|
152
|
+
stand.grow(years=50)
|
|
153
|
+
# ~89 BA, 7.4" QMD
|
|
154
|
+
|
|
155
|
+
# Central States White Oak (CS variant)
|
|
156
|
+
stand = Stand.initialize_planted(500, 65, "WO", variant="CS")
|
|
157
|
+
stand.grow(years=50)
|
|
158
|
+
# ~283 TPA, 8.7" QMD, 117 BA
|
|
159
|
+
|
|
160
|
+
# ORGANON Douglas-fir (OP variant - highest yield)
|
|
161
|
+
stand = Stand.initialize_planted(400, 120, "DF", variant="OP")
|
|
162
|
+
stand.grow(years=50)
|
|
163
|
+
# ~323 TPA, 18.5" QMD, 601 BA, 28,395 ft³/ac
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Thinning
|
|
167
|
+
|
|
168
|
+
```python
|
|
169
|
+
stand = Stand.initialize_planted(500, 70, "LP", ecounit="M231")
|
|
170
|
+
stand.grow(years=15)
|
|
171
|
+
stand.thin_from_below(target_tpa=200)
|
|
172
|
+
stand.grow(years=35)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Yield Tables
|
|
176
|
+
|
|
177
|
+
```python
|
|
178
|
+
from pyfvs import Stand
|
|
179
|
+
|
|
180
|
+
stand = Stand.initialize_planted(500, 70, "LP", ecounit="M231")
|
|
181
|
+
table = stand.grow(years=50, yield_table=True)
|
|
182
|
+
print(table)
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
| Age | TPA | QMD | Height | BA | Volume |
|
|
186
|
+
|-----|-----|-----|--------|-----|--------|
|
|
187
|
+
| 0 | 500 | 0.5 | 1.0 | 0.7 | 0 |
|
|
188
|
+
| 10 | 485 | 4.2 | 28.5 | 47 | 892 |
|
|
189
|
+
| 20 | 420 | 7.8 | 52.1 | 140 | 3,241 |
|
|
190
|
+
| 30 | 310 | 10.4 | 68.3 | 183 | 5,128 |
|
|
191
|
+
|
|
192
|
+
## Volume System
|
|
193
|
+
|
|
194
|
+
pyFVS uses a taper-based volume system matching NVEL (National Volume Estimator Library):
|
|
195
|
+
|
|
196
|
+
| Model | Region | Method |
|
|
197
|
+
|-------|--------|--------|
|
|
198
|
+
| **Clark** | Eastern (SN, NE, CS, LS) | 3-segment profile with analytic integration |
|
|
199
|
+
| **Flewelling** | Western (PN, WC, OP) | 4-segment variable-shape profile |
|
|
200
|
+
| **Combined-variable** | Fallback | V = a + b * D²H (Amateis & Burkhart 1987) |
|
|
201
|
+
|
|
202
|
+
Merchandising supports Scribner Decimal C, International 1/4", and Doyle board-foot rules with per-log bucking.
|
|
203
|
+
|
|
204
|
+
## Architecture
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
Stand.initialize_planted() --> Tree objects --> grow() cycles --> mortality / harvest
|
|
208
|
+
| |
|
|
209
|
+
StandMetrics GrowthModels
|
|
210
|
+
Competition HeightDiameter
|
|
211
|
+
Mortality CrownRatio
|
|
212
|
+
HarvestManager BarkRatio
|
|
213
|
+
OutputGenerator TaperVolume
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Each `Tree` uses a size-dependent growth model:
|
|
217
|
+
- **Small trees** (DBH < 1"): Height-driven growth via Chapman-Richards
|
|
218
|
+
- **Transition** (1" - 3"): Weighted blend of small and large tree models
|
|
219
|
+
- **Large trees** (DBH > 3"): Diameter-driven growth via variant-specific DDS equations
|
|
220
|
+
|
|
221
|
+
Variant-specific diameter growth equations:
|
|
222
|
+
|
|
223
|
+
| Variant | Equation | Variables |
|
|
224
|
+
|---------|----------|-----------|
|
|
225
|
+
| SN | ln(DDS) | DBH, CR, RELHT, SI, BA, ecounit |
|
|
226
|
+
| LS, CS | DDS (linear) | DBH, CR, RELDBH, SI, BA, BAL |
|
|
227
|
+
| PN, WC | ln(DDS) | DBH, CR, RELHT, SI, BA, BAL, elevation, slope, aspect |
|
|
228
|
+
| NE | BA growth (iterative) | DBH, SI, BAL, CR |
|
|
229
|
+
| OP | ln(DG) direct | DBH, CR, SI, BA, BAL |
|
|
230
|
+
|
|
231
|
+
## Configuration
|
|
232
|
+
|
|
233
|
+
Species parameters stored in YAML with variant-specific coefficient files in JSON:
|
|
234
|
+
|
|
235
|
+
```
|
|
236
|
+
src/pyfvs/cfg/
|
|
237
|
+
species/*.yaml # SN species configs (90 species)
|
|
238
|
+
sn_*.json # SN variant coefficients
|
|
239
|
+
ls/species/*.yaml # LS species configs (67 species)
|
|
240
|
+
ls/ls_*.json # LS variant coefficients
|
|
241
|
+
pn/, wc/, ne/, cs/, op/ # Other variant directories
|
|
242
|
+
taper/ # Taper model coefficients
|
|
243
|
+
clark_r8_coefficients.json
|
|
244
|
+
clark_r9_coefficients.json
|
|
245
|
+
flewelling_coefficients.json
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## Testing
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
# Run all tests (~1000 tests)
|
|
252
|
+
uv run pytest
|
|
253
|
+
|
|
254
|
+
# Run specific variant tests
|
|
255
|
+
uv run pytest tests/test_ls_variant.py
|
|
256
|
+
uv run pytest tests/test_pn_variant.py
|
|
257
|
+
uv run pytest tests/test_taper.py
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## References
|
|
261
|
+
|
|
262
|
+
- [FVS Documentation](https://www.fs.usda.gov/fmsc/fvs/) — USDA Forest Service
|
|
263
|
+
- [FVS Essential Guide (GTR-WO-102)](https://www.fs.usda.gov/research/treesearch/62574) — Dixon (2023)
|
|
264
|
+
- Clark, A. et al. (1991). Stem profile equations for southern tree species. USDA-FS Research Paper SE-282.
|
|
265
|
+
- Flewelling, J.W. (1994). Stem form equation development notes. USDA-FS.
|
|
266
|
+
- Amateis, R.L. & Burkhart, H.E. (1987). Tree volume and taper. *Forest Science* 33(2).
|
|
267
|
+
|
|
268
|
+
## Citation
|
|
269
|
+
|
|
270
|
+
```bibtex
|
|
271
|
+
@software{pyfvs2025,
|
|
272
|
+
title = {pyFVS: Python Implementation of the Forest Vegetation Simulator},
|
|
273
|
+
author = {Mihiar, Christopher},
|
|
274
|
+
year = {2025},
|
|
275
|
+
url = {https://github.com/mihiarc/pyfvs}
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## License
|
|
280
|
+
|
|
281
|
+
MIT
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
<div align="center">
|
|
286
|
+
<sub>Built by <a href="https://github.com/mihiarc">Chris Mihiar</a></sub>
|
|
287
|
+
</div>
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<h1>pyFVS</h1>
|
|
3
|
+
|
|
4
|
+
<p><strong>Forest growth and yield simulation in Python</strong></p>
|
|
5
|
+
|
|
6
|
+
<p>
|
|
7
|
+
<a href="https://pypi.org/project/fvs-python/"><img src="https://img.shields.io/pypi/v/fvs-python?color=006D6D&label=PyPI" alt="PyPI"></a>
|
|
8
|
+
<a href="https://mihiarc.github.io/pyfvs/"><img src="https://img.shields.io/badge/docs-GitHub%20Pages-006D6D" alt="Documentation"></a>
|
|
9
|
+
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-006D6D" alt="License: MIT"></a>
|
|
10
|
+
<a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.12+-006D6D" alt="Python 3.12+"></a>
|
|
11
|
+
</p>
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
A Python implementation of the USDA [Forest Vegetation Simulator](https://www.fs.usda.gov/fmsc/fvs/) (FVS) supporting **10 regional variants**, **taper-based volume calculations**, and **500+ species configurations** for simulating individual tree growth and yield across the United States.
|
|
17
|
+
|
|
18
|
+
## Features
|
|
19
|
+
|
|
20
|
+
- **10 Regional Variants** — Southern, Lake States, Pacific Northwest, West Cascades, Northeast, Central States, ORGANON, and more
|
|
21
|
+
- **Taper-Based Volume** — Clark (Eastern) and Flewelling (Western) taper models with NVEL-compatible merchandising
|
|
22
|
+
- **500+ Species Configs** — Individual species parameters for height-diameter, bark ratio, crown ratio, and growth
|
|
23
|
+
- **Individual Tree Growth** — Diameter, height, crown ratio, and mortality modeled per tree per cycle
|
|
24
|
+
- **Stand Management** — Thinning from below/above, selection harvest, clearcut, and custom prescriptions
|
|
25
|
+
- **FIA Integration** — Initialize stands directly from Forest Inventory and Analysis plot data
|
|
26
|
+
- **Export Formats** — Yield tables, CSV, Excel, and tree lists
|
|
27
|
+
|
|
28
|
+
## Supported Variants
|
|
29
|
+
|
|
30
|
+
| Variant | Region | Species | Key Species | Volume Model |
|
|
31
|
+
|---------|--------|---------|-------------|--------------|
|
|
32
|
+
| **SN** | Southern US | 90 | Loblolly Pine, Longleaf Pine, Slash Pine | Clark (R8) |
|
|
33
|
+
| **LS** | Lake States (MI, WI, MN) | 67 | Red Pine, Jack Pine, Sugar Maple | Clark (R9) |
|
|
34
|
+
| **NE** | Northeast (13 states) | 108 | Red Maple, Sugar Maple, Northern Red Oak | Clark (R9) |
|
|
35
|
+
| **CS** | Central States (IL, IN, IA, MO) | 96 | White Oak, Black Walnut, Yellow-Poplar | Clark (R9) |
|
|
36
|
+
| **PN** | Pacific NW Coast (WA, OR) | 39 | Douglas-fir, Western Hemlock, Sitka Spruce | Flewelling |
|
|
37
|
+
| **WC** | West Cascades (OR, WA) | 37 | Douglas-fir, Western Hemlock, Western Red Cedar | Flewelling |
|
|
38
|
+
| **OP** | ORGANON Pacific NW | 18 | Douglas-fir, Red Alder | Flewelling |
|
|
39
|
+
| **CA** | Inland California | — | White Fir, Ponderosa Pine | — |
|
|
40
|
+
| **OC** | ORGANON SW Oregon | — | Douglas-fir, Tanoak | — |
|
|
41
|
+
| **WS** | Western Sierra Nevada | — | White Fir, Giant Sequoia | — |
|
|
42
|
+
|
|
43
|
+
Variants marked with — use default (SN) infrastructure and are pending full implementation.
|
|
44
|
+
|
|
45
|
+
## Installation
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
pip install fvs-python
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Quick Start
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
from pyfvs import Stand
|
|
55
|
+
|
|
56
|
+
# Southern loblolly pine plantation
|
|
57
|
+
stand = Stand.initialize_planted(
|
|
58
|
+
trees_per_acre=500,
|
|
59
|
+
site_index=70,
|
|
60
|
+
species="LP",
|
|
61
|
+
ecounit="M231"
|
|
62
|
+
)
|
|
63
|
+
stand.grow(years=50)
|
|
64
|
+
metrics = stand.get_metrics()
|
|
65
|
+
print(f"TPA: {metrics['tpa']:.0f} QMD: {metrics['qmd']:.1f}\" "
|
|
66
|
+
f"BA: {metrics['basal_area']:.0f} ft² Volume: {metrics['volume']:.0f} ft³/ac")
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Multi-Variant Examples
|
|
70
|
+
|
|
71
|
+
```python
|
|
72
|
+
from pyfvs import Stand
|
|
73
|
+
|
|
74
|
+
# Pacific Northwest Douglas-fir (PN variant)
|
|
75
|
+
stand = Stand.initialize_planted(400, 120, "DF", variant="PN")
|
|
76
|
+
stand.grow(years=50)
|
|
77
|
+
# ~333 TPA, 14.5" QMD, 383 BA, 15,029 ft³/ac
|
|
78
|
+
|
|
79
|
+
# Lake States Red Pine (LS variant)
|
|
80
|
+
stand = Stand.initialize_planted(500, 65, "RN", variant="LS")
|
|
81
|
+
stand.grow(years=50)
|
|
82
|
+
# ~459 TPA, 10.4" QMD, 270 BA, 7,774 ft³/ac
|
|
83
|
+
|
|
84
|
+
# Northeast Red Maple (NE variant)
|
|
85
|
+
stand = Stand.initialize_planted(500, 60, "RM", variant="NE")
|
|
86
|
+
stand.grow(years=50)
|
|
87
|
+
# ~89 BA, 7.4" QMD
|
|
88
|
+
|
|
89
|
+
# Central States White Oak (CS variant)
|
|
90
|
+
stand = Stand.initialize_planted(500, 65, "WO", variant="CS")
|
|
91
|
+
stand.grow(years=50)
|
|
92
|
+
# ~283 TPA, 8.7" QMD, 117 BA
|
|
93
|
+
|
|
94
|
+
# ORGANON Douglas-fir (OP variant - highest yield)
|
|
95
|
+
stand = Stand.initialize_planted(400, 120, "DF", variant="OP")
|
|
96
|
+
stand.grow(years=50)
|
|
97
|
+
# ~323 TPA, 18.5" QMD, 601 BA, 28,395 ft³/ac
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Thinning
|
|
101
|
+
|
|
102
|
+
```python
|
|
103
|
+
stand = Stand.initialize_planted(500, 70, "LP", ecounit="M231")
|
|
104
|
+
stand.grow(years=15)
|
|
105
|
+
stand.thin_from_below(target_tpa=200)
|
|
106
|
+
stand.grow(years=35)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Yield Tables
|
|
110
|
+
|
|
111
|
+
```python
|
|
112
|
+
from pyfvs import Stand
|
|
113
|
+
|
|
114
|
+
stand = Stand.initialize_planted(500, 70, "LP", ecounit="M231")
|
|
115
|
+
table = stand.grow(years=50, yield_table=True)
|
|
116
|
+
print(table)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
| Age | TPA | QMD | Height | BA | Volume |
|
|
120
|
+
|-----|-----|-----|--------|-----|--------|
|
|
121
|
+
| 0 | 500 | 0.5 | 1.0 | 0.7 | 0 |
|
|
122
|
+
| 10 | 485 | 4.2 | 28.5 | 47 | 892 |
|
|
123
|
+
| 20 | 420 | 7.8 | 52.1 | 140 | 3,241 |
|
|
124
|
+
| 30 | 310 | 10.4 | 68.3 | 183 | 5,128 |
|
|
125
|
+
|
|
126
|
+
## Volume System
|
|
127
|
+
|
|
128
|
+
pyFVS uses a taper-based volume system matching NVEL (National Volume Estimator Library):
|
|
129
|
+
|
|
130
|
+
| Model | Region | Method |
|
|
131
|
+
|-------|--------|--------|
|
|
132
|
+
| **Clark** | Eastern (SN, NE, CS, LS) | 3-segment profile with analytic integration |
|
|
133
|
+
| **Flewelling** | Western (PN, WC, OP) | 4-segment variable-shape profile |
|
|
134
|
+
| **Combined-variable** | Fallback | V = a + b * D²H (Amateis & Burkhart 1987) |
|
|
135
|
+
|
|
136
|
+
Merchandising supports Scribner Decimal C, International 1/4", and Doyle board-foot rules with per-log bucking.
|
|
137
|
+
|
|
138
|
+
## Architecture
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
Stand.initialize_planted() --> Tree objects --> grow() cycles --> mortality / harvest
|
|
142
|
+
| |
|
|
143
|
+
StandMetrics GrowthModels
|
|
144
|
+
Competition HeightDiameter
|
|
145
|
+
Mortality CrownRatio
|
|
146
|
+
HarvestManager BarkRatio
|
|
147
|
+
OutputGenerator TaperVolume
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Each `Tree` uses a size-dependent growth model:
|
|
151
|
+
- **Small trees** (DBH < 1"): Height-driven growth via Chapman-Richards
|
|
152
|
+
- **Transition** (1" - 3"): Weighted blend of small and large tree models
|
|
153
|
+
- **Large trees** (DBH > 3"): Diameter-driven growth via variant-specific DDS equations
|
|
154
|
+
|
|
155
|
+
Variant-specific diameter growth equations:
|
|
156
|
+
|
|
157
|
+
| Variant | Equation | Variables |
|
|
158
|
+
|---------|----------|-----------|
|
|
159
|
+
| SN | ln(DDS) | DBH, CR, RELHT, SI, BA, ecounit |
|
|
160
|
+
| LS, CS | DDS (linear) | DBH, CR, RELDBH, SI, BA, BAL |
|
|
161
|
+
| PN, WC | ln(DDS) | DBH, CR, RELHT, SI, BA, BAL, elevation, slope, aspect |
|
|
162
|
+
| NE | BA growth (iterative) | DBH, SI, BAL, CR |
|
|
163
|
+
| OP | ln(DG) direct | DBH, CR, SI, BA, BAL |
|
|
164
|
+
|
|
165
|
+
## Configuration
|
|
166
|
+
|
|
167
|
+
Species parameters stored in YAML with variant-specific coefficient files in JSON:
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
src/pyfvs/cfg/
|
|
171
|
+
species/*.yaml # SN species configs (90 species)
|
|
172
|
+
sn_*.json # SN variant coefficients
|
|
173
|
+
ls/species/*.yaml # LS species configs (67 species)
|
|
174
|
+
ls/ls_*.json # LS variant coefficients
|
|
175
|
+
pn/, wc/, ne/, cs/, op/ # Other variant directories
|
|
176
|
+
taper/ # Taper model coefficients
|
|
177
|
+
clark_r8_coefficients.json
|
|
178
|
+
clark_r9_coefficients.json
|
|
179
|
+
flewelling_coefficients.json
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Testing
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
# Run all tests (~1000 tests)
|
|
186
|
+
uv run pytest
|
|
187
|
+
|
|
188
|
+
# Run specific variant tests
|
|
189
|
+
uv run pytest tests/test_ls_variant.py
|
|
190
|
+
uv run pytest tests/test_pn_variant.py
|
|
191
|
+
uv run pytest tests/test_taper.py
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## References
|
|
195
|
+
|
|
196
|
+
- [FVS Documentation](https://www.fs.usda.gov/fmsc/fvs/) — USDA Forest Service
|
|
197
|
+
- [FVS Essential Guide (GTR-WO-102)](https://www.fs.usda.gov/research/treesearch/62574) — Dixon (2023)
|
|
198
|
+
- Clark, A. et al. (1991). Stem profile equations for southern tree species. USDA-FS Research Paper SE-282.
|
|
199
|
+
- Flewelling, J.W. (1994). Stem form equation development notes. USDA-FS.
|
|
200
|
+
- Amateis, R.L. & Burkhart, H.E. (1987). Tree volume and taper. *Forest Science* 33(2).
|
|
201
|
+
|
|
202
|
+
## Citation
|
|
203
|
+
|
|
204
|
+
```bibtex
|
|
205
|
+
@software{pyfvs2025,
|
|
206
|
+
title = {pyFVS: Python Implementation of the Forest Vegetation Simulator},
|
|
207
|
+
author = {Mihiar, Christopher},
|
|
208
|
+
year = {2025},
|
|
209
|
+
url = {https://github.com/mihiarc/pyfvs}
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## License
|
|
214
|
+
|
|
215
|
+
MIT
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
<div align="center">
|
|
220
|
+
<sub>Built by <a href="https://github.com/mihiarc">Chris Mihiar</a></sub>
|
|
221
|
+
</div>
|
|
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "fvs-python"
|
|
7
|
-
version = "0.
|
|
8
|
-
description = "Python implementation of the Forest Vegetation Simulator -
|
|
7
|
+
version = "0.3.0"
|
|
8
|
+
description = "Python implementation of the USDA Forest Vegetation Simulator (FVS) with 10 regional variants, taper-based volume, and 500+ species configurations"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = {text = "MIT"}
|
|
11
11
|
authors = [
|
|
@@ -21,20 +21,26 @@ keywords = [
|
|
|
21
21
|
"growth-simulation",
|
|
22
22
|
"yield-tables",
|
|
23
23
|
"forestry",
|
|
24
|
-
|
|
25
|
-
"
|
|
24
|
+
"timber-volume",
|
|
25
|
+
"taper-equations",
|
|
26
|
+
# Regional variants
|
|
27
|
+
"southern-variant",
|
|
28
|
+
"lake-states",
|
|
29
|
+
"pacific-northwest",
|
|
30
|
+
"northeast",
|
|
31
|
+
"central-states",
|
|
32
|
+
"organon",
|
|
33
|
+
# Species groups
|
|
34
|
+
"douglas-fir",
|
|
26
35
|
"loblolly-pine",
|
|
27
|
-
"
|
|
28
|
-
"slash-pine",
|
|
29
|
-
"shortleaf-pine",
|
|
36
|
+
"red-maple",
|
|
30
37
|
# Methods
|
|
31
|
-
"chapman-richards",
|
|
32
38
|
"individual-tree-growth",
|
|
33
39
|
"stand-projection",
|
|
34
|
-
"
|
|
40
|
+
"chapman-richards",
|
|
41
|
+
"nvel",
|
|
35
42
|
# Ecosystem
|
|
36
43
|
"fia",
|
|
37
|
-
"fiatools",
|
|
38
44
|
"forest-inventory",
|
|
39
45
|
"usda",
|
|
40
46
|
"forest-service",
|
|
@@ -51,12 +57,11 @@ classifiers = [
|
|
|
51
57
|
"Natural Language :: English",
|
|
52
58
|
"Environment :: Console",
|
|
53
59
|
"Programming Language :: Python :: 3",
|
|
54
|
-
"Programming Language :: Python :: 3.9",
|
|
55
|
-
"Programming Language :: Python :: 3.10",
|
|
56
|
-
"Programming Language :: Python :: 3.11",
|
|
57
60
|
"Programming Language :: Python :: 3.12",
|
|
61
|
+
"Programming Language :: Python :: 3.13",
|
|
62
|
+
"Programming Language :: Python :: 3.14",
|
|
58
63
|
]
|
|
59
|
-
requires-python = ">=3.
|
|
64
|
+
requires-python = ">=3.12"
|
|
60
65
|
dependencies = [
|
|
61
66
|
"numpy>=1.21.0",
|
|
62
67
|
"pandas>=1.3.0",
|