<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.heurekaslu.se/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Osskyn</id>
	<title>Heureka Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.heurekaslu.se/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Osskyn"/>
	<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/wiki/Special:Contributions/Osskyn"/>
	<updated>2026-04-29T07:36:39Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.13</generator>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Forest_Data_Results&amp;diff=11080</id>
		<title>Forest Data Results</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Forest_Data_Results&amp;diff=11080"/>
		<updated>2026-03-27T08:10:48Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: Added missing result variable 'Species Richness'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This result group contains: [[ResultCategoryDescription::State for each treatment unit. Results include data for each treatment unit, alternative and time period. Please note that species-wise data is placed in a separate group (Data per Species).]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| {{table}}&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#f0f0f0;width: 30%;&amp;quot;|'''Variable name'''&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#f0f0f0;width: 20%;&amp;quot;|'''Unit'''&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#f0f0f0;width: 50%;&amp;quot;|'''Description'''&lt;br /&gt;
|-&lt;br /&gt;
| Mean Age (excl. overstorey)||yr||Mean total age for non-overstorey trees, basal area weighted if established stand, arithmetic of main saplings if young stand&lt;br /&gt;
|-&lt;br /&gt;
| Mean Age ||yr||Basal area weighted mean age all trees, including overstorey trees. &lt;br /&gt;
|-&lt;br /&gt;
| Mean Age Main Saplings||m||Mean age of main saplings&lt;br /&gt;
|-&lt;br /&gt;
| Stand Age||yr||Years since regeneration&lt;br /&gt;
|-&lt;br /&gt;
| Basal area (incl. overstorey)||m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;/ha||Basal area including overstorey trees&lt;br /&gt;
|-&lt;br /&gt;
| Basal area (excl. overstorey)||m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;/ha||Basal area excl. Overstorey&lt;br /&gt;
|-&lt;br /&gt;
| Basal area (overstorey)||m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;/ha||Basal area of overstorey trees (retention-, seed- and shelterwood trees)&lt;br /&gt;
|-&lt;br /&gt;
| Closure||unitless||Ratio between the volume of the forest, compared to the volume that would be optimal to harness the wood production potential of the site. In young stands, the number of main saplings is used instead of volume.&lt;br /&gt;
|-&lt;br /&gt;
| {{DgvLink}} ||cm ||Basal area weighted mean diameter of trees, excluding overstorey trees&lt;br /&gt;
|-&lt;br /&gt;
| {{DgvLink}}  Overstorey||cm ||Basal area weighted mean diameter of overstorey trees &lt;br /&gt;
|-&lt;br /&gt;
| {{HgvLink}}||m||Basal area weighted mean height for non-overstorey trees &lt;br /&gt;
|-&lt;br /&gt;
| {{HgvLink}} Overstorey||m||Basal area weighted mean height for overstorey trees (retention-, seed- and shelterwood trees)&lt;br /&gt;
|-&lt;br /&gt;
| Mean Height Main Saplings (arithmetic)||m||Arithmetic mean height for main saplings (calculated as weighted averaged using calculated crop tree probabibilites as weights)&lt;br /&gt;
|-&lt;br /&gt;
| Mean Height All Saplings (arithmetic)||m||Arithmetic mean height for all saplings&lt;br /&gt;
|-&lt;br /&gt;
| SI Management||H100 m||Site index for management to be used when calculating minimum final felling age (LSÅ)&lt;br /&gt;
|-&lt;br /&gt;
| Dominant Species||species||Regeneration species or species with largest basal area or stems&lt;br /&gt;
|-&lt;br /&gt;
| Dominant Height||m||Dominant height based on the 100 largest trees (with respect to tree diameter) per ha of dominant species&lt;br /&gt;
|-&lt;br /&gt;
| Dominant Height From {{DgvLink}}||m||Dominant height calculated with a function using Hgv as explantory variable (Björn Elfving)&lt;br /&gt;
|-&lt;br /&gt;
| Dominant Height From Trees||m||Dominant height calculated from tree list&lt;br /&gt;
|-&lt;br /&gt;
| Initial Min Final Felling Age||yr||Initial minimum final felling age (in year 0). &lt;br /&gt;
|-&lt;br /&gt;
| Min Final Felling Age||yr||Minimum final felling age. This can change over time if the next generation is regenerated with another species, or if climate models are applied (cf. SIS (projected) below).&lt;br /&gt;
|-&lt;br /&gt;
| Volume (incl. overstorey)||{{m3skLink}}||Volume (incl. overstorey)&lt;br /&gt;
|-&lt;br /&gt;
| Volume overstorey||{{m3skLink}}||Volume of overstorey trees (retention-, seed- and shelterwood trees)&lt;br /&gt;
|-&lt;br /&gt;
| Volume (excl. overstorey)||{{m3skLink}}||Volume (excl. overstorey)&lt;br /&gt;
|-&lt;br /&gt;
| Volume &amp;amp;ge; 8cm dbh (incl. overstorey)||{{m3skLink}}||Volume of trees &amp;amp;ge; 8 cm dbh (incl. overstorey)&lt;br /&gt;
|-&lt;br /&gt;
| Stems||stems/ha||Stem density (all trees)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;div id=&amp;quot;Regeneration Species&amp;quot;&amp;gt;Regeneration Species&amp;lt;/div&amp;gt;||[[Definition:SpeciesCode|SpeciesCode]]||Species for which the current rotation was regenerated (if even-aged management), or dominant species if regeneration species is unknown&lt;br /&gt;
|-&lt;br /&gt;
| Species Richness||species'||The number of unique species' within a treatment unit. Uncommon species' are often grouped into categories, as a result, this value will often be underestimated.&lt;br /&gt;
|-&lt;br /&gt;
| Waiting State||true/false||True if young stand that has not yet reach 2-3 meters height and is waiting to be activated. Interpolated state.&lt;br /&gt;
|-&lt;br /&gt;
| SIS (projected)||H100 m ||[[Variable:SiteIndex|Site index]] determined from site index factors, and adjusted for climate change if climate model is actived. &lt;br /&gt;
|-&lt;br /&gt;
| SIH (estimated)||H100 m ||see [[Variable:SiteIndexH (SIH)]]. Calculated with site index equations for height development of dominant trees. H100, for birch H50. &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Result Variables]]&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=ControlTable_Treatment_Program_Generator&amp;diff=11043</id>
		<title>ControlTable Treatment Program Generator</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=ControlTable_Treatment_Program_Generator&amp;diff=11043"/>
		<updated>2025-06-19T13:34:31Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: /* Treatment timing - Tactical planning */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Control Tables|Treatment Program Generator]]&lt;br /&gt;
[[Category:Reference Manual]]&lt;br /&gt;
Overview of parameters in control table Treatment Program Generator. This table is [[ControlTableDescription::available in PlanWise and StandWise and contains settings for how management programs are constructed]].&lt;br /&gt;
&lt;br /&gt;
Usage: see [http://heurekaslu.org/help/index.html?kontrolltabell_treatment_progr.htm Heureka online help documentation].&lt;br /&gt;
&lt;br /&gt;
== Treatment timing - General ==&lt;br /&gt;
Allows you to control how treatment programs are generated.&lt;br /&gt;
&lt;br /&gt;
====Management System====&lt;br /&gt;
:Type of management system to generate treatment programs for:&lt;br /&gt;
:'''EvenAged''' generates alternatives for even-aged management.&lt;br /&gt;
:'''Uneven-aged (CCF)''' generates alternatives for continuous cover management (also referred to as CCF, uneven-aged, selective felling, or selection harvesting).&lt;br /&gt;
:'''Unmanaged''' generates an alternative without any treatments.&lt;br /&gt;
&lt;br /&gt;
====Thinning Period Delay Max====&lt;br /&gt;
:Defines the number of periods, from a certain stand age, to vary the simulation of first thinning.&lt;br /&gt;
&lt;br /&gt;
====High Priority Thinning Criteria====&lt;br /&gt;
:If a stand is so dense that the thinning grade suggested by the thinning guide exceeds this value, then the thinning is not allowed to be postponed further.&lt;br /&gt;
&lt;br /&gt;
====Rotation Age Adjustment Factor====&lt;br /&gt;
:Rotation age adjustment factor. Lowest final felling age is multiplied with this factor. For example, factor 1.1 means that the miniumm rotation age allowed is increased by 10%.&lt;br /&gt;
&lt;br /&gt;
====Final Felling Period Min====&lt;br /&gt;
:Defines the minimum number of 5-year periods to postpone final felling after the corresponding lowest allowable stand age has been reached. &lt;br /&gt;
&lt;br /&gt;
====Final Felling Period Max====&lt;br /&gt;
:Defines the maximum number 5-year periods to postpone final felling after the corresponding lowest allowable stand age has been reached. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====Min Final Felling Contorta====&lt;br /&gt;
:There is not legal minimum felling age for contorta, but the program needs a recommended one in order to generate reasonable programs.&lt;br /&gt;
&lt;br /&gt;
====Min Final Felling Deciduous====&lt;br /&gt;
:The minimum final felling age is 35 years according to Swedish forestry regulations for deciduous forests (except for ash (50 yrs),  beech (80 yrs) and oak (90 yrs)). However, most users wish to apply longer rotations than 35 years.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Treatment timing - Strategic planning ==&lt;br /&gt;
====Always Cleaning====&lt;br /&gt;
:True: Only save programs that include cleanings, if cleaning is recommended according to Cleaning settings.&lt;br /&gt;
:False: Programs without cleanings are also saved, even if cleaning is possible/recommended according to Cleaning settings.&lt;br /&gt;
&lt;br /&gt;
====Always Thinning====&lt;br /&gt;
:True: If thinning is possible before a certain final felling period, then only programs with thinnings are saved, given that final felling period. &lt;br /&gt;
:False: Programs without thinnings are also saved, even if thinning is possible according to thinning guide.&lt;br /&gt;
&lt;br /&gt;
====Cleaning Period Delay Max====&lt;br /&gt;
:Defines the number of periods, from a certain stand age, to vary the simulation of cleaning. &lt;br /&gt;
 &lt;br /&gt;
====Max Number of Thinnings====&lt;br /&gt;
:Defines the maximum number of thinnings to be simulated in a treatment unit, in the same generation.&lt;br /&gt;
&lt;br /&gt;
====Min Years Between Thinning and Final Felling====&lt;br /&gt;
:Defines the minimum number of years years between thinning and final felling.&lt;br /&gt;
&lt;br /&gt;
====Min Years Between Two Thinnings====&lt;br /&gt;
:Defines the minimum number of years between thinnings simulated in a treatment unit.&lt;br /&gt;
&lt;br /&gt;
====Treatment Priority====&lt;br /&gt;
:Defines the order, by '''Prio1''', '''Prio2''', and '''Prio3''', in which treatments are to be generated in the alternative programs.&lt;br /&gt;
&lt;br /&gt;
==Treatment timing - Tactical planning==&lt;br /&gt;
Note that &amp;quot;tactical planning&amp;quot; is about much more than to generate stand management programs, but PlanWise support for tactical planning is limited to this. This mean the tactical TPG could be used for generating forest input data to some other (external) model for tactical planning, that takes into account for example road planning.&lt;br /&gt;
&lt;br /&gt;
====Include Final Felling====&lt;br /&gt;
If true, final felling is included if possible during the tactical planning horizon. If false, final felling is ignored as an option during the tactical horizon.&lt;br /&gt;
&lt;br /&gt;
====Include Thinning====&lt;br /&gt;
If true, thinning is included if possible during the tactical planning horizon. If false, thinning is ignored as an option during the tactical horizon.&lt;br /&gt;
&lt;br /&gt;
== Fertilization ==&lt;br /&gt;
Allows you to control if and how fertilization programs are generated.&lt;br /&gt;
&lt;br /&gt;
====FertilizationPolicy====&lt;br /&gt;
:Allows you to select the type of system to generate alternative programs (in treatment units where site and stand restricitions are met) according to:&lt;br /&gt;
:'''FP_NONE''' generates alternatives without any fertilization (default).&lt;br /&gt;
:'''FP_FIRSTTHIN''' generates alternatives with fertilization prior to first thinning.&lt;br /&gt;
:'''FP_FINALFELLING''' generates alternatives with fertilization prior to final felling.&lt;br /&gt;
:'''FP_FINALFELLING_TIMESTWO''' generates alternatives with two fertilizations, with a time interval of five years, prior to final felling.&lt;br /&gt;
:'''FP_LASTTHIN_AND_FINALFELLING''' generates alternatives with fertilization prior to last thinning and final felling.&lt;br /&gt;
:'''FP_EVERY_THIN''' generates alternatives with fertilization prior to all thinnings.&lt;br /&gt;
:'''FP_EVERY_HARVEST''' generates alternatives with fertilization prior to all harvests.&lt;br /&gt;
:'''FP_INTENSIVE''' generates alternatives with intensive fertilization, performed already in young stands and repeated with a certain time interval. ''Note that certain site restrictions must be met to allow for intensive fertilization.''&lt;br /&gt;
:'''FP_EVERY_TEN_YEARS''' generates fertilization every ten years, irrespective of occurence of harvesting.&lt;br /&gt;
&lt;br /&gt;
==Biofuel Extraction ==&lt;br /&gt;
Settings to determine if biofuel should extracted after an harvest operation.&lt;br /&gt;
&lt;br /&gt;
====FinalFelling==== &lt;br /&gt;
Set to true if biofuel should be extracted after final &lt;br /&gt;
&lt;br /&gt;
====Thinning==== &lt;br /&gt;
Set to true if biofuel should be extracted after thinning. &lt;br /&gt;
&lt;br /&gt;
====SelectionFelling====&lt;br /&gt;
Set to true if biofuel should be extracted after selection felling.&lt;br /&gt;
&lt;br /&gt;
==Treatment Proposals==&lt;br /&gt;
====Apply Proposals==== &lt;br /&gt;
:True: User-defined treatment proposals should be applied, if available. &lt;br /&gt;
:False: Ignore treatment proposals.&lt;br /&gt;
&lt;br /&gt;
====Override Min Final Felling Age==== &lt;br /&gt;
:True: Final felling proposals are always applied. &lt;br /&gt;
:False: If mean age calculated by Heureka is less than minimum final age then the final felling proposal is not applied.&lt;br /&gt;
&lt;br /&gt;
====Override Thinning Check==== &lt;br /&gt;
:True: Thinning proposals are always applied. &lt;br /&gt;
:False: If thinning is not applicable in the given period according to the condition used by Heureka then the thinning proposal is not applied.&lt;br /&gt;
&lt;br /&gt;
====Treatment Proposals Missing==== &lt;br /&gt;
Handling of stands that have no treatment proposals. &lt;br /&gt;
:'''NoActivity''': Do not apply any treatments during first 10 years to stands that have no proposals.&lt;br /&gt;
:'''LetPtgDecide''': Generate treatment programs according to control category settings.&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=ControlTable_Treatment_Program_Generator&amp;diff=11042</id>
		<title>ControlTable Treatment Program Generator</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=ControlTable_Treatment_Program_Generator&amp;diff=11042"/>
		<updated>2025-06-19T13:34:05Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: Undo revision 11041 by Osskyn (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Control Tables|Treatment Program Generator]]&lt;br /&gt;
[[Category:Reference Manual]]&lt;br /&gt;
Overview of parameters in control table Treatment Program Generator. This table is [[ControlTableDescription::available in PlanWise and StandWise and contains settings for how management programs are constructed]].&lt;br /&gt;
&lt;br /&gt;
Usage: see [http://heurekaslu.org/help/index.html?kontrolltabell_treatment_progr.htm Heureka online help documentation].&lt;br /&gt;
&lt;br /&gt;
== Treatment timing - General ==&lt;br /&gt;
Allows you to control how treatment programs are generated.&lt;br /&gt;
&lt;br /&gt;
====Management System====&lt;br /&gt;
:Type of management system to generate treatment programs for:&lt;br /&gt;
:'''EvenAged''' generates alternatives for even-aged management.&lt;br /&gt;
:'''Uneven-aged (CCF)''' generates alternatives for continuous cover management (also referred to as CCF, uneven-aged, selective felling, or selection harvesting).&lt;br /&gt;
:'''Unmanaged''' generates an alternative without any treatments.&lt;br /&gt;
&lt;br /&gt;
====Thinning Period Delay Max====&lt;br /&gt;
:Defines the number of periods, from a certain stand age, to vary the simulation of first thinning.&lt;br /&gt;
&lt;br /&gt;
====High Priority Thinning Criteria====&lt;br /&gt;
:If a stand is so dense that the thinning grade suggested by the thinning guide exceeds this value, then the thinning is not allowed to be postponed further.&lt;br /&gt;
&lt;br /&gt;
====Rotation Age Adjustment Factor====&lt;br /&gt;
:Rotation age adjustment factor. Lowest final felling age is multiplied with this factor. For example, factor 1.1 means that the miniumm rotation age allowed is increased by 10%.&lt;br /&gt;
&lt;br /&gt;
====Final Felling Period Min====&lt;br /&gt;
:Defines the minimum number of 5-year periods to postpone final felling after the corresponding lowest allowable stand age has been reached. &lt;br /&gt;
&lt;br /&gt;
====Final Felling Period Max====&lt;br /&gt;
:Defines the maximum number 5-year periods to postpone final felling after the corresponding lowest allowable stand age has been reached. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====Min Final Felling Contorta====&lt;br /&gt;
:There is not legal minimum felling age for contorta, but the program needs a recommended one in order to generate reasonable programs.&lt;br /&gt;
&lt;br /&gt;
====Min Final Felling Deciduous====&lt;br /&gt;
:The minimum final felling age is 35 years according to Swedish forestry regulations for deciduous forests (except for ash (50 yrs),  beech (80 yrs) and oak (90 yrs)). However, most users wish to apply longer rotations than 35 years.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Treatment timing - Strategic planning ==&lt;br /&gt;
====Always Cleaning====&lt;br /&gt;
:True: Only save programs that include cleanings, if cleaning is recommended according to Cleaning settings.&lt;br /&gt;
:False: Programs without cleanings are also saved, even if cleaning is possible/recommended according to Cleaning settings.&lt;br /&gt;
&lt;br /&gt;
====Always Thinning====&lt;br /&gt;
:True: If thinning is possible before a certain final felling period, then only programs with thinnings are saved, given that final felling period. &lt;br /&gt;
:False: Programs without thinnings are also saved, even if thinning is possible according to thinning guide.&lt;br /&gt;
&lt;br /&gt;
====Cleaning Period Delay Max====&lt;br /&gt;
:Defines the number of periods, from a certain stand age, to vary the simulation of cleaning. &lt;br /&gt;
 &lt;br /&gt;
====Max Number of Thinnings====&lt;br /&gt;
:Defines the maximum number of thinnings to be simulated in a treatment unit, in the same generation.&lt;br /&gt;
&lt;br /&gt;
====Min Years Between Thinning and Final Felling====&lt;br /&gt;
:Defines the minimum number of years years between thinning and final felling.&lt;br /&gt;
&lt;br /&gt;
====Min Years Between Two Thinnings====&lt;br /&gt;
:Defines the minimum number of years between thinnings simulated in a treatment unit.&lt;br /&gt;
&lt;br /&gt;
====Treatment Priority====&lt;br /&gt;
:Defines the order, by '''Prio1''', '''Prio2''', and '''Prio3''', in which treatments are to be generated in the alternative programs.&lt;br /&gt;
&lt;br /&gt;
==Treatment timing - Tactical planning==&lt;br /&gt;
Note that &amp;quot;tactical planning&amp;quot; is about much more than to generate stand management programs, but PlanWise support for tactical planning is limited to this. This mean the tactical TPG could be used for generating forest input data to some other (external) model for tactical planning, that takes into account for example road planning.&lt;br /&gt;
&lt;br /&gt;
====Include Final Felling====&lt;br /&gt;
If true, final felling is included if possible during the tactical planning horizon. If false, final felling is ignored as an option during the tactical horizon.&lt;br /&gt;
&lt;br /&gt;
====Include Thinning====&lt;br /&gt;
If true, thinning is included if possible during the tactical planning horizon. If false, thinning is ignored as an option during the tactical horizon.&lt;br /&gt;
&lt;br /&gt;
====Include Unmanaged====&lt;br /&gt;
If true, a program without harvesting during the tactical horizon is included. If false, all programs generated must include a harvest treatment during the tactical planning horizon.&lt;br /&gt;
&lt;br /&gt;
== Fertilization ==&lt;br /&gt;
Allows you to control if and how fertilization programs are generated.&lt;br /&gt;
&lt;br /&gt;
====FertilizationPolicy====&lt;br /&gt;
:Allows you to select the type of system to generate alternative programs (in treatment units where site and stand restricitions are met) according to:&lt;br /&gt;
:'''FP_NONE''' generates alternatives without any fertilization (default).&lt;br /&gt;
:'''FP_FIRSTTHIN''' generates alternatives with fertilization prior to first thinning.&lt;br /&gt;
:'''FP_FINALFELLING''' generates alternatives with fertilization prior to final felling.&lt;br /&gt;
:'''FP_FINALFELLING_TIMESTWO''' generates alternatives with two fertilizations, with a time interval of five years, prior to final felling.&lt;br /&gt;
:'''FP_LASTTHIN_AND_FINALFELLING''' generates alternatives with fertilization prior to last thinning and final felling.&lt;br /&gt;
:'''FP_EVERY_THIN''' generates alternatives with fertilization prior to all thinnings.&lt;br /&gt;
:'''FP_EVERY_HARVEST''' generates alternatives with fertilization prior to all harvests.&lt;br /&gt;
:'''FP_INTENSIVE''' generates alternatives with intensive fertilization, performed already in young stands and repeated with a certain time interval. ''Note that certain site restrictions must be met to allow for intensive fertilization.''&lt;br /&gt;
:'''FP_EVERY_TEN_YEARS''' generates fertilization every ten years, irrespective of occurence of harvesting.&lt;br /&gt;
&lt;br /&gt;
==Biofuel Extraction ==&lt;br /&gt;
Settings to determine if biofuel should extracted after an harvest operation.&lt;br /&gt;
&lt;br /&gt;
====FinalFelling==== &lt;br /&gt;
Set to true if biofuel should be extracted after final &lt;br /&gt;
&lt;br /&gt;
====Thinning==== &lt;br /&gt;
Set to true if biofuel should be extracted after thinning. &lt;br /&gt;
&lt;br /&gt;
====SelectionFelling====&lt;br /&gt;
Set to true if biofuel should be extracted after selection felling.&lt;br /&gt;
&lt;br /&gt;
==Treatment Proposals==&lt;br /&gt;
====Apply Proposals==== &lt;br /&gt;
:True: User-defined treatment proposals should be applied, if available. &lt;br /&gt;
:False: Ignore treatment proposals.&lt;br /&gt;
&lt;br /&gt;
====Override Min Final Felling Age==== &lt;br /&gt;
:True: Final felling proposals are always applied. &lt;br /&gt;
:False: If mean age calculated by Heureka is less than minimum final age then the final felling proposal is not applied.&lt;br /&gt;
&lt;br /&gt;
====Override Thinning Check==== &lt;br /&gt;
:True: Thinning proposals are always applied. &lt;br /&gt;
:False: If thinning is not applicable in the given period according to the condition used by Heureka then the thinning proposal is not applied.&lt;br /&gt;
&lt;br /&gt;
====Treatment Proposals Missing==== &lt;br /&gt;
Handling of stands that have no treatment proposals. &lt;br /&gt;
:'''NoActivity''': Do not apply any treatments during first 10 years to stands that have no proposals.&lt;br /&gt;
:'''LetPtgDecide''': Generate treatment programs according to control category settings.&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=ControlTable_Treatment_Program_Generator&amp;diff=11041</id>
		<title>ControlTable Treatment Program Generator</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=ControlTable_Treatment_Program_Generator&amp;diff=11041"/>
		<updated>2025-06-19T13:33:34Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: Removed &amp;quot;Unmanaged&amp;quot; from Management Systems since this is now removed from Heureka&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Control Tables|Treatment Program Generator]]&lt;br /&gt;
[[Category:Reference Manual]]&lt;br /&gt;
Overview of parameters in control table Treatment Program Generator. This table is [[ControlTableDescription::available in PlanWise and StandWise and contains settings for how management programs are constructed]].&lt;br /&gt;
&lt;br /&gt;
Usage: see [http://heurekaslu.org/help/index.html?kontrolltabell_treatment_progr.htm Heureka online help documentation].&lt;br /&gt;
&lt;br /&gt;
== Treatment timing - General ==&lt;br /&gt;
Allows you to control how treatment programs are generated.&lt;br /&gt;
&lt;br /&gt;
====Management System====&lt;br /&gt;
:Type of management system to generate treatment programs for:&lt;br /&gt;
:'''EvenAged''' generates alternatives for even-aged management.&lt;br /&gt;
:'''Uneven-aged (CCF)''' generates alternatives for continuous cover management (also referred to as CCF, uneven-aged, selective felling, or selection harvesting).&lt;br /&gt;
&lt;br /&gt;
====Thinning Period Delay Max====&lt;br /&gt;
:Defines the number of periods, from a certain stand age, to vary the simulation of first thinning.&lt;br /&gt;
&lt;br /&gt;
====High Priority Thinning Criteria====&lt;br /&gt;
:If a stand is so dense that the thinning grade suggested by the thinning guide exceeds this value, then the thinning is not allowed to be postponed further.&lt;br /&gt;
&lt;br /&gt;
====Rotation Age Adjustment Factor====&lt;br /&gt;
:Rotation age adjustment factor. Lowest final felling age is multiplied with this factor. For example, factor 1.1 means that the miniumm rotation age allowed is increased by 10%.&lt;br /&gt;
&lt;br /&gt;
====Final Felling Period Min====&lt;br /&gt;
:Defines the minimum number of 5-year periods to postpone final felling after the corresponding lowest allowable stand age has been reached. &lt;br /&gt;
&lt;br /&gt;
====Final Felling Period Max====&lt;br /&gt;
:Defines the maximum number 5-year periods to postpone final felling after the corresponding lowest allowable stand age has been reached. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====Min Final Felling Contorta====&lt;br /&gt;
:There is not legal minimum felling age for contorta, but the program needs a recommended one in order to generate reasonable programs.&lt;br /&gt;
&lt;br /&gt;
====Min Final Felling Deciduous====&lt;br /&gt;
:The minimum final felling age is 35 years according to Swedish forestry regulations for deciduous forests (except for ash (50 yrs),  beech (80 yrs) and oak (90 yrs)). However, most users wish to apply longer rotations than 35 years.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Treatment timing - Strategic planning ==&lt;br /&gt;
====Always Cleaning====&lt;br /&gt;
:True: Only save programs that include cleanings, if cleaning is recommended according to Cleaning settings.&lt;br /&gt;
:False: Programs without cleanings are also saved, even if cleaning is possible/recommended according to Cleaning settings.&lt;br /&gt;
&lt;br /&gt;
====Always Thinning====&lt;br /&gt;
:True: If thinning is possible before a certain final felling period, then only programs with thinnings are saved, given that final felling period. &lt;br /&gt;
:False: Programs without thinnings are also saved, even if thinning is possible according to thinning guide.&lt;br /&gt;
&lt;br /&gt;
====Cleaning Period Delay Max====&lt;br /&gt;
:Defines the number of periods, from a certain stand age, to vary the simulation of cleaning. &lt;br /&gt;
 &lt;br /&gt;
====Max Number of Thinnings====&lt;br /&gt;
:Defines the maximum number of thinnings to be simulated in a treatment unit, in the same generation.&lt;br /&gt;
&lt;br /&gt;
====Min Years Between Thinning and Final Felling====&lt;br /&gt;
:Defines the minimum number of years years between thinning and final felling.&lt;br /&gt;
&lt;br /&gt;
====Min Years Between Two Thinnings====&lt;br /&gt;
:Defines the minimum number of years between thinnings simulated in a treatment unit.&lt;br /&gt;
&lt;br /&gt;
====Treatment Priority====&lt;br /&gt;
:Defines the order, by '''Prio1''', '''Prio2''', and '''Prio3''', in which treatments are to be generated in the alternative programs.&lt;br /&gt;
&lt;br /&gt;
==Treatment timing - Tactical planning==&lt;br /&gt;
Note that &amp;quot;tactical planning&amp;quot; is about much more than to generate stand management programs, but PlanWise support for tactical planning is limited to this. This mean the tactical TPG could be used for generating forest input data to some other (external) model for tactical planning, that takes into account for example road planning.&lt;br /&gt;
&lt;br /&gt;
====Include Final Felling====&lt;br /&gt;
If true, final felling is included if possible during the tactical planning horizon. If false, final felling is ignored as an option during the tactical horizon.&lt;br /&gt;
&lt;br /&gt;
====Include Thinning====&lt;br /&gt;
If true, thinning is included if possible during the tactical planning horizon. If false, thinning is ignored as an option during the tactical horizon.&lt;br /&gt;
&lt;br /&gt;
====Include Unmanaged====&lt;br /&gt;
If true, a program without harvesting during the tactical horizon is included. If false, all programs generated must include a harvest treatment during the tactical planning horizon.&lt;br /&gt;
&lt;br /&gt;
== Fertilization ==&lt;br /&gt;
Allows you to control if and how fertilization programs are generated.&lt;br /&gt;
&lt;br /&gt;
====FertilizationPolicy====&lt;br /&gt;
:Allows you to select the type of system to generate alternative programs (in treatment units where site and stand restricitions are met) according to:&lt;br /&gt;
:'''FP_NONE''' generates alternatives without any fertilization (default).&lt;br /&gt;
:'''FP_FIRSTTHIN''' generates alternatives with fertilization prior to first thinning.&lt;br /&gt;
:'''FP_FINALFELLING''' generates alternatives with fertilization prior to final felling.&lt;br /&gt;
:'''FP_FINALFELLING_TIMESTWO''' generates alternatives with two fertilizations, with a time interval of five years, prior to final felling.&lt;br /&gt;
:'''FP_LASTTHIN_AND_FINALFELLING''' generates alternatives with fertilization prior to last thinning and final felling.&lt;br /&gt;
:'''FP_EVERY_THIN''' generates alternatives with fertilization prior to all thinnings.&lt;br /&gt;
:'''FP_EVERY_HARVEST''' generates alternatives with fertilization prior to all harvests.&lt;br /&gt;
:'''FP_INTENSIVE''' generates alternatives with intensive fertilization, performed already in young stands and repeated with a certain time interval. ''Note that certain site restrictions must be met to allow for intensive fertilization.''&lt;br /&gt;
:'''FP_EVERY_TEN_YEARS''' generates fertilization every ten years, irrespective of occurence of harvesting.&lt;br /&gt;
&lt;br /&gt;
==Biofuel Extraction ==&lt;br /&gt;
Settings to determine if biofuel should extracted after an harvest operation.&lt;br /&gt;
&lt;br /&gt;
====FinalFelling==== &lt;br /&gt;
Set to true if biofuel should be extracted after final &lt;br /&gt;
&lt;br /&gt;
====Thinning==== &lt;br /&gt;
Set to true if biofuel should be extracted after thinning. &lt;br /&gt;
&lt;br /&gt;
====SelectionFelling====&lt;br /&gt;
Set to true if biofuel should be extracted after selection felling.&lt;br /&gt;
&lt;br /&gt;
==Treatment Proposals==&lt;br /&gt;
====Apply Proposals==== &lt;br /&gt;
:True: User-defined treatment proposals should be applied, if available. &lt;br /&gt;
:False: Ignore treatment proposals.&lt;br /&gt;
&lt;br /&gt;
====Override Min Final Felling Age==== &lt;br /&gt;
:True: Final felling proposals are always applied. &lt;br /&gt;
:False: If mean age calculated by Heureka is less than minimum final age then the final felling proposal is not applied.&lt;br /&gt;
&lt;br /&gt;
====Override Thinning Check==== &lt;br /&gt;
:True: Thinning proposals are always applied. &lt;br /&gt;
:False: If thinning is not applicable in the given period according to the condition used by Heureka then the thinning proposal is not applied.&lt;br /&gt;
&lt;br /&gt;
====Treatment Proposals Missing==== &lt;br /&gt;
Handling of stands that have no treatment proposals. &lt;br /&gt;
:'''NoActivity''': Do not apply any treatments during first 10 years to stands that have no proposals.&lt;br /&gt;
:'''LetPtgDecide''': Generate treatment programs according to control category settings.&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Heureka_Wiki&amp;diff=11017</id>
		<title>Heureka Wiki</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Heureka_Wiki&amp;diff=11017"/>
		<updated>2024-11-26T13:00:58Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ __NOEDITSECTION__&lt;br /&gt;
{{Languages|Heureka Wiki}}&lt;br /&gt;
{|width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;vertical-align: top; border-right: 2em solid white; &amp;quot;|&lt;br /&gt;
{{Heureka Wiki:About}}&lt;br /&gt;
&lt;br /&gt;
==Heureka Forestry DSS==&lt;br /&gt;
{{:Intro}}&lt;br /&gt;
&lt;br /&gt;
[[About Heureka | More about Heureka and its features...]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
More info will come soon!&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
== Get Started ==&lt;br /&gt;
{{:Get_Started}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right; &amp;quot;&amp;gt;&lt;br /&gt;
{{#ask:[[Newsdate::+]] |&lt;br /&gt;
 sort=newsdate|&lt;br /&gt;
 order=desc|&lt;br /&gt;
 format=rss|&lt;br /&gt;
 searchlabel= RSS|&lt;br /&gt;
 rsstitle=Heureka MediaWiki|&lt;br /&gt;
 rssdescription=News from Heureka&lt;br /&gt;
}}[[Image:Feed_icon.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== News ==&lt;br /&gt;
{{#ask:[[Category:News]] [[newsdate::+]]|&lt;br /&gt;
 ?newsdate=|&lt;br /&gt;
 sort=newsdate|&lt;br /&gt;
 order=desc|&lt;br /&gt;
 limit=3|&lt;br /&gt;
 format=template|&lt;br /&gt;
 template=news list|&lt;br /&gt;
 searchlabel= &amp;lt;br /&amp;gt;older news &amp;amp;hellip;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#ask:[[Newsdate::+]] |&lt;br /&gt;
 sort=newsdate|&lt;br /&gt;
 order=desc|&lt;br /&gt;
 format=rss|&lt;br /&gt;
 searchlabel= RSS|&lt;br /&gt;
 rsstitle=Heureka MediaWiki|&lt;br /&gt;
 rssdescription=Calender for Heureka&lt;br /&gt;
}}[[Image:Feed_icon.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Calendar ==&lt;br /&gt;
{{#ask:[[Category:Calendar]] [[calendardate::&amp;gt;{{CURRENTYEAR}}-{{CURRENTMONTH}}-{{CURRENTDAY}}]]|&lt;br /&gt;
 ?calendardate=|&lt;br /&gt;
 sort=calendardate|&lt;br /&gt;
 order=asc|&lt;br /&gt;
 limit=5|&lt;br /&gt;
 default=none|&lt;br /&gt;
 format=template|&lt;br /&gt;
 template=news list|&lt;br /&gt;
 searchlabel= &amp;lt;br /&amp;gt;all activities (including past) &amp;amp;hellip;&lt;br /&gt;
}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #F7F7F7; border: 1px solid #999999; padding: 1em; &amp;quot;&amp;gt;&lt;br /&gt;
==Disclaimer==&lt;br /&gt;
SLU can not be held responsible for any errors in the software. Please read the license agreement: [[Heureka_EULA|Heureka EULA]]!&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Category:Plugins&amp;diff=11015</id>
		<title>Category:Plugins</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Category:Plugins&amp;diff=11015"/>
		<updated>2024-11-26T12:50:47Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Reference Manual]]&lt;br /&gt;
It is possible to replace some of Heureka's built-in functions with your own plugins. You need to program such functions in C#. When you have built a plugin-function, you can place it in My Documents &amp;gt; Heureka &amp;gt; Common &amp;gt; Plugins-folder. After that, when you start a Heureka application (StandWise, PlanWise or RegWise), the program will scan this folder for functions that implements a certain so called interface. For example, if there is a plugin (dll) that implements the cost function interface, it will be imported to the application in run-time, and be available as an option the control tables interface. &lt;br /&gt;
&lt;br /&gt;
Plugins are available for the following models:&lt;br /&gt;
&lt;br /&gt;
*Single-tree growth &lt;br /&gt;
*Stand-level growth&lt;br /&gt;
*Sapling growth &lt;br /&gt;
*Tree volume &lt;br /&gt;
*Tree height &lt;br /&gt;
*Tree height growth &lt;br /&gt;
*Bark thickness &lt;br /&gt;
*Mortality&lt;br /&gt;
*Age to breast height&lt;br /&gt;
*Forwarder and harvester cost (time consumption)&lt;br /&gt;
*Optimization solvers&lt;br /&gt;
&lt;br /&gt;
==Writing plugins for Heureka==&lt;br /&gt;
The easiest way to start writing a plugin is to use a template that we provide as a starting point [https://www.heurekaslu.se/FilerepositoryDev PluginTemplateProject.zip]. Either open the included project in Visual Studio 2015 or later, or start a new project and include only the required templates. All templates need a reference to 'Slu.Heureka.BaseLayer.dll' and to 'Slu.Heureka.DomainLayer.dll'. This library can be found with all installations of Heureka in the root of the installation directory.&lt;br /&gt;
&lt;br /&gt;
Comments in the templates will tell you what Heureka expects as a return value from the functions. If a plugin needs to read settings that the user has made to, for example, the ProductionModel control table, Heureka will supply this to the plugin constructor if it finds a matching constructor that accepts a single ProductionModelControlTable as an argument. Otherwise the parameterless constructor will be used. At least one of these two constructors MUST be available.&lt;br /&gt;
&lt;br /&gt;
If you want to supply custom arguments to the time consumption model, you can use the property CustomFunctionParameters, which is similar to a C# dictionary consisting of key-value pairs, see below. &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''IMPORTANT''' Plugins must have a unique Name string among plugins of the same type. Heureka uses the name to identify which plugin is currently selected.&lt;br /&gt;
&lt;br /&gt;
After building the template project, the plugin .dll files are copied to the solution directory.&lt;br /&gt;
&lt;br /&gt;
==Custom cost functions ==&lt;br /&gt;
Creating plugins for cost functions is done a bit differently. There is a plugin interface, but it is not really intended for implementing from scratch. Instead, you should either create a class that derives from *Slu.Heureka.DomainLayer.ValueModel.CostCalculatorSkogforskAdvanced, or &lt;br /&gt;
*Slu.Heureka.DomainLayer.ValueModel.CostCalculatorSkogforskSimple, or from the abstract class&lt;br /&gt;
*Slu.Heureka.DomainLayer.ValueModel.CostCalculatorBase (which the two above derive from).&lt;br /&gt;
&lt;br /&gt;
Each of these implements IPlugin, so you do not have to worry about anything but overriding for example CostCalculatorSkogforskAdvanced properly. Below is a dummy dode example to calculate cost for a imagined cable logging system.&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:70%&amp;quot; data-expandtext=&amp;quot;Show code&amp;quot; data-collapsetext=&amp;quot;Hide&amp;quot;&amp;gt;&lt;br /&gt;
Code example for harvester and forwarder cost function&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt; &lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using Slu.Heureka;&lt;br /&gt;
using Slu.Heureka.BaseLayer;&lt;br /&gt;
using Slu.Heureka.BaseLayer.ConfigurationHandling;&lt;br /&gt;
using Slu.Heureka.DomainLayer.CommonForestModels;&lt;br /&gt;
using Slu.Heureka.DomainLayer.Forest;&lt;br /&gt;
using Slu.Heureka.DomainLayer.TreatmentModel;&lt;br /&gt;
using Slu.Heureka.DomainLayer.ValueModel;&lt;br /&gt;
&lt;br /&gt;
namespace MyCostFunctions&lt;br /&gt;
{&lt;br /&gt;
    public class MyLoggingCostFunction : CostCalculatorSkogforskAdvanced&lt;br /&gt;
    {&lt;br /&gt;
        private double _area;&lt;br /&gt;
        private double _ayd;&lt;br /&gt;
        private GenericPropertyArray&amp;lt;double&amp;gt; _functionParameters = new GenericPropertyArray&amp;lt;double&amp;gt;(&amp;quot;CableLoggingCoeffs&amp;quot;,&lt;br /&gt;
            propertyLabel:new string[]&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;A&amp;quot;,&amp;quot;B&amp;quot;,&amp;quot;SystemUtilization&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            values:new double[] {0.25d, 3.0d, 0.9d},&lt;br /&gt;
            defaultValues:new double[] { 0.25d, 3.0d, 0.9d },&lt;br /&gt;
            descriptions:new string[] {&amp;quot;Param A (min/tree)&amp;quot;,&lt;br /&gt;
                &amp;quot;Param B (min/m3)&amp;quot;,&lt;br /&gt;
                &amp;quot;Utilization degree expressed as proportion&amp;quot;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
               /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Empty constructor required for IPlugin handler&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public MyLoggingCostFunction () { }&lt;br /&gt;
&lt;br /&gt;
        public MyLoggingCostFunction (IControlCategory cc) : base(cc)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        public override string Name { get { return &amp;quot;MyLoggingCostFunction1&amp;quot;; } }&lt;br /&gt;
&lt;br /&gt;
        public override GenericPropertyArray&amp;lt;double&amp;gt; CustomFunctionParameters&lt;br /&gt;
        {&lt;br /&gt;
            get { return _functionParameters; }&lt;br /&gt;
            set { _functionParameters = value; }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Initializes data needed by the models&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;tUnit&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;period&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;treatment&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;results&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;value&amp;quot;&amp;gt;Felling value&amp;lt;/param&amp;gt;&lt;br /&gt;
        protected override void Initialize(TreatmentUnit tUnit, int period, Treatment treatment, IList&amp;lt;Result&amp;gt; results, FellingValue value)&lt;br /&gt;
        {&lt;br /&gt;
            base.Initialize(tUnit, period, treatment, results, value);&lt;br /&gt;
            int periodIndex = period == 0 ? 0 : period - tUnit.StartPeriod;&lt;br /&gt;
            object[] treatmentInfo = (object[])results[periodIndex].Treatment(typeof(TreatmentData));&lt;br /&gt;
            int index = FindFirstCuttingTreatment(treatmentInfo);&lt;br /&gt;
            CalculateBasicVariables((TreatmentData)treatmentInfo[index], value);&lt;br /&gt;
            &lt;br /&gt;
            if (Configuration.CustomHarvesterCostParameters != null &amp;amp;&amp;amp;&lt;br /&gt;
               _functionParameters.Label == Configuration.CustomHarvesterCostParameters.Label)&lt;br /&gt;
            {&lt;br /&gt;
                _functionParameters = Configuration.CustomHarvesterCostParameters;  &lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        protected override double ForwarderCostFinalFelling()&lt;br /&gt;
        {&lt;br /&gt;
            return 0;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        protected override double HarvesterCostFinalFelling()&lt;br /&gt;
        {&lt;br /&gt;
            // No cable logging required: use ordinaary function&lt;br /&gt;
            if (Slope &amp;lt; SlopeType.ThirtyThreeToFifty)&lt;br /&gt;
                return base.HarvesterCostFinalFelling();&lt;br /&gt;
&lt;br /&gt;
            // Add some code for calulating the cost...&lt;br /&gt;
            // var cost = ... _functionParameters[&amp;quot;B&amp;quot;]*AverageVolumeOfFelledTrees ...&lt;br /&gt;
&lt;br /&gt;
            return _functionParameters[&amp;quot;SystemUtilization&amp;quot;] &amp;gt; 0 ? cost / _functionParameters[&amp;quot;SystemUtilization&amp;quot;] : cost;&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
There are specific functions for different treatments. The plugin interface (ICostCalculator) provided will probably be quite daunting to implement, and a better option is most likely to create a plugin that derives from Heureka's CostCalculatorBase (see below), if you wish to supply custom functions for for example precommercial thinning (cleaning). To add custom functions only for harvesting and forwarding, considered deriving from class SkogforskAdvanced.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
====ICostCalculator interface====&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:70%&amp;quot; data-expandtext=&amp;quot;Show code&amp;quot; data-collapsetext=&amp;quot;Hide&amp;quot;&amp;gt;&lt;br /&gt;
CostCalculatorTemplate code&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using Slu.Heureka.BaseLayer;&lt;br /&gt;
using Slu.Heureka.DomainLayer.Forest;&lt;br /&gt;
using Slu.Heureka.DomainLayer.ValueModel;&lt;br /&gt;
 public class CostCalculatorTemplate : ICostCalculator&lt;br /&gt;
    {&lt;br /&gt;
        //Include this constructor with this signature if the plugin needs to read settings from the control category.&lt;br /&gt;
        //If present, this constructor will be used. Otherwise, the empty constructor will be used.&lt;br /&gt;
        //public CostCalculatorTemplate(IControlCategory controlCategory)&lt;br /&gt;
        //{}&lt;br /&gt;
&lt;br /&gt;
        public CostCalculatorTemplate()&lt;br /&gt;
        {&lt;br /&gt;
            //Empty constructor required for plugins&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Get the display name of this plugin&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public string Name { get { return &amp;quot;Cost Calculator Template&amp;quot;;  } }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Calculates the cost of a treatment.&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;tUnit&amp;quot;&amp;gt;Treatment unit that has been treated&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;period&amp;quot;&amp;gt;Period to calculate cost for&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;treatment&amp;quot;&amp;gt;Treatment that has been applied&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;results&amp;quot;&amp;gt;Existing results for treatment unit&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;value&amp;quot;&amp;gt;Felling value&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;returns&amp;gt;Cost of treatment&amp;lt;/returns&amp;gt;&lt;br /&gt;
        public Cost CalculateCost(TreatmentUnit tUnit, int period, Treatment treatment, IList&amp;lt;Result&amp;gt; results, FellingValue value)&lt;br /&gt;
        {&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Optional parameters, displayed in the Cost Control Table&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public GenericPropertyArray&amp;lt;double&amp;gt; CustomFunctionParameters { get { return null; } set {} }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====CostCalculatorBase====&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:70%&amp;quot; data-expandtext=&amp;quot;Show code&amp;quot; data-collapsetext=&amp;quot;Hide&amp;quot;&amp;gt;&lt;br /&gt;
CostCalculatorBase code&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using Slu.Heureka.BaseLayer;&lt;br /&gt;
using Slu.Heureka.BaseLayer.ConfigurationHandling;&lt;br /&gt;
using Slu.Heureka.DomainLayer.CommonForestModels;&lt;br /&gt;
using Slu.Heureka.DomainLayer.Recreation;&lt;br /&gt;
using Slu.Heureka.DomainLayer.TreatmentModel;&lt;br /&gt;
using Slu.Heureka.DomainLayer.Forest;&lt;br /&gt;
using Slu.Heureka.DomainLayer.TreatmentModel.Thinning;&lt;br /&gt;
&lt;br /&gt;
namespace Slu.Heureka.DomainLayer.ValueModel&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// Provides a base class for CostCalculator classes&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    public class CostCalculatorBase : ICostCalculator&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        Treatment _treatment;&lt;br /&gt;
        int _period;&lt;br /&gt;
        private TreatmentUnit _treatmentUnit;&lt;br /&gt;
        private CostControlTable _configuration;&lt;br /&gt;
        private readonly RecreationControlTable _recreationControlTable;&lt;br /&gt;
        private readonly TreatmentModelControlTable _treatmentModelControlTable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        private double _extractedHarvestResidueMass;&lt;br /&gt;
        private double _harvestedStumps;&lt;br /&gt;
        SoilMoistureType _soilMoistType;&lt;br /&gt;
        private SlopeType _slope;&lt;br /&gt;
        private SlopeType _terrainRoadSlope;&lt;br /&gt;
        private double _terrainTransportDistance;&lt;br /&gt;
        private SurfaceType _surface;&lt;br /&gt;
&lt;br /&gt;
        protected SoilMoistureType SoilMoistType&lt;br /&gt;
        {&lt;br /&gt;
            get { return _soilMoistType; }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        protected TreatmentUnit TreatmentUnit&lt;br /&gt;
        {&lt;br /&gt;
            get { return _treatmentUnit; }&lt;br /&gt;
        }&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Gets the treatment cost is calculated for&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        protected Treatment Treatment&lt;br /&gt;
        {&lt;br /&gt;
            get { return _treatment; }&lt;br /&gt;
            set { _treatment = value; }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        ///// &amp;lt;summary&amp;gt;&lt;br /&gt;
        ///// Gets cost control table&lt;br /&gt;
        ///// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        //protected CostControlTable configuration&lt;br /&gt;
        //{&lt;br /&gt;
        //    get { return Configuration; }&lt;br /&gt;
        //}&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Within stand slope &lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        protected SlopeType Slope&lt;br /&gt;
        {&lt;br /&gt;
            get { return _slope; }&lt;br /&gt;
            set { _slope = value; }&lt;br /&gt;
        }&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Average slope in the terrain road (may include slope of neighboring stands that the forwarder must drive through)&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        protected SlopeType TerrainRoadSlope&lt;br /&gt;
        {&lt;br /&gt;
            get { return _terrainRoadSlope; }&lt;br /&gt;
            set { _terrainRoadSlope = value; }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        protected double TerrainTransportDistance&lt;br /&gt;
        {&lt;br /&gt;
            get { return _terrainTransportDistance; }&lt;br /&gt;
            set { _terrainTransportDistance = value; }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        protected SurfaceType Surface&lt;br /&gt;
        {&lt;br /&gt;
            get { return _surface; }&lt;br /&gt;
            set { _surface = value; }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        protected CostControlTable Configuration&lt;br /&gt;
        {&lt;br /&gt;
            get { return _configuration; }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        protected RecreationControlTable RecreationControlTable&lt;br /&gt;
        {&lt;br /&gt;
            get { return _recreationControlTable; }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        protected TreatmentModelControlTable TreatmentModelControlTable&lt;br /&gt;
        {&lt;br /&gt;
            get { return _treatmentModelControlTable; }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        public double ExtractedHarvestResidueMass&lt;br /&gt;
        {&lt;br /&gt;
            get { return _extractedHarvestResidueMass; }&lt;br /&gt;
            set { _extractedHarvestResidueMass = value; }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        public double HarvestedStumps&lt;br /&gt;
        {&lt;br /&gt;
            get { return _harvestedStumps; }&lt;br /&gt;
            set { _harvestedStumps = value; }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Represents a base class for CostCalculator classes&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;us&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        internal CostCalculatorBase(IControlCategory us)&lt;br /&gt;
        {&lt;br /&gt;
            _configuration = (CostControlTable)us.GetControlTable(typeof(CostControlTable));&lt;br /&gt;
            if (Configuration == null)&lt;br /&gt;
                throw new ArgumentException(&amp;quot;Configuration for Cost has not been initialized&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            _recreationControlTable = (Recreation.RecreationControlTable)us.GetControlTable(typeof(Recreation.RecreationControlTable));&lt;br /&gt;
            if (RecreationControlTable == null)&lt;br /&gt;
                throw new ArgumentException(&amp;quot;Configuration for Recreation has not been initialized&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            _treatmentModelControlTable = (TreatmentModelControlTable)us.GetControlTable(typeof(TreatmentModelControlTable));&lt;br /&gt;
            if (TreatmentModelControlTable == null)&lt;br /&gt;
                throw new ArgumentException(&amp;quot;Configuration for TreatmentModel has not been initialized&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// To enable alternative constructor for tests of derived class&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        protected CostCalculatorBase()&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Gets cost of extracting harvest residues after thinning&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;
        protected virtual double HarvestResidueExtractionCostThinning()&lt;br /&gt;
        {&lt;br /&gt;
            if (Treatment.CuttingDetails.HarvestResiduesExtracted)&lt;br /&gt;
                //return configuration.HarvestResidueThinningCost * _extractedHarvestResidueMass;&lt;br /&gt;
                return ExtractedHarvestResidueMass *&lt;br /&gt;
                   (Configuration.HarvestResidueExtractionCostThinning.A0 +&lt;br /&gt;
                    Configuration.HarvestResidueExtractionCostThinning.A1 * _terrainTransportDistance); // Do not adjust for cost trend factor here, only adjust in methods of type Cost&lt;br /&gt;
            return 0.0;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Gets cost of extracting harvest residues after final felling&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;
        protected virtual double HarvestResidueExtractionFinalFelling()&lt;br /&gt;
        {&lt;br /&gt;
            if (Treatment.CuttingDetails.HarvestResiduesExtracted)&lt;br /&gt;
                //return configuration.HarvestResidueFinalFellingCost * _extractedHarvestResidueMass;&lt;br /&gt;
                return ExtractedHarvestResidueMass *&lt;br /&gt;
                       (Configuration.HarvestResidueExtractionCostFinalFelling.A0 +&lt;br /&gt;
                        Configuration.HarvestResidueExtractionCostFinalFelling.A1 * _terrainTransportDistance); // Do not adjust for cost trend factor here, only adjust in methods of type Cost&lt;br /&gt;
            return 0.0;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Gets cost of extracting stumps&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;
        protected virtual double StumpExtractionCost()&lt;br /&gt;
        {&lt;br /&gt;
            if (Treatment.CuttingDetails.HarvestResiduesExtracted)&lt;br /&gt;
                return HarvestedStumps *&lt;br /&gt;
                       (Configuration.StumpHarvestCostCoefficients.A0 +&lt;br /&gt;
                        Configuration.StumpHarvestCostCoefficients.A1 * _terrainTransportDistance); // Do not adjust for cost trend factor here, only adjust in methods of type Cost&lt;br /&gt;
            return 0.0;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Calulates cost of planting.&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;returns&amp;gt;Cost of planting, SEK/ha&amp;lt;/returns&amp;gt;&lt;br /&gt;
        protected virtual Cost PlantingCost()&lt;br /&gt;
        {&lt;br /&gt;
            double treatedArea = _treatment.TreatedArea.HasValue ? _treatment.TreatedArea.Value : 1.0;&lt;br /&gt;
            double corrFactor = Configuration.TreatmentCostTrend[TreatmentCostTrendType.Planting, TreatmentYear];&lt;br /&gt;
&lt;br /&gt;
            // Number of plants not known or price per sapling is not known&lt;br /&gt;
            SpeciesGroupCode plantedSpecies = Treatment.RegenerationDetails.SpeciesGroup;&lt;br /&gt;
            if (Treatment.RegenerationDetails == null || Treatment.RegenerationDetails.NumberOfSaplings &amp;lt;= double.Epsilon || Configuration.SaplingCostPlant[plantedSpecies] &amp;lt;= double.Epsilon)&lt;br /&gt;
                return new Cost(Configuration.PlantCostArea * corrFactor * treatedArea);&lt;br /&gt;
&lt;br /&gt;
            double c = Treatment.RegenerationDetails.NumberOfSaplings * Configuration.SaplingCostPlant[plantedSpecies] * corrFactor * treatedArea;&lt;br /&gt;
            return new Cost(c);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Calculates cost of fertilization.&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;returns&amp;gt;Cost of fertilization, SEK/ha&amp;lt;/returns&amp;gt;&lt;br /&gt;
        protected virtual Cost FertilizationCost()&lt;br /&gt;
        {&lt;br /&gt;
            if (_treatment.FertilizationDetails.Intensive)&lt;br /&gt;
                return new Cost(Configuration.IntensiveFertilizationCostArea);&lt;br /&gt;
&lt;br /&gt;
            if (_treatmentUnit.PredictionUnits.Count == 0)&lt;br /&gt;
                return new Cost(0.0);&lt;br /&gt;
&lt;br /&gt;
            double treatedArea = _treatment.TreatedArea.HasValue ? _treatment.TreatedArea.Value : 1.0;&lt;br /&gt;
&lt;br /&gt;
            double cost = treatedArea *&lt;br /&gt;
                          (Configuration.FertilizationFixedCost +&lt;br /&gt;
                           TreatmentModelControlTable.FertilizerAmount *&lt;br /&gt;
                           Configuration.FertilizerUnitCost) *&lt;br /&gt;
                          Configuration.TreatmentCostTrend[TreatmentCostTrendType.Fertilization, TreatmentYear];&lt;br /&gt;
&lt;br /&gt;
            return new Cost(cost);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        protected double TreatmentYear&lt;br /&gt;
        {&lt;br /&gt;
            get { return _treatmentUnit.GetYear(_period) + Treatment.YearOffset; }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Calculates cost of burning&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;returns&amp;gt;Cost of burning, SEK/ha&amp;lt;/returns&amp;gt;&lt;br /&gt;
        protected virtual Cost BurningCost()&lt;br /&gt;
        {&lt;br /&gt;
            return new Cost(Configuration.BurningCost * Configuration.TreatmentCostTrend[TreatmentCostTrendType.Burning, TreatmentYear]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Calculates cost of ground preparation&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;returns&amp;gt;Cost of ground preparation, SEK/ha&amp;lt;/returns&amp;gt;&lt;br /&gt;
        protected virtual Cost PreparationCost()&lt;br /&gt;
        {&lt;br /&gt;
            double treatedArea = _treatment.TreatedArea.HasValue ? _treatment.TreatedArea.Value : 1.0;&lt;br /&gt;
            return new Cost(Configuration.PreparationCost * Configuration.TreatmentCostTrend[TreatmentCostTrendType.SoilPreparation, TreatmentYear] * treatedArea);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Gets cost of sowing&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;
        protected virtual Cost SowingCost()&lt;br /&gt;
        {&lt;br /&gt;
            return new Cost(Configuration.SeedCostArea * Configuration.TreatmentCostTrend[TreatmentCostTrendType.Sowing, TreatmentYear]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Retrieves forwarder capacity for thinning&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;thinNumber&amp;quot;&amp;gt;Thinning number&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;returns&amp;gt;capacity in ton&amp;lt;/returns&amp;gt;&lt;br /&gt;
        protected virtual double GetForwarderCapacityThinning(ThinningNumber thinNumber)&lt;br /&gt;
        {&lt;br /&gt;
            return thinNumber == ThinningNumber.First ? Configuration.FirstThinningCapacity : Configuration.LaterThinningCapacity;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Retrieves forwarder capacity when doing final felling&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;returns&amp;gt;capcity in ton&amp;lt;/returns&amp;gt;&lt;br /&gt;
        protected virtual double GetForwarderCapacityFinalFelling()&lt;br /&gt;
        {&lt;br /&gt;
            return Configuration.FinalFellingCapacity;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Retrievs thinning number for a TreatmentUnit&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;tUnit&amp;quot;&amp;gt;TreatmentUnit&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;currentPeriod&amp;quot;&amp;gt;The current period&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;returns&amp;gt;ThinningNumber&amp;lt;/returns&amp;gt;&lt;br /&gt;
        protected ThinningNumber GetThinningNumber(TreatmentUnit tUnit, int currentPeriod)&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            switch (tUnit.Treatments.Occurences(currentPeriod, TreatmentCollection.Thinning, TreatmentCollection.Regeneration))&lt;br /&gt;
            {&lt;br /&gt;
                case 1:&lt;br /&gt;
                    return ThinningNumber.First;&lt;br /&gt;
                case 2:&lt;br /&gt;
                    return ThinningNumber.Second;&lt;br /&gt;
                default:&lt;br /&gt;
                    return ThinningNumber.Later;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Returns the first treatment with cutting treatment&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;treatmentInfo&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;
        protected int FindFirstCuttingTreatment(object[] treatmentInfo)&lt;br /&gt;
        {&lt;br /&gt;
            // Find first treatment with cutting treatment&lt;br /&gt;
            int index = 0;&lt;br /&gt;
            for (int i = 0; i &amp;lt; treatmentInfo.Length; i++)&lt;br /&gt;
            {&lt;br /&gt;
                TreatmentType tType = ((TreatmentData)treatmentInfo[i]).Treatment;&lt;br /&gt;
                if ((tType &amp;amp; TreatmentCollection.Felling) &amp;gt; 0)&lt;br /&gt;
                {&lt;br /&gt;
                    index = i;&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            return index;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Gets treatment unit data&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;tUnit&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;period&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;results&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;value&amp;quot;&amp;gt;Felling value&amp;lt;/param&amp;gt;&lt;br /&gt;
        protected virtual void Initialize(TreatmentUnit tUnit, int period, Treatment treatment, IList&amp;lt;Result&amp;gt; results, FellingValue value)&lt;br /&gt;
        {&lt;br /&gt;
            _soilMoistType = tUnit.SiteData.SoilMoistCode;&lt;br /&gt;
            _treatment = treatment;&lt;br /&gt;
            _treatmentUnit = tUnit;&lt;br /&gt;
            _period = period;&lt;br /&gt;
 &lt;br /&gt;
            _terrainTransportDistance = (Configuration.TerrainTransportDistanceDataSource == DataSource.DefaultValue || _treatmentUnit.StandObjectData == null) ?&lt;br /&gt;
                Configuration.TerrainTransportDistance :&lt;br /&gt;
                _terrainTransportDistance = _treatmentUnit.StandObjectData.TerrainTransportDistance.GetValueOrDefault((int)Configuration.TerrainTransportDistance);&lt;br /&gt;
&lt;br /&gt;
            _surface = (Configuration.SurfaceDataSource == DataSource.DefaultValue || _treatmentUnit.StandObjectData == null) ?&lt;br /&gt;
                Configuration.Surface :&lt;br /&gt;
                _treatmentUnit.StandObjectData.Surface.GetValueOrDefault(Configuration.Surface);&lt;br /&gt;
            if ((int)_surface &amp;lt; 1)&lt;br /&gt;
                _surface = Configuration.Surface;&lt;br /&gt;
&lt;br /&gt;
            _slope = (Configuration.SlopeDataSource == DataSource.DefaultValue) ?&lt;br /&gt;
                Configuration.Slope :&lt;br /&gt;
                _treatmentUnit.SiteData.Slope.GetValueOrDefault(Configuration.Slope);&lt;br /&gt;
            if ((int)_slope &amp;lt; 1)&lt;br /&gt;
                _slope = Configuration.Slope;&lt;br /&gt;
&lt;br /&gt;
            _terrainRoadSlope = _treatmentUnit.StandObjectData == null ? _slope:&lt;br /&gt;
                _terrainRoadSlope = _treatmentUnit.StandObjectData.TerrainRoadSlope.GetValueOrDefault(_slope);&lt;br /&gt;
            if ((int)_terrainRoadSlope &amp;lt; 1)&lt;br /&gt;
                _terrainRoadSlope = _slope;&lt;br /&gt;
&lt;br /&gt;
            _soilMoistType = _treatmentUnit.SiteData.SoilMoistCode;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Calculates the cost of a treatment.&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;tUnit&amp;quot;&amp;gt;Treatment unit that has been treated&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;period&amp;quot;&amp;gt;Period to calculate cost for&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;treatment&amp;quot;&amp;gt;Treatment that has been applied&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;results&amp;quot;&amp;gt;Existing results for treatment unit&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;value&amp;quot;&amp;gt;Felling value&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;returns&amp;gt;Cost of treatment&amp;lt;/returns&amp;gt;&lt;br /&gt;
        public virtual Cost CalculateCost(TreatmentUnit tUnit, int period, Treatment treatment, IList&amp;lt;Result&amp;gt; results, FellingValue value)&lt;br /&gt;
        {&lt;br /&gt;
            Initialize(tUnit, period, treatment, results, value);&lt;br /&gt;
&lt;br /&gt;
            var trmtType = treatment.TreatmentType;&lt;br /&gt;
&lt;br /&gt;
            switch (trmtType)&lt;br /&gt;
            {&lt;br /&gt;
                case TreatmentType.Planting:&lt;br /&gt;
                    return PlantingCost();&lt;br /&gt;
                case TreatmentType.Sowing:&lt;br /&gt;
                    return SowingCost();&lt;br /&gt;
                case TreatmentType.Fertilization:&lt;br /&gt;
                    return FertilizationCost();&lt;br /&gt;
                case TreatmentType.SoilPreparation:&lt;br /&gt;
                    return PreparationCost();&lt;br /&gt;
                case TreatmentType.Burning:&lt;br /&gt;
                    return BurningCost();&lt;br /&gt;
                default:&lt;br /&gt;
                    return new Cost(0.0);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        public virtual GenericPropertyArray&amp;lt;double&amp;gt; CustomFunctionParameters { get; set; } = null;&lt;br /&gt;
&lt;br /&gt;
        public virtual string Name { get { return string.Empty; } }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====Creating a plugin that derives from CostCalculatorBase====&lt;br /&gt;
ICostCalculator : IPlugin&lt;br /&gt;
CostCalculatorBase : ICostCalculator&lt;br /&gt;
CostCalcultorHarvestBase : CostCalculatorBase &lt;br /&gt;
CostCalculatorSkogforskAdvanced : CostCalcultorHarvestBase &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====Creating a plugin that derives from time consumption function SkogforskAdvanced====&lt;br /&gt;
Below is a code example for a plugin that derives from Heureka's default time consumption function for harvesting and forwarding (SkogforskAdvanced).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Heureka to load the plugins==&lt;br /&gt;
&lt;br /&gt;
Plugins are loaded from the current user's \Documents\Heureka\Common\Plugins directory. If successful, the plugin will show up in the drop-down box for that particular feature.&lt;br /&gt;
&lt;br /&gt;
If a plugin failed to load, an error will show up in the 'General' output window with information of what went wrong.&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Contact&amp;diff=11014</id>
		<title>Contact</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Contact&amp;diff=11014"/>
		<updated>2024-11-26T12:47:25Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Languages|Contact}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Support and general questions&lt;br /&gt;
:[mailto:{{HeurekaSupportMail}} {{HeurekaSupportMail}}]&lt;br /&gt;
&lt;br /&gt;
;Maintenance&lt;br /&gt;
: The software is maintained, developed, and supported by the [http://www.slu.se/SHa Forest Sustainability Analysis] program at [https://www.slu.se/ SLU]. Heureka usually gets two new releases per year with new features and bug fixes. Check out the latest releases at [[:Category:Release|Releases]]. We recommend that all users register to receive the newsletter to get important information about the software. [http://www.slu.se/institutioner/skoglig-resurshushallning/programprojekt/sha/heureka/heureka/register/ Register here].&lt;br /&gt;
&lt;br /&gt;
;Get help&lt;br /&gt;
: There is no dedicated personal support available. To get help, try the following:&lt;br /&gt;
:* '''Help documentation:''' [{{HeurekaHelpLinkEng}} {{HeurekaHelpLinkEng}}]&lt;br /&gt;
&lt;br /&gt;
:* '''Technical support:''' The Heureka system is complex, and we recommend attending one of the annual Heureka courses at SLU. Usage support availability is limited, and we respond to questions when we can find the time. &lt;br /&gt;
::Please report bugs and errors to [mailto:{{HeurekaSupportMail}} {{HeurekaSupportMail}}]. [[Bug Tracking|Report a bug]]&lt;br /&gt;
&lt;br /&gt;
:* '''Academic support:''' Academic and related analysis services within research projects can be provided. Consider involving SHa already in the application stage, both for task planning and financing matters (especially when new functionality needs development efforts). Requests and proposals on academic support and collaboration can be directed to [mailto:{{HeurekaSupportMail}} {{HeurekaSupportMail}}].&lt;br /&gt;
:: Extensive support matters will be charged or require academic collaboration (including supervising thesis works or co-authorship).&lt;br /&gt;
&lt;br /&gt;
:* '''Commercial support:''' Requests and quotes on commercial support can also be directed to [mailto:{{HeurekaSupportMail}} {{HeurekaSupportMail}}]. Time exceeding one work hour will be charged at a consultancy rate of 1200 SEK per hour, VAT not included.&lt;br /&gt;
:: Service Level Agreements ensuring support availability upon request within an agreed time frame can be arranged. Please contact the SHa Program Manager for further details.&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=System_Architecture&amp;diff=11012</id>
		<title>System Architecture</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=System_Architecture&amp;diff=11012"/>
		<updated>2024-11-26T12:31:41Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: /* Reports */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:System design|Architecture]]&lt;br /&gt;
[[Category:Developer's guide]]&lt;br /&gt;
&lt;br /&gt;
== Architectural Goals and Quality ==&lt;br /&gt;
&lt;br /&gt;
For Heureka, the two most important quality goals are modifiability and performance. The system should be flexible enough to allow maintenance and further development in a cost effective manner. At the same time performance should be good enough to allow simulation on large amounts of data. To a certain extent, these goals are contradictable.&lt;br /&gt;
&lt;br /&gt;
In addition to this, testability is an important quality aspect. As many parts as possible should be possible to test automatically, e.g. with unit testing tools such as [http://www.nunit.org/ NUnit]. This sometimes means that sub functions must be made public so that they can be tested from external code. Over time, this goal has been proven more important than originally expected. This means that this goal has not always been met in the existing code, for instance many classes has a lot of dependencies on other classes making them harder to test.* &lt;br /&gt;
&lt;br /&gt;
Other quality goals are less important:&lt;br /&gt;
&lt;br /&gt;
* Security. There are no specific security requirements. The system will use security functions available in the database and operating system.&lt;br /&gt;
* Availability. The system is a single user application, so availability is not considered in the architecture.&lt;br /&gt;
* Portability. Portability is not required.&lt;br /&gt;
&lt;br /&gt;
== Logical View ==&lt;br /&gt;
&lt;br /&gt;
=== Forest model and Calculations ===&lt;br /&gt;
[[file:Forest_and_Calculations.png]]&lt;br /&gt;
&lt;br /&gt;
The key entity in Heureka is the Treatment Unit, that represents a stand, i.e. an area restricted in space, with the same type of forest. A Treatment Unit is the smallest unit treatments are applied for. Each treatment unit contains one or more predictions units. A prediction unit represents a plot or a cell inside the treatment unit. Each prediction unit contains trees. Trees have [[Handling of tree states|different states]], identifying if the tree object represents a sapling, a tree, is dead and so forth. Each of these entities [[handle different time periods]].&lt;br /&gt;
&lt;br /&gt;
Treatments are simulated in Heureka with different type of [[Design of Treatment Models|treatment models]] such as regeneration, fertilization, cleaning, thinning, and final felling.&lt;br /&gt;
&lt;br /&gt;
Growth and yield models calculates tree related values such as volume, basal area growth, height, age, and bark thickness. With help of the growth models, a [[Calculation of growth|treatment unit can grow]], i.e. the state in a future time period can be calculated.&lt;br /&gt;
&lt;br /&gt;
[[Result models]] are used to calculate different types on results. Based on the state of a treatment unit in a given time period, different types of results can be calculated, such as cost and revenue of treatments, amount of biomass in the living forest, or amount of litter added to the ground. A result model may also produce a result based on the results in other result models (e.g. the recreation model uses input from the dead wood model).&lt;br /&gt;
&lt;br /&gt;
Simulation models or frameworks, allows treatment programs to be calculated for a treatment unit. A simulation model utilizes the growth and yield models, the treatment models, and sometimes also result models, to simulate different alternatives for managing a treatment unit. When growth prognosis and treatments has been simulated for a number of periods, the treatment unit (together with its prediction units and their trees and saplings) contains information about the forest state in all periods that were included in the simulation. The results can be saved in a treatment program, which contains results for all periods with the desired result models. Currently, three simulation models are implemented in Heureka: the (strategic) [[Treatment Program Generator Design|Treatment Program Generator]], the [[Tactical Treatment Program Generator Design|Tactical Treatment Program Generator]], and the [[Regional Framework Design|Regional Framework]].&lt;br /&gt;
&lt;br /&gt;
An optimization model is used to create a plan. A plan consists of a selection of treatment programs (one for each treatment unit in the plan), that gives the best result according to the optimization model. An optimization model is defined using the results from the result models. Any variable produced by a result model can be used in an optimization model. Optimization models differs from other models in Heureka, these are the only models that are defined by the user (all other models are programmed into the system).&lt;br /&gt;
&lt;br /&gt;
Treatment units may be classified in forest domains. A user may define a forest domain, based on variables from the result models. The forest domain is then used to configure a simulation model.&lt;br /&gt;
&lt;br /&gt;
=== Data Import ===&lt;br /&gt;
&lt;br /&gt;
[[file:Data_Import.png]]&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;tt&amp;gt;TreatmentUnit&amp;lt;/tt&amp;gt; can be created from a NFI plot (Riksskogstaxeringen). In this case, a&amp;lt;tt&amp;gt;TreatmentUnit&amp;lt;/tt&amp;gt; and a &amp;lt;tt&amp;gt;PredictionUnit&amp;lt;/tt&amp;gt; is created for each NFI plot (if the NFI plot is splitted a &amp;lt;tt&amp;gt;TreatmentUnit&amp;lt;/tt&amp;gt; and a &amp;lt;tt&amp;gt;PredictionUnit&amp;lt;/tt&amp;gt; is created for each part of the plot).&lt;br /&gt;
&lt;br /&gt;
Similarly FMPP data can be imported into Heureka (not shown in figure).&lt;br /&gt;
&lt;br /&gt;
Another option is to import a stand register. From &amp;lt;tt&amp;gt;StandObject&amp;lt;/tt&amp;gt;s in the stand register, &amp;lt;tt&amp;gt;TreatmentUnit&amp;lt;/tt&amp;gt;s can be simulated. In this case, trees or saplings are created for the &amp;lt;tt&amp;gt;TreatmentUnit&amp;lt;/tt&amp;gt;, based on stand level variables in the &amp;lt;tt&amp;gt;StandObject&amp;lt;/tt&amp;gt;. The simulation process is stochastic, meaning that the result will be slightly different each time if repeated several times for the same &amp;lt;tt&amp;gt;StandObject&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
It is also possible to get data to Heureka by making a sample design, choosing &amp;lt;tt&amp;gt;StandObject&amp;lt;/tt&amp;gt;s to be inventoried, and then to make a field inventory using [[Ivent]], to get real plot data and inventoried trees and from that data create &amp;lt;tt&amp;gt;TreatmentUnit&amp;lt;/tt&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
The last option to get data into Heureka is to manually enter data using [[StandWise]] (not shown in figure).&lt;br /&gt;
&lt;br /&gt;
All forest data is stored in a relational database.&lt;br /&gt;
&lt;br /&gt;
=== Projects ===&lt;br /&gt;
&lt;br /&gt;
[[file:Projects.png]]&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;tt&amp;gt;Project&amp;lt;/tt&amp;gt; contains &amp;lt;tt&amp;gt;ControlCategories&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;ForestDomains&amp;lt;/tt&amp;gt;. Each &amp;lt;tt&amp;gt;ForestDomain&amp;lt;/tt&amp;gt; refers to a &amp;lt;tt&amp;gt;ControlCategory&amp;lt;/tt&amp;gt;, and each &amp;lt;tt&amp;gt;ControlCategory&amp;lt;/tt&amp;gt; contains a number of &amp;lt;tt&amp;gt;[[Design of Control Tables|ControlTables]]&amp;lt;/tt&amp;gt;, each of which contains user settings for a model or a group of related models in the system.&lt;br /&gt;
&lt;br /&gt;
Also, a &amp;lt;tt&amp;gt;Project&amp;lt;/tt&amp;gt; contains the &amp;lt;tt&amp;gt;TreatmentUnits&amp;lt;/tt&amp;gt; that the user is working with (the &amp;lt;tt&amp;gt;TreatmentUnits&amp;lt;/tt&amp;gt; are actually kept in an &amp;lt;tt&amp;gt;AnalysisArea&amp;lt;/tt&amp;gt;, not shown in the figure).&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;tt&amp;gt;Project&amp;lt;/tt&amp;gt; may also contain other items, such as optimization models (not shown in the figure).&lt;br /&gt;
&lt;br /&gt;
The project information is saved as files in the file system.&lt;br /&gt;
&lt;br /&gt;
== Design Principles ==&lt;br /&gt;
&lt;br /&gt;
=== Layering ===&lt;br /&gt;
&lt;br /&gt;
[[file:layering.png|600px]]&lt;br /&gt;
&lt;br /&gt;
The system is built with a layered architecture (see for example [[ISBN 0321154959|Bass et al: Software Architecture in Practice]]. The layering is based on the system logic, where each layer adds functionality from a lower layer.&lt;br /&gt;
&lt;br /&gt;
The three layers are:&lt;br /&gt;
&lt;br /&gt;
;Application Layer: Each application is a separate subsystem. An application connects the domain specific subsystems into the functionality provided by the application.&lt;br /&gt;
;Domain Layer: A large number of subsystems with different types of domain specific functionality. Each subsystem has its own logic, and in many cases also presentation and persistence services. By having the presentation in the domain layer, UI functionality can be reused between applications.&lt;br /&gt;
;Base Layer: General purpose support functions.&lt;br /&gt;
&lt;br /&gt;
The purpose of the layering is to achieve modifiability by isolation of changes. Changes in a higher layer does not affect a lower layer at all.&lt;br /&gt;
&lt;br /&gt;
The layering is not strict, meaning that a higher layer can access any lower layer.&lt;br /&gt;
&lt;br /&gt;
A similar layering is proposed in IBM Rational Unified Process, and in Domain Driven Design. The advantage of layering by generality as opposed to layering by type (as proposed by Microsoft) is lower coupling and higher cohesion. &lt;br /&gt;
&lt;br /&gt;
Inside a subsystem, layering by type, i.e. UI -&amp;gt; Logic -&amp;gt; DB should be done (if a subsystem has a presentation and/or persistence service). A subsystem should be able to use the logic of another subsystem without refering to the presentation or persistence service of that subsystem. The persistence service should be encapsulated inside the subsystem and not be used directly by other subsystems. The presentation service of a subsystem should be available for composition of UI.&lt;br /&gt;
 &lt;br /&gt;
''Unfortunately the subsystem layering has not always been used, in many cases several subsystems access the same tables in the database directly. Some subsystems are also poorly layered, e.g. with database code inside the UI, or UI code inside the logic.''&lt;br /&gt;
&lt;br /&gt;
=== MVC ===&lt;br /&gt;
&lt;br /&gt;
Linking between user interface and the domain model is done with the architectural pattern Model-View-Controller (Reenskaug 1979).&lt;br /&gt;
 &lt;br /&gt;
The model is a domain entity. When the entity is changed, it signals that with an event so that all views rendering the entity can update themselves. The event &amp;lt;tt&amp;gt;PropertyChanged&amp;lt;/tt&amp;gt; is used when a property is changed, the interface &amp;lt;tt&amp;gt;IBindingList&amp;lt;/tt&amp;gt; is used when a list or collection is changed. In some cases other events are also used, in &amp;lt;tt&amp;gt;Slu.Heureka.BaseLayer.ComponentModel&amp;lt;/tt&amp;gt; there are a few more EventArgs that can be used. That namespace also contains the class &amp;lt;tt&amp;gt;ExtendedBindingList&amp;lt;/tt&amp;gt; which is recommended for collections that can be bound.&lt;br /&gt;
&lt;br /&gt;
The view is any kind of graphical control, such as a TextBox, a DataGrid, a TreeView, or a Map. The view can show and change some parts of the entity.&lt;br /&gt;
&lt;br /&gt;
The controller is the object that reacts on user inputs, typically event handlers in a form.&lt;br /&gt;
&lt;br /&gt;
When developing with MVC it is important not to short-circuit the view and the controller when they are implemented in the same class. The event handler should only update the model, and not trigger changes in the view directly. &lt;br /&gt;
&lt;br /&gt;
=== Dependency inversion ===&lt;br /&gt;
&lt;br /&gt;
To reduce dependencies between classes and subsystems, should the subsystems that need a particular service define an interface for that service. For example, the &amp;lt;tt&amp;gt;Forest&amp;lt;/tt&amp;gt; subsystem needs biomass to be calculated. To avoid a direct (and circular) dependency from &amp;lt;tt&amp;gt;Forest&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;Biomass&amp;lt;/tt&amp;gt;, the &amp;lt;tt&amp;gt;Forest&amp;lt;/tt&amp;gt; subsystem declares an interface, &amp;lt;tt&amp;gt;IBiomassService&amp;lt;/tt&amp;gt;, and the &amp;lt;tt&amp;gt;Biomass&amp;lt;/tt&amp;gt; subsystem implements that interface.&lt;br /&gt;
&lt;br /&gt;
With dependency inversation, a new problem arises, how does an object locate the needed services? There are two common approaches to solving this problem: either Dependency Injection is used, or a Service Locator is used. For Heureka, the latter approach has been used.&lt;br /&gt;
&lt;br /&gt;
The subsystem &amp;lt;tt&amp;gt;Slu.Heureka.BaseLayer.Services&amp;lt;/tt&amp;gt; implements a service locator. Key classes in interfaces in that subsystem are:&lt;br /&gt;
&lt;br /&gt;
;IService:Interface that must be implemented by all services&lt;br /&gt;
;Service&amp;lt;T&amp;gt;:Generic class for accessing a service&lt;br /&gt;
;ServiceAttribute:Attribute that should be set on all services that should be auto loaded&lt;br /&gt;
;ServiceBase:Base class for implementing a service&lt;br /&gt;
;ServiceManager:The service locator&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;ServiceManager&amp;lt;/tt&amp;gt; is a Singleton. It supports auto loading of services (all services marked with the service attribute will be loaded at application startup) as well as explicit loading of services (very useful in unit tests).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;Services&amp;lt;/tt&amp;gt; subsystem was introduced relatively late in the project but has proven to be very flexible and useful. In future development, it is recommended to use it more frequently to reduce dependencies in the system. The recommended approach is that when:&lt;br /&gt;
&lt;br /&gt;
* A class needs to instantiate other classes (except .Net classes), a FactoryService should be implemented&lt;br /&gt;
* A class needs to use another subsystem, an interface to that subsystem should be implemented&lt;br /&gt;
&lt;br /&gt;
Static classes and singletons should never be used, with the &amp;lt;tt&amp;gt;ServiceManager&amp;lt;/tt&amp;gt; as the single exception to this rule.&lt;br /&gt;
&lt;br /&gt;
=== Persisting Data ===&lt;br /&gt;
&lt;br /&gt;
The system uses both the file system and RDBMS:s (SQL Server) to store data.&lt;br /&gt;
&lt;br /&gt;
* Forest data (stand registers, inventory data, GIS data, treatment units etc) are stored in a RDBMS, the &amp;quot;ForestDb&amp;quot;&lt;br /&gt;
* Calculated results and optimization results (plans) are stored in another RDBMS, the &amp;quot;ResultDb&amp;quot;&lt;br /&gt;
* Project information and templates are stored in the file system (typically in the user's document folder)&lt;br /&gt;
* Application configuration is stored in the file system (typically in the user's application data folder)&lt;br /&gt;
&lt;br /&gt;
Storgate to files are mainly done via serialization. However, a major drawback with serialization is that versioning can be a problem. Also, performance can be an issue. The subsystem &amp;lt;tt&amp;gt;Slu.Heureka.BaseLayer.SerializationManagement&amp;lt;/tt&amp;gt; provides helper classes to resolve some of these issues. The classes &amp;lt;tt&amp;gt;SerializationReader&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SerializationWriter&amp;lt;/tt&amp;gt; improves performance drastically. A recommended practice is to always serialize a version number first. By doing this, deserialization of different versions can easily be implemented. A different problem is when a class changes its name or becomes obsolete. A solution for that problem has not been implemented in the Heureka system, but it should be possible to do it using the &amp;lt;tt&amp;gt;[[http://msdn.microsoft.com/en-US/library/system.runtime.serialization.serializationbinder |SerializationBinder]]&amp;lt;/tt&amp;gt; class in the .Net framework.&lt;br /&gt;
&lt;br /&gt;
For simple configuration data, the class &amp;lt;tt&amp;gt;ConfigurationStore&amp;lt;/tt&amp;gt; should be used. &lt;br /&gt;
&lt;br /&gt;
For control tables, a helper class that serializes control tables has been developed. Thus it is not necessary to implement serialization for control tables.&lt;br /&gt;
&lt;br /&gt;
For interaction with RDBMS the following techniques are used:&lt;br /&gt;
;Data readers: For fast loading of objects, mainly used for forest data&lt;br /&gt;
;Typed data sets: Used when the user is updating data&lt;br /&gt;
;Custom OR-mappning: Used for the result database&lt;br /&gt;
&lt;br /&gt;
Note that for the result database, custom OR-mapping is used. The result database are created automatically based on the [[Result Models]] in the system, and existing result databases will automatically be extended if new result variables and models are introduced in later versions of the system. Queries against the result database are created by SQL queries generated with reflection from the result models.&lt;br /&gt;
&lt;br /&gt;
=== Error Handling ===&lt;br /&gt;
&lt;br /&gt;
When an error is discovered an exception is thrown. Built-in exceptions can be used if appropriate, such as &amp;lt;tt&amp;gt;ArgumentException&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ArgumentNullException&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;InvalidOperationException&amp;lt;/tt&amp;gt;. In other cases Heureka specific exceptions, inheriting from &amp;lt;tt&amp;gt;ApplicationException&amp;lt;/tt&amp;gt;, are used.&lt;br /&gt;
&lt;br /&gt;
Code that depends on exceptions in the normal flow should be avoided. For instance, if a string should be checked for a valid number it is better to use &amp;lt;tt&amp;gt;int.TryParse()&amp;lt;/tt&amp;gt; than &amp;lt;tt&amp;gt;int.Parse()&amp;lt;/tt&amp;gt; as the latter throws an exception of the string not is numeric. When designing classes, consider implementing similar methods allowing clients to determine beforehand if an operation is valid or not.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exceptions should only be caught if they are to be handled, and only those exceptions that are relevant should be caught. Do not just catch and re-throw exceptions. This leads to poor performance and also destroys the call stack of the exception.&lt;br /&gt;
&lt;br /&gt;
In the user interface there must be an exception handler for all code that might throw exceptions. That code should show an error message to the user if an exception is caught. Use &amp;lt;tt&amp;gt;Slu.Heureka.BaseLayer.HeurekaForms.ErrorDialog&amp;lt;/tt&amp;gt; to show error messages.&lt;br /&gt;
&lt;br /&gt;
The exception message should be brief. If a longer description is needed, set the &amp;lt;tt&amp;gt;HelpLink&amp;lt;/tt&amp;gt; for the exception.&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
&lt;br /&gt;
The Command design pattern is used to encapsulate actions that the user performs into separate objects. There are several benefits with this simple pattern, so it should be used frequently:&lt;br /&gt;
&lt;br /&gt;
* Command makes it possible to implement Undo and Redo&lt;br /&gt;
* Command moves logic from forms into separate classes, and thus reduces the complexity of forms&lt;br /&gt;
* The logic in a Command can easily be used in separate forms and applications&lt;br /&gt;
&lt;br /&gt;
Technically, commands belongs to the presentation services. Commands are allowed to launch dialogs and message boxes, guiding the user through a flow.&lt;br /&gt;
&lt;br /&gt;
=== Reports ===&lt;br /&gt;
&lt;br /&gt;
Standard reports are developed in Visual Studio as Microsoft Client Report Definitions (rdlc). These are shown in the applications with the &amp;lt;tt&amp;gt;ReportViewer&amp;lt;/tt&amp;gt; component.&lt;br /&gt;
&lt;br /&gt;
=== Help ===&lt;br /&gt;
&lt;br /&gt;
The applications should have support for online help.&lt;br /&gt;
&lt;br /&gt;
== Technical Environment ==&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=System_Architecture&amp;diff=11011</id>
		<title>System Architecture</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=System_Architecture&amp;diff=11011"/>
		<updated>2024-11-26T12:31:18Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: /* Kommandon */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:System design|Architecture]]&lt;br /&gt;
[[Category:Developer's guide]]&lt;br /&gt;
&lt;br /&gt;
== Architectural Goals and Quality ==&lt;br /&gt;
&lt;br /&gt;
For Heureka, the two most important quality goals are modifiability and performance. The system should be flexible enough to allow maintenance and further development in a cost effective manner. At the same time performance should be good enough to allow simulation on large amounts of data. To a certain extent, these goals are contradictable.&lt;br /&gt;
&lt;br /&gt;
In addition to this, testability is an important quality aspect. As many parts as possible should be possible to test automatically, e.g. with unit testing tools such as [http://www.nunit.org/ NUnit]. This sometimes means that sub functions must be made public so that they can be tested from external code. Over time, this goal has been proven more important than originally expected. This means that this goal has not always been met in the existing code, for instance many classes has a lot of dependencies on other classes making them harder to test.* &lt;br /&gt;
&lt;br /&gt;
Other quality goals are less important:&lt;br /&gt;
&lt;br /&gt;
* Security. There are no specific security requirements. The system will use security functions available in the database and operating system.&lt;br /&gt;
* Availability. The system is a single user application, so availability is not considered in the architecture.&lt;br /&gt;
* Portability. Portability is not required.&lt;br /&gt;
&lt;br /&gt;
== Logical View ==&lt;br /&gt;
&lt;br /&gt;
=== Forest model and Calculations ===&lt;br /&gt;
[[file:Forest_and_Calculations.png]]&lt;br /&gt;
&lt;br /&gt;
The key entity in Heureka is the Treatment Unit, that represents a stand, i.e. an area restricted in space, with the same type of forest. A Treatment Unit is the smallest unit treatments are applied for. Each treatment unit contains one or more predictions units. A prediction unit represents a plot or a cell inside the treatment unit. Each prediction unit contains trees. Trees have [[Handling of tree states|different states]], identifying if the tree object represents a sapling, a tree, is dead and so forth. Each of these entities [[handle different time periods]].&lt;br /&gt;
&lt;br /&gt;
Treatments are simulated in Heureka with different type of [[Design of Treatment Models|treatment models]] such as regeneration, fertilization, cleaning, thinning, and final felling.&lt;br /&gt;
&lt;br /&gt;
Growth and yield models calculates tree related values such as volume, basal area growth, height, age, and bark thickness. With help of the growth models, a [[Calculation of growth|treatment unit can grow]], i.e. the state in a future time period can be calculated.&lt;br /&gt;
&lt;br /&gt;
[[Result models]] are used to calculate different types on results. Based on the state of a treatment unit in a given time period, different types of results can be calculated, such as cost and revenue of treatments, amount of biomass in the living forest, or amount of litter added to the ground. A result model may also produce a result based on the results in other result models (e.g. the recreation model uses input from the dead wood model).&lt;br /&gt;
&lt;br /&gt;
Simulation models or frameworks, allows treatment programs to be calculated for a treatment unit. A simulation model utilizes the growth and yield models, the treatment models, and sometimes also result models, to simulate different alternatives for managing a treatment unit. When growth prognosis and treatments has been simulated for a number of periods, the treatment unit (together with its prediction units and their trees and saplings) contains information about the forest state in all periods that were included in the simulation. The results can be saved in a treatment program, which contains results for all periods with the desired result models. Currently, three simulation models are implemented in Heureka: the (strategic) [[Treatment Program Generator Design|Treatment Program Generator]], the [[Tactical Treatment Program Generator Design|Tactical Treatment Program Generator]], and the [[Regional Framework Design|Regional Framework]].&lt;br /&gt;
&lt;br /&gt;
An optimization model is used to create a plan. A plan consists of a selection of treatment programs (one for each treatment unit in the plan), that gives the best result according to the optimization model. An optimization model is defined using the results from the result models. Any variable produced by a result model can be used in an optimization model. Optimization models differs from other models in Heureka, these are the only models that are defined by the user (all other models are programmed into the system).&lt;br /&gt;
&lt;br /&gt;
Treatment units may be classified in forest domains. A user may define a forest domain, based on variables from the result models. The forest domain is then used to configure a simulation model.&lt;br /&gt;
&lt;br /&gt;
=== Data Import ===&lt;br /&gt;
&lt;br /&gt;
[[file:Data_Import.png]]&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;tt&amp;gt;TreatmentUnit&amp;lt;/tt&amp;gt; can be created from a NFI plot (Riksskogstaxeringen). In this case, a&amp;lt;tt&amp;gt;TreatmentUnit&amp;lt;/tt&amp;gt; and a &amp;lt;tt&amp;gt;PredictionUnit&amp;lt;/tt&amp;gt; is created for each NFI plot (if the NFI plot is splitted a &amp;lt;tt&amp;gt;TreatmentUnit&amp;lt;/tt&amp;gt; and a &amp;lt;tt&amp;gt;PredictionUnit&amp;lt;/tt&amp;gt; is created for each part of the plot).&lt;br /&gt;
&lt;br /&gt;
Similarly FMPP data can be imported into Heureka (not shown in figure).&lt;br /&gt;
&lt;br /&gt;
Another option is to import a stand register. From &amp;lt;tt&amp;gt;StandObject&amp;lt;/tt&amp;gt;s in the stand register, &amp;lt;tt&amp;gt;TreatmentUnit&amp;lt;/tt&amp;gt;s can be simulated. In this case, trees or saplings are created for the &amp;lt;tt&amp;gt;TreatmentUnit&amp;lt;/tt&amp;gt;, based on stand level variables in the &amp;lt;tt&amp;gt;StandObject&amp;lt;/tt&amp;gt;. The simulation process is stochastic, meaning that the result will be slightly different each time if repeated several times for the same &amp;lt;tt&amp;gt;StandObject&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
It is also possible to get data to Heureka by making a sample design, choosing &amp;lt;tt&amp;gt;StandObject&amp;lt;/tt&amp;gt;s to be inventoried, and then to make a field inventory using [[Ivent]], to get real plot data and inventoried trees and from that data create &amp;lt;tt&amp;gt;TreatmentUnit&amp;lt;/tt&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
The last option to get data into Heureka is to manually enter data using [[StandWise]] (not shown in figure).&lt;br /&gt;
&lt;br /&gt;
All forest data is stored in a relational database.&lt;br /&gt;
&lt;br /&gt;
=== Projects ===&lt;br /&gt;
&lt;br /&gt;
[[file:Projects.png]]&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;tt&amp;gt;Project&amp;lt;/tt&amp;gt; contains &amp;lt;tt&amp;gt;ControlCategories&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;ForestDomains&amp;lt;/tt&amp;gt;. Each &amp;lt;tt&amp;gt;ForestDomain&amp;lt;/tt&amp;gt; refers to a &amp;lt;tt&amp;gt;ControlCategory&amp;lt;/tt&amp;gt;, and each &amp;lt;tt&amp;gt;ControlCategory&amp;lt;/tt&amp;gt; contains a number of &amp;lt;tt&amp;gt;[[Design of Control Tables|ControlTables]]&amp;lt;/tt&amp;gt;, each of which contains user settings for a model or a group of related models in the system.&lt;br /&gt;
&lt;br /&gt;
Also, a &amp;lt;tt&amp;gt;Project&amp;lt;/tt&amp;gt; contains the &amp;lt;tt&amp;gt;TreatmentUnits&amp;lt;/tt&amp;gt; that the user is working with (the &amp;lt;tt&amp;gt;TreatmentUnits&amp;lt;/tt&amp;gt; are actually kept in an &amp;lt;tt&amp;gt;AnalysisArea&amp;lt;/tt&amp;gt;, not shown in the figure).&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;tt&amp;gt;Project&amp;lt;/tt&amp;gt; may also contain other items, such as optimization models (not shown in the figure).&lt;br /&gt;
&lt;br /&gt;
The project information is saved as files in the file system.&lt;br /&gt;
&lt;br /&gt;
== Design Principles ==&lt;br /&gt;
&lt;br /&gt;
=== Layering ===&lt;br /&gt;
&lt;br /&gt;
[[file:layering.png|600px]]&lt;br /&gt;
&lt;br /&gt;
The system is built with a layered architecture (see for example [[ISBN 0321154959|Bass et al: Software Architecture in Practice]]. The layering is based on the system logic, where each layer adds functionality from a lower layer.&lt;br /&gt;
&lt;br /&gt;
The three layers are:&lt;br /&gt;
&lt;br /&gt;
;Application Layer: Each application is a separate subsystem. An application connects the domain specific subsystems into the functionality provided by the application.&lt;br /&gt;
;Domain Layer: A large number of subsystems with different types of domain specific functionality. Each subsystem has its own logic, and in many cases also presentation and persistence services. By having the presentation in the domain layer, UI functionality can be reused between applications.&lt;br /&gt;
;Base Layer: General purpose support functions.&lt;br /&gt;
&lt;br /&gt;
The purpose of the layering is to achieve modifiability by isolation of changes. Changes in a higher layer does not affect a lower layer at all.&lt;br /&gt;
&lt;br /&gt;
The layering is not strict, meaning that a higher layer can access any lower layer.&lt;br /&gt;
&lt;br /&gt;
A similar layering is proposed in IBM Rational Unified Process, and in Domain Driven Design. The advantage of layering by generality as opposed to layering by type (as proposed by Microsoft) is lower coupling and higher cohesion. &lt;br /&gt;
&lt;br /&gt;
Inside a subsystem, layering by type, i.e. UI -&amp;gt; Logic -&amp;gt; DB should be done (if a subsystem has a presentation and/or persistence service). A subsystem should be able to use the logic of another subsystem without refering to the presentation or persistence service of that subsystem. The persistence service should be encapsulated inside the subsystem and not be used directly by other subsystems. The presentation service of a subsystem should be available for composition of UI.&lt;br /&gt;
 &lt;br /&gt;
''Unfortunately the subsystem layering has not always been used, in many cases several subsystems access the same tables in the database directly. Some subsystems are also poorly layered, e.g. with database code inside the UI, or UI code inside the logic.''&lt;br /&gt;
&lt;br /&gt;
=== MVC ===&lt;br /&gt;
&lt;br /&gt;
Linking between user interface and the domain model is done with the architectural pattern Model-View-Controller (Reenskaug 1979).&lt;br /&gt;
 &lt;br /&gt;
The model is a domain entity. When the entity is changed, it signals that with an event so that all views rendering the entity can update themselves. The event &amp;lt;tt&amp;gt;PropertyChanged&amp;lt;/tt&amp;gt; is used when a property is changed, the interface &amp;lt;tt&amp;gt;IBindingList&amp;lt;/tt&amp;gt; is used when a list or collection is changed. In some cases other events are also used, in &amp;lt;tt&amp;gt;Slu.Heureka.BaseLayer.ComponentModel&amp;lt;/tt&amp;gt; there are a few more EventArgs that can be used. That namespace also contains the class &amp;lt;tt&amp;gt;ExtendedBindingList&amp;lt;/tt&amp;gt; which is recommended for collections that can be bound.&lt;br /&gt;
&lt;br /&gt;
The view is any kind of graphical control, such as a TextBox, a DataGrid, a TreeView, or a Map. The view can show and change some parts of the entity.&lt;br /&gt;
&lt;br /&gt;
The controller is the object that reacts on user inputs, typically event handlers in a form.&lt;br /&gt;
&lt;br /&gt;
When developing with MVC it is important not to short-circuit the view and the controller when they are implemented in the same class. The event handler should only update the model, and not trigger changes in the view directly. &lt;br /&gt;
&lt;br /&gt;
=== Dependency inversion ===&lt;br /&gt;
&lt;br /&gt;
To reduce dependencies between classes and subsystems, should the subsystems that need a particular service define an interface for that service. For example, the &amp;lt;tt&amp;gt;Forest&amp;lt;/tt&amp;gt; subsystem needs biomass to be calculated. To avoid a direct (and circular) dependency from &amp;lt;tt&amp;gt;Forest&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;Biomass&amp;lt;/tt&amp;gt;, the &amp;lt;tt&amp;gt;Forest&amp;lt;/tt&amp;gt; subsystem declares an interface, &amp;lt;tt&amp;gt;IBiomassService&amp;lt;/tt&amp;gt;, and the &amp;lt;tt&amp;gt;Biomass&amp;lt;/tt&amp;gt; subsystem implements that interface.&lt;br /&gt;
&lt;br /&gt;
With dependency inversation, a new problem arises, how does an object locate the needed services? There are two common approaches to solving this problem: either Dependency Injection is used, or a Service Locator is used. For Heureka, the latter approach has been used.&lt;br /&gt;
&lt;br /&gt;
The subsystem &amp;lt;tt&amp;gt;Slu.Heureka.BaseLayer.Services&amp;lt;/tt&amp;gt; implements a service locator. Key classes in interfaces in that subsystem are:&lt;br /&gt;
&lt;br /&gt;
;IService:Interface that must be implemented by all services&lt;br /&gt;
;Service&amp;lt;T&amp;gt;:Generic class for accessing a service&lt;br /&gt;
;ServiceAttribute:Attribute that should be set on all services that should be auto loaded&lt;br /&gt;
;ServiceBase:Base class for implementing a service&lt;br /&gt;
;ServiceManager:The service locator&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;ServiceManager&amp;lt;/tt&amp;gt; is a Singleton. It supports auto loading of services (all services marked with the service attribute will be loaded at application startup) as well as explicit loading of services (very useful in unit tests).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;Services&amp;lt;/tt&amp;gt; subsystem was introduced relatively late in the project but has proven to be very flexible and useful. In future development, it is recommended to use it more frequently to reduce dependencies in the system. The recommended approach is that when:&lt;br /&gt;
&lt;br /&gt;
* A class needs to instantiate other classes (except .Net classes), a FactoryService should be implemented&lt;br /&gt;
* A class needs to use another subsystem, an interface to that subsystem should be implemented&lt;br /&gt;
&lt;br /&gt;
Static classes and singletons should never be used, with the &amp;lt;tt&amp;gt;ServiceManager&amp;lt;/tt&amp;gt; as the single exception to this rule.&lt;br /&gt;
&lt;br /&gt;
=== Persisting Data ===&lt;br /&gt;
&lt;br /&gt;
The system uses both the file system and RDBMS:s (SQL Server) to store data.&lt;br /&gt;
&lt;br /&gt;
* Forest data (stand registers, inventory data, GIS data, treatment units etc) are stored in a RDBMS, the &amp;quot;ForestDb&amp;quot;&lt;br /&gt;
* Calculated results and optimization results (plans) are stored in another RDBMS, the &amp;quot;ResultDb&amp;quot;&lt;br /&gt;
* Project information and templates are stored in the file system (typically in the user's document folder)&lt;br /&gt;
* Application configuration is stored in the file system (typically in the user's application data folder)&lt;br /&gt;
&lt;br /&gt;
Storgate to files are mainly done via serialization. However, a major drawback with serialization is that versioning can be a problem. Also, performance can be an issue. The subsystem &amp;lt;tt&amp;gt;Slu.Heureka.BaseLayer.SerializationManagement&amp;lt;/tt&amp;gt; provides helper classes to resolve some of these issues. The classes &amp;lt;tt&amp;gt;SerializationReader&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SerializationWriter&amp;lt;/tt&amp;gt; improves performance drastically. A recommended practice is to always serialize a version number first. By doing this, deserialization of different versions can easily be implemented. A different problem is when a class changes its name or becomes obsolete. A solution for that problem has not been implemented in the Heureka system, but it should be possible to do it using the &amp;lt;tt&amp;gt;[[http://msdn.microsoft.com/en-US/library/system.runtime.serialization.serializationbinder |SerializationBinder]]&amp;lt;/tt&amp;gt; class in the .Net framework.&lt;br /&gt;
&lt;br /&gt;
For simple configuration data, the class &amp;lt;tt&amp;gt;ConfigurationStore&amp;lt;/tt&amp;gt; should be used. &lt;br /&gt;
&lt;br /&gt;
For control tables, a helper class that serializes control tables has been developed. Thus it is not necessary to implement serialization for control tables.&lt;br /&gt;
&lt;br /&gt;
For interaction with RDBMS the following techniques are used:&lt;br /&gt;
;Data readers: For fast loading of objects, mainly used for forest data&lt;br /&gt;
;Typed data sets: Used when the user is updating data&lt;br /&gt;
;Custom OR-mappning: Used for the result database&lt;br /&gt;
&lt;br /&gt;
Note that for the result database, custom OR-mapping is used. The result database are created automatically based on the [[Result Models]] in the system, and existing result databases will automatically be extended if new result variables and models are introduced in later versions of the system. Queries against the result database are created by SQL queries generated with reflection from the result models.&lt;br /&gt;
&lt;br /&gt;
=== Error Handling ===&lt;br /&gt;
&lt;br /&gt;
When an error is discovered an exception is thrown. Built-in exceptions can be used if appropriate, such as &amp;lt;tt&amp;gt;ArgumentException&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ArgumentNullException&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;InvalidOperationException&amp;lt;/tt&amp;gt;. In other cases Heureka specific exceptions, inheriting from &amp;lt;tt&amp;gt;ApplicationException&amp;lt;/tt&amp;gt;, are used.&lt;br /&gt;
&lt;br /&gt;
Code that depends on exceptions in the normal flow should be avoided. For instance, if a string should be checked for a valid number it is better to use &amp;lt;tt&amp;gt;int.TryParse()&amp;lt;/tt&amp;gt; than &amp;lt;tt&amp;gt;int.Parse()&amp;lt;/tt&amp;gt; as the latter throws an exception of the string not is numeric. When designing classes, consider implementing similar methods allowing clients to determine beforehand if an operation is valid or not.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exceptions should only be caught if they are to be handled, and only those exceptions that are relevant should be caught. Do not just catch and re-throw exceptions. This leads to poor performance and also destroys the call stack of the exception.&lt;br /&gt;
&lt;br /&gt;
In the user interface there must be an exception handler for all code that might throw exceptions. That code should show an error message to the user if an exception is caught. Use &amp;lt;tt&amp;gt;Slu.Heureka.BaseLayer.HeurekaForms.ErrorDialog&amp;lt;/tt&amp;gt; to show error messages.&lt;br /&gt;
&lt;br /&gt;
The exception message should be brief. If a longer description is needed, set the &amp;lt;tt&amp;gt;HelpLink&amp;lt;/tt&amp;gt; for the exception.&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
&lt;br /&gt;
The Command design pattern is used to encapsulate actions that the user performs into separate objects. There are several benefits with this simple pattern, so it should be used frequently:&lt;br /&gt;
&lt;br /&gt;
* Command makes it possible to implement Undo and Redo&lt;br /&gt;
* Command moves logic from forms into separate classes, and thus reduces the complexity of forms&lt;br /&gt;
* The logic in a Command can easily be used in separate forms and applications&lt;br /&gt;
&lt;br /&gt;
Technically, commands belongs to the presentation services. Commands are allowed to launch dialogs and message boxes, guiding the user through a flow.&lt;br /&gt;
&lt;br /&gt;
=== Reports ===&lt;br /&gt;
&lt;br /&gt;
Standrd reports are developed in Visual Studio as Microsoft Client Report Definitions (rdlc). These are shown in the applications with the &amp;lt;tt&amp;gt;ReportViewer&amp;lt;/tt&amp;gt; component.&lt;br /&gt;
&lt;br /&gt;
=== Help ===&lt;br /&gt;
&lt;br /&gt;
The applications should have support for online help.&lt;br /&gt;
&lt;br /&gt;
== Technical Environment ==&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Importera_best%C3%A5ndsregister&amp;diff=10987</id>
		<title>Importera beståndsregister</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Importera_best%C3%A5ndsregister&amp;diff=10987"/>
		<updated>2024-11-26T10:21:17Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages|Import_of_stand_register}}&lt;br /&gt;
[[Category:Database]]&lt;br /&gt;
[[Category:Reference Manual]]&lt;br /&gt;
[[Category:User's Guides]]&lt;br /&gt;
&lt;br /&gt;
===Instruktioner===&lt;br /&gt;
Denna sida innehåller kompletterande information till instruktionerna för att importera beståndsregister, som finns här: [{{HeurekaHelpLink}}importera_bestandsregister.htm Importera_bestandsregister]&lt;br /&gt;
&lt;br /&gt;
===Filspecifikation===&lt;br /&gt;
Notera: &lt;br /&gt;
*Överståndarskikt kan importeras. Detta görs genom att lägga in en extra rad direkt efter det huggningsklassbestämmande skiktet. Överståndarskiktets rad ska då innehålla samma uppgifter som det huggningsklassbestämmande skiktet förutom i de fält som beskriver överståndarskiktet, t.ex. trädslagsfördelning, grundyta, stamantal, medeldiameter och medelhöjd.&lt;br /&gt;
*'''Ståndortsindex anges som SIS, inte som SIH''', d.v.s. SI bedöms utifrån ståndortsfaktorer och inte övrehöjdsutveckling.&lt;br /&gt;
&lt;br /&gt;
Resten av detta avsnitt är på engelska:&lt;br /&gt;
&lt;br /&gt;
{{:StandRegisterFileSpecification}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Simulering av trädlistor från diameterfördelningsfunktioner===&lt;br /&gt;
A stand register usually includes, in each stand, average values and totals for several variables. However, models applied in the simulations of growth, treatments, etc. need initial forest state descriptions at the single tree-level. If not obtained in a forest inventory, e.g. according to [[Ivent]], such data can be simulated. Other inventory methods, and other simulation techniques (e.g. sample plot imputation), are available. Remote sensing like airborne laser sensors may soon return (a sample of) single-tree data for large areas without great costs, but of great interest.&lt;br /&gt;
&lt;br /&gt;
Single tree-data is randomly simulated using a set of parameter values given by the imported stand register. Moreover, the user define the size (in m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) and the number of plots (i.e. reference or prediction units) per stand to be simulated. ''Why simulate a sample of trees and not all trees of the stand?'' Acually, all trees are simulated, but only in the 2D-/3D-vizualisations in StandWise. In any other situation, a sample of single tree-data is the expected format describing the forests (saving both space and computational time). By using the tree species-wise mean diameter, mean height, total basal area (in m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;/ha), and total number of stems per hectare, it is quite straightforward to distribute a total volume over a certain number of trees, of certain sizes. A Weibull probability density distribution is applied ([http://en.wikipedia.org/wiki/Weibull_distribution]), actually distributing the trees' diameters (at breast height). The Weibull distribution share properties with many other distributions, like the exponential and the normal (the Gaussian). However, by using the scale parameter (approx. correponding to the tree species' DG) and the shape parameter, usually with a value of 1.5 - 5, a skewed distribution with a right-side tail is obtained. This corresponds fairly well to real forest stands and reflects the occurrence of some, but not many trees larger than the average tree of the stand. On the other side (the left-side), it is prohibited that a stand include trees with negative diameters. Which would have been unrealistic.&lt;br /&gt;
&lt;br /&gt;
The shape parameter is of importance, including both the actual shape of the distribution and its scale. A scale parameter is known for &amp;quot;stretching/shrinking the width of the distribution&amp;quot;. A stand register, unfortunately, seldom includes any information about the distribution of tree sizes. Any notes like &amp;quot;homogeneous&amp;quot; or &amp;quot;heterogeneous&amp;quot; should be taken into consideration. For the moment, this is done using the mandatory field &amp;quot;EvenAgedCode&amp;quot; in the stand register import. With a heterogeneous stand the user should here select &amp;quot;UnevenAged&amp;quot; to obtain a relatively wide diameter distribution, and vice versa. As you notice, this is not fully consistent - a stand with trees of same age might very well include both large and small trees (both dominating and supressed trees).&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Import_of_stand_register&amp;diff=10986</id>
		<title>Import of stand register</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Import_of_stand_register&amp;diff=10986"/>
		<updated>2024-11-26T10:21:05Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages|Import_of_stand_register}}&lt;br /&gt;
[[Category:Database]]&lt;br /&gt;
[[Category:Reference Manual]]&lt;br /&gt;
[[Category:User's Guides]]&lt;br /&gt;
&lt;br /&gt;
===Instructions===&lt;br /&gt;
See {{HeurekaHelpLinkEng}}importera_bestandsregister.htm.&lt;br /&gt;
&lt;br /&gt;
===File specification===&lt;br /&gt;
{{:StandRegisterFileSpecification}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Simulating single tree-data==&lt;br /&gt;
A stand register usually includes, in each stand, average values and totals for several variables. However, models applied in the simulations of growth, treatments, etc. need initial forest state descriptions at the single tree-level. If not obtained in a forest inventory, e.g. according to [[Ivent]], such data can be simulated. Other inventory methods, and other simulation techniques (e.g. sample plot imputation), are available. Remote sensing like airborne laser sensors may soon return (a sample of) single-tree data for large areas without great costs, but of great interest.&lt;br /&gt;
&lt;br /&gt;
Single tree-data is randomly simulated using a set of parameter values given by the imported stand register. Moreover, the user define the size (in m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) and the number of plots (i.e. reference or prediction units) per stand to be simulated. ''Why simulate a sample of trees and not all trees of the stand?'' Acually, all trees are simulated, but only in the 2D-/3D-vizualisations in StandWise. In any other situation, a sample of single tree-data is the expected format describing the forests (saving both space and computational time). By using the tree species-wise mean diameter, mean height, total basal area (in m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;/ha), and total number of stems per hectare, it is quite straightforward to distribute a total volume over a certain number of trees, of certain sizes. A Weibull probability density distribution is applied ([http://en.wikipedia.org/wiki/Weibull_distribution]), actually distributing the trees' diameters (at breast height). The Weibull distribution share properties with many other distributions, like the exponential and the normal (the Gaussian). However, by using the scale parameter (approx. correponding to the tree species' DG) and the shape parameter, usually with a value of 1.5 - 5, a skewed distribution with a right-side tail is obtained. This corresponds fairly well to real forest stands and reflects the occurrence of some, but not many trees larger than the average tree of the stand. On the other side (the left-side), it is prohibited that a stand include trees with negative diameters. Which would have been unrealistic.&lt;br /&gt;
&lt;br /&gt;
The shape parameter is of importance, including both the actual shape of the distribution and its scale. A scale parameter is known for &amp;quot;stretching/shrinking the width of the distribution&amp;quot;. A stand register, unfortunately, seldom includes any information about the distribution of tree sizes. Any notes like &amp;quot;homogeneous&amp;quot; or &amp;quot;heterogeneous&amp;quot; should be taken into consideration. For the moment, this is done using the mandatory field &amp;quot;EvenAgedCode&amp;quot; in the stand register import. With a heterogeneous stand the user should here select &amp;quot;UnevenAged&amp;quot; to obtain a relatively wide diameter distribution, and vice versa. As you notice, this is not fully consistent - a stand with trees of same age might very well include both large and small trees (both dominating and supressed trees).&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Import_of_stand_register&amp;diff=10984</id>
		<title>Import of stand register</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Import_of_stand_register&amp;diff=10984"/>
		<updated>2024-11-26T10:19:53Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages|Import_of_stand_register}}&lt;br /&gt;
[[Category:Database]]&lt;br /&gt;
[[Category:Reference Manual]]&lt;br /&gt;
[[Category:User's Guides]]&lt;br /&gt;
&lt;br /&gt;
===Instructions===&lt;br /&gt;
See {{HeurekaHelpLinkEng}}importera_bestandsregister.htm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===File specification===&lt;br /&gt;
{{:StandRegisterFileSpecification}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Simulating single tree-data==&lt;br /&gt;
A stand register usually includes, in each stand, average values and totals for several variables. However, models applied in the simulations of growth, treatments, etc. need initial forest state descriptions at the single tree-level. If not obtained in a forest inventory, e.g. according to [[Ivent]], such data can be simulated. Other inventory methods, and other simulation techniques (e.g. sample plot imputation), are available. Remote sensing like airborne laser sensors may soon return (a sample of) single-tree data for large areas without great costs, but of great interest.&lt;br /&gt;
&lt;br /&gt;
Single tree-data is randomly simulated using a set of parameter values given by the imported stand register. Moreover, the user define the size (in m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) and the number of plots (i.e. reference or prediction units) per stand to be simulated. ''Why simulate a sample of trees and not all trees of the stand?'' Acually, all trees are simulated, but only in the 2D-/3D-vizualisations in StandWise. In any other situation, a sample of single tree-data is the expected format describing the forests (saving both space and computational time). By using the tree species-wise mean diameter, mean height, total basal area (in m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;/ha), and total number of stems per hectare, it is quite straightforward to distribute a total volume over a certain number of trees, of certain sizes. A Weibull probability density distribution is applied ([http://en.wikipedia.org/wiki/Weibull_distribution]), actually distributing the trees' diameters (at breast height). The Weibull distribution share properties with many other distributions, like the exponential and the normal (the Gaussian). However, by using the scale parameter (approx. correponding to the tree species' DG) and the shape parameter, usually with a value of 1.5 - 5, a skewed distribution with a right-side tail is obtained. This corresponds fairly well to real forest stands and reflects the occurrence of some, but not many trees larger than the average tree of the stand. On the other side (the left-side), it is prohibited that a stand include trees with negative diameters. Which would have been unrealistic.&lt;br /&gt;
&lt;br /&gt;
The shape parameter is of importance, including both the actual shape of the distribution and its scale. A scale parameter is known for &amp;quot;stretching/shrinking the width of the distribution&amp;quot;. A stand register, unfortunately, seldom includes any information about the distribution of tree sizes. Any notes like &amp;quot;homogeneous&amp;quot; or &amp;quot;heterogeneous&amp;quot; should be taken into consideration. For the moment, this is done using the mandatory field &amp;quot;EvenAgedCode&amp;quot; in the stand register import. With a heterogeneous stand the user should here select &amp;quot;UnevenAged&amp;quot; to obtain a relatively wide diameter distribution, and vice versa. As you notice, this is not fully consistent - a stand with trees of same age might very well include both large and small trees (both dominating and supressed trees).&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Bug_Tracking&amp;diff=10983</id>
		<title>Bug Tracking</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Bug_Tracking&amp;diff=10983"/>
		<updated>2024-11-26T10:12:21Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Report a bug==&lt;br /&gt;
If you've encountered a bug or issue while using our application, we encourage you to report it so we can work on resolving it. Your feedback helps us improve the application for everyone. For most users: Send an [mailto:support.heureka@slu.se e-mail] to the support.&lt;br /&gt;
&lt;br /&gt;
For internal users (members of the Heureka team): Use [http://www.heurekaslu.org/bugtrack our bugtracking system]. Request an account by sending us an [mailto:support.heureka@slu.se e-mail] with subject = &amp;quot;Request BugTrack account&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Before reporting, consider gathering information about the bug that will assist us in resolving the issue. Include the following details in your email if possible/relevant:&lt;br /&gt;
&lt;br /&gt;
*Descriptive title: A brief description of the issue&lt;br /&gt;
*Application Version: The version of the application you are using (e.g., 2.23.0).&lt;br /&gt;
*Steps to Reproduce: A description of what you were doing when the issue occurred.&lt;br /&gt;
*Expected Behavior: What you expected to happen.&lt;br /&gt;
*Actual Behavior: What actually happened.&lt;br /&gt;
*Screenshots or Logs: Attach any relevant screenshots, error messages, or logs that can help us understand the issue.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--==Reported bugs==&lt;br /&gt;
&lt;br /&gt;
{{#bugzilla:}}--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Heureka_Wiki:About&amp;diff=10979</id>
		<title>Heureka Wiki:About</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Heureka_Wiki:About&amp;diff=10979"/>
		<updated>2024-11-26T09:48:48Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Languages|Heureka Wiki:About}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
==About this Wiki==&lt;br /&gt;
This Wiki contains complementary information to the [{{HeurekaHelpLinkEng}} Heureka Online Help]. Here are download links to Heureka's applications, information about each new release of Heureka, as well as technical specifications of variables, result variables, control tables. Furthermore, a lot of the models used in Heureka have a summary description.&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Optimization&amp;diff=10975</id>
		<title>Optimization</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Optimization&amp;diff=10975"/>
		<updated>2024-11-26T09:29:09Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:User's Guides]]&lt;br /&gt;
[[Category:Optimization]]&lt;br /&gt;
&lt;br /&gt;
==New help documentation==&lt;br /&gt;
See also {{HeurekaHelpLinkEng}}optimering.htm , under construction.&lt;br /&gt;
&lt;br /&gt;
==About the optimization tool==&lt;br /&gt;
====Assignment problem====&lt;br /&gt;
The optimization problem solved in Heureka can be categorized as an '''assignment problem''': Each treatment unit should be assigned a treatment schedule.  The problem types handled are linear programming (LP) and 0/1 mixed-integer linear programming (MIP or MILP). The difference between the two is how treatment schedules are assigned. If a treatment unit can be assigned one and only one alternative, then the associated decision variables are set to binary (by the user). If the management of a treatment unit can be &amp;quot;split&amp;quot; and spatial integrity is not an issue, then these variables can be treated as continuous variables (default). In this case the value of the decision variables refers to the proportion of treatment unit area that should be managed with a certain schedule. More information on decision variables is given below.&lt;br /&gt;
&lt;br /&gt;
====ZIMPL====&lt;br /&gt;
For PlanWise a very flexible optimization tool is built-in for formulating and solving LP and MIP problems. The optimization tool is basically a graphical user interface to the [http://zimpl.zib.de/ ZIMPL optimization modelling language]. For solving a problem, external third-party solvers are used and directly linked to the optimization tool. Currently, the solvers available are listed below:&lt;br /&gt;
&lt;br /&gt;
====Solvers====&lt;br /&gt;
For solving a problem, external third-party solvers are used and directly linked to the optimization tool. Currently, the solvers available are &lt;br /&gt;
&lt;br /&gt;
*[https://www.coin-or.org/ CoinOR CLP/CBC], which is freely available under the Eclipse public license v 2.0 and included in the Heureka installation. &lt;br /&gt;
*[https://soplex.zib.de SoPlex], which is freely available for academic use. You will need the SCIP Windows binary (exe) file (&amp;quot;SCIP version 3.0 (Windows/PC 64 bit)&amp;quot; has been tested with Heureka), and specify the path under Settings. &lt;br /&gt;
*[https://www.gurobi.com Gurobi&amp;lt;sup&amp;gt;&amp;amp;reg;&amp;lt;/sup&amp;gt;], versions 9.0 - 11.0&lt;br /&gt;
*[https://www.ibm.com/support/pages/how-do-i-download-cplex-optimization-studio?mhsrc=ibmsearch_a&amp;amp;mhq=cplex IBM CPLEX&amp;lt;sup&amp;gt;&amp;amp;reg;&amp;lt;/sup&amp;gt;], version 22.1.0 &lt;br /&gt;
*[https://www.mosek.com MOSEK&amp;lt;sup&amp;gt;&amp;amp;reg;&amp;lt;/sup&amp;gt;], version 7-8.1&lt;br /&gt;
*[https://www.fico.com/en/products/fico-xpress-solver FICO Xpress&amp;lt;sup&amp;gt;&amp;amp;reg;&amp;lt;/sup&amp;gt;], version 7.9&lt;br /&gt;
&lt;br /&gt;
CPLEX, Gurobi, Xpress and MOSEK are very efficient, state-of-the-art solvers. They require a license, which can be obtained for free for academic use. These solvers must be obtained and installed by the user, they are not distributed with the Heureka install package.&lt;br /&gt;
&lt;br /&gt;
CoinOR CLP/CBC is an efficient free alternative and performs well in benchmarks.  &lt;br /&gt;
&lt;br /&gt;
LpSolve is no longer supported (from version 2.20).&lt;br /&gt;
&lt;br /&gt;
====Integration with prognosis data====&lt;br /&gt;
The optimization model is linked to a Heureka-formatted SQL Server database used for storing input data, simulation data, and result data. This enables a seamless integration with the input data required by the optimization model, as well as direct presentation of optimization results in the form of tables, graphs, and maps. This simplifies the analysis and visualization of scenarios or plans of forest development and outputs.  &lt;br /&gt;
&lt;br /&gt;
==Settings==&lt;br /&gt;
{{:Optimization_Settings}}&lt;br /&gt;
&lt;br /&gt;
==Managing models==&lt;br /&gt;
A standard optimization model is distributed with the program. There is also the opportunity to create a new model from scratch, or to use a wizard guide to taylor an optimization model with some of the most common objective functions and restrictions. All these models can then be further modified and saved by the user.&lt;br /&gt;
&lt;br /&gt;
To create and save models, used the buttons at the top of Optimization Model window, or the Model Wizard button in the Models section further down in the same window.&lt;br /&gt;
&lt;br /&gt;
For more info on the Model Wizard, please confer [https://www.heurekaslu.se/help/en/index.htm?model_wizard.htm the Heureka Help]&lt;br /&gt;
&lt;br /&gt;
==Editing an optimization model==&lt;br /&gt;
====Sets====&lt;br /&gt;
When you create a new model, the following set are added automatically:&lt;br /&gt;
* treatmentUnits: Set of all treatment units. Index = i.&lt;br /&gt;
* alternatives: Set of all management schedule numbers. Index = j. Note: Alternative j for one treatment unit has nothing to with alternative j for another unit. The number of available j:s varies between treatment units.&lt;br /&gt;
* periods: Time periods. Index = p. The length of a period is five years in strategic planning, and one year in tactical planning.&lt;br /&gt;
* rowNo: Index for the treatment number in a time period that a treatment unit alternative refers to.&lt;br /&gt;
&lt;br /&gt;
When adding opening size constraints (from the menu Optimization &amp;gt; Add Opening Size Constraint), additional sets are added.&lt;br /&gt;
&lt;br /&gt;
You can also add arbitrary sets manually, for e.g. organizational units, road ID columns, and so on.&lt;br /&gt;
&lt;br /&gt;
====Decision variables====&lt;br /&gt;
When you create a new model, some basic problem elements are added automatically (the sets and some constraints), including the most important decision variables. The decision variable &amp;lt;code&amp;gt;x[i,j] &amp;lt;/code&amp;gt; is always added:&lt;br /&gt;
&lt;br /&gt;
x[i,j] = proportion of the area of treatment unit ''i'' that is managed with management schedule ''j''.&lt;br /&gt;
&lt;br /&gt;
By default, the x[i,j] variables are continuous (non-integer) and bounded between 0 and 1. You can change the variable to binary (0/1-integer) by changing its RangeType to Binary, thus changing the problem type from LP to MIP.&lt;br /&gt;
&lt;br /&gt;
A constraint called &amp;lt;code&amp;gt;maxArea &amp;lt;/code&amp;gt; is also added automatically. It ensures that the area managed for each treatment unit is correct, so that the whole area (no more and no less) is assigned a schedule. Each treatment unit must be fully assigned a management. &amp;quot;No management&amp;quot; may be counted as an alternative, depending on what control categories are used when generating the alternative with the Treatment Program Generator.&lt;br /&gt;
&lt;br /&gt;
====Adding an accounting variable====&lt;br /&gt;
Accounting variables are preferrably added to the optimization model to improve readability and simplify the writing of constraints. An accounting variable is ''defined'' - it is a function of other decision variables in the model. The definition is actually an equality constraint in the the optimization model. &lt;br /&gt;
&lt;br /&gt;
One example of a useful accounting variable is total harvested volume in a period. This variable can then be used in other constraints.&lt;br /&gt;
&lt;br /&gt;
To add an accounting variable:&lt;br /&gt;
# In the Optimization Model window, right-click in the &amp;quot;Variables&amp;quot; section and Select &amp;quot;Add new variable&amp;quot;&lt;br /&gt;
# Right-click on the variable and change its name from &amp;lt;code&amp;gt;&amp;quot;DefaultName...&amp;quot;&amp;lt;/code&amp;gt; to something more proper, in the example below &amp;lt;code&amp;gt;volTot&amp;lt;/code&amp;gt;.&lt;br /&gt;
# To define an indexed variable, for example to have one variable for each time period, click on Data binding &amp;gt; Sets, and add the index set, for example &amp;quot;periods&amp;quot;. After that the variable name should have a suffix (&amp;lt;code&amp;gt;[p]&amp;lt;/code&amp;gt;).&lt;br /&gt;
# In the syntax window, type the definition with the the expression on the left side and the name of the variable on the right-hand side of an equality-symbol marked as &amp;lt;code&amp;gt;&amp;quot;==&amp;quot;&amp;lt;/code&amp;gt;. Example: An ccounting variable for total stand volume is defined, with an index p for time period. Note that before adding the variable, the parameter &amp;lt;code&amp;gt;volume[i,j,p]&amp;lt;/code&amp;gt; (which is linked to the Heureka result variable Forest Data.Volume Before) must have been added. Syntax:&lt;br /&gt;
#:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;FORALL &amp;lt;p&amp;gt; IN periods DO &amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
#:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt; SUM &amp;lt;i,j&amp;gt; IN treatmentunits * alternatives WITH altIncluded[i,j] == 1:&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
#:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt; volume[i,j,p] * area[i] * x[i,j] == volTot[p]; &amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
'''Important!''' By default, a variable (decision or accounting) has the property RangeType set to non-negative. This means that negative values are considered infeasible. For example, a volume cannot be negative. However, some accounting variables should  be allowed to take negative values, for example the net revenue in a period can be negative if costs are larger than revenues. In this case you must change its RangeType to &amp;quot;All&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====Adding a parameter which is linked to a prognosis variable ====&lt;br /&gt;
The coefficients in the LP-models (the coefficient matrix is usually denoted as '''A''') are constant values in the optimization model. In Heureka, these coefficients are generated by the Treatment Program Generator and referred to as Heureka result variables. A coefficient may represent for example stand volume for a given treatment unit, management schedule alternative, and time period.&lt;br /&gt;
Hence, stand volume is a variable in a prognosis, but a constant/parameter in the optimization model. &lt;br /&gt;
&lt;br /&gt;
# In the Optimization Model window, right-click in the &amp;quot;Parameters&amp;quot;-section and Select &amp;quot;Add new parameter&amp;quot;&lt;br /&gt;
# Type a name, for example &amp;quot;pulpWood&amp;quot; (without apostrophes)&lt;br /&gt;
# Let &amp;quot;Heureka result variable&amp;quot; be selected&lt;br /&gt;
# Click Next&lt;br /&gt;
# Select Financial Value &amp;gt; PulpWood Volume Total (if this is the variable you are interested in)&lt;br /&gt;
# Click Finish&lt;br /&gt;
&lt;br /&gt;
To check what Heureka variable a certain parameter is linked to:&lt;br /&gt;
# Select the parameter&lt;br /&gt;
# In the Properties window for the parameter (under the syntax window), under Databinding &amp;gt; ResultProperty, you can see what Heureka variable the parameter is bounded to. If you click on it you can change the binding.&lt;br /&gt;
&lt;br /&gt;
====Adding a parameter that has a definition====&lt;br /&gt;
# In the Optimization Model window, right-click in &amp;quot;Parameters&amp;quot; section and Select &amp;quot;Add new parameter&amp;quot;&lt;br /&gt;
# Type a name, for example &amp;quot;totalArea&amp;quot; (without apostrophes)&lt;br /&gt;
# Select &amp;quot;Formula&amp;quot; as parameter type&lt;br /&gt;
# Click Next&lt;br /&gt;
# In the syntax window, type the defiintion, for example &lt;br /&gt;
#:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;sum &amp;lt;i&amp;gt; in treatmentunits: area[i];&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  &lt;br /&gt;
#:(This can be edited later)&lt;br /&gt;
# Click Finish&lt;br /&gt;
&lt;br /&gt;
;Note 1: When defining an accounting variable (see above), you would also add a definition to the variable itself, such as &amp;lt;code&amp;gt;== VariableName&amp;lt;/code&amp;gt;. For a defined parameter, you only type the expression.&lt;br /&gt;
;Note 2: A shortcoming of a parameter with a formula is that you cannot preview its value.&lt;br /&gt;
&lt;br /&gt;
====Adding a constraint====&lt;br /&gt;
# In the Optimization Model window, right-click in &amp;quot;Constraints&amp;quot; and select &amp;quot;Add new constraint&amp;quot;&lt;br /&gt;
# Type a name, for example &amp;quot;MinOldForestArea&amp;quot; (without apostrophes)&lt;br /&gt;
# Click OK&lt;br /&gt;
# Select the constraint in the model tree and type the definition in the syntax window. For example, to add a constraint to ensure a non-declining harvest over time, you would type:&lt;br /&gt;
#:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;forall &amp;lt;p&amp;gt; in periods with p &amp;gt;= 1 : TotalHarvestVolume[p] &amp;gt;= TotalHarvestVolume*[p-1];&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  &lt;br /&gt;
#:(If you have defined an accounting variable for total harvest volume)&lt;br /&gt;
# Click Finish&lt;br /&gt;
&lt;br /&gt;
;Note: For constraints, you do not add indices explicitly as you do with variables. In the example, we do not add &amp;quot;p&amp;quot; for periods, but the &amp;quot;forall&amp;quot;-statement will take care of generating one constraint for each time period.&lt;br /&gt;
&lt;br /&gt;
;Tip: Use accounting variables in constraints to simplify reading and formulating the model, as well as to minimize problem size (considerably fewer coefficients and only a few additional variables).&lt;br /&gt;
&lt;br /&gt;
====Adding opening size constraints====&lt;br /&gt;
The generation of an EARM-model (see Goycoolea et al 2005) &amp;lt;ref name=&amp;quot;Goycoolea&amp;quot;&amp;gt; Goycoolea, M., Murray, A. T., Barahona, F., Epstein, R., Weintraub, A. 2005. Harvest scheduling subject to maximum area restrictions: Exploring exact approaches. Operations Research, 2005. Volume 53. Number 3.[http://mgoycool.uai.cl/papers/mgw04.pdf]&amp;lt;/ref&amp;gt;&lt;br /&gt;
is automated. The original model have been adapted to suit the way management alternatives are handled in Heureka (decision variables are defined for complete treatment schedules instead of single treatment activities). To formulate and EARM-model, select Add Opening Size Constraints from menu Optimization. &lt;br /&gt;
&lt;br /&gt;
To use this functionality, you must have provided a [[Import_of_forest_map_and_background_image | forest map]].&lt;br /&gt;
There is a built-in function to compute adjacency pairs, and enumeration of harvest blocks (combinations of polygons) that meet a given maximum opening size tolerance. (The computed adjacency pairs and their common border lengths can also be used in user-defined spatial constraints such as a URM (Unit Restriction Model)). The program can then calculate all feasible combinations of treatment units (that form harvest clusters), compute all so called cliques, and all constraints necessary. For more info, see &amp;lt;ref name=&amp;quot;Goycoolea&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A very fast algorithm has been developed in Heureka to compute what Goycoolea et al (2005) refer to as cliques and clusters.&lt;br /&gt;
&lt;br /&gt;
====Linking management in partial set-asides to parent stands====&lt;br /&gt;
*Partial set-asides (hänsynsytor) within stands can be handled as separate treatment units, in which no harvest activities are carried out. The development in such set-asides is in reality affected by the surroundings in the way that the risk of mortality increases in the set-aside after clear-cutting the main stand. In PlanWise, you can let the program generate alternatives for the set-aside area for each management program generated for the main stand, let the mortality be affected by when and if clear-cutting takes place in the main stand, and also choose to link nature conservation management activities to coincide with management activities in the parent stand. This is non-default, by default only one alternative is generated for the set-aside. If choosing the non-default optiona link between the set-aside and the main stand is added automatically to the optimization model. Read more here: http://heurekaslu.se/help/index.html?naturvardsatgarder.htm, section &amp;quot;Lämnande av hänsynsytor&amp;quot; (only in Swedish).&lt;br /&gt;
&lt;br /&gt;
====Using neighborhood relations for habitat analyses====&lt;br /&gt;
Neighborhood areas can be calculated for each stand. This means that for a user-specified radius originating from the centroid of each stand, the area for every other stand that is overlapped by the circle is computed. This information can then be used in optimization models that take habitat area requirements into account (see [http://www.nrcresearchpress.com/doi/abs/10.1139/x10-232#.Uz5hhfmSx8E Öhman et. al 2011]). The necessary variables can be added to any optimization model, for modification of the habitat conditions to reflect the species of interest. &lt;br /&gt;
&lt;br /&gt;
The needed model parameters, variables, and constraints for including a habitat demands are pre-formulated in Heureka and can automatically be included in the model formulation of an optimization problem. This is done by adding neighbourhood constraints available in the optimization tab (Optimization / Add Neighborhood Constraints). After this is done the user must specify three parameters in the optimization model:&lt;br /&gt;
*the stand specific conditions that should be fulfilled before a stand qualifies as a habitat (the habitat condition parameter, habitatCondition[i,j,p), &lt;br /&gt;
*the amount of suitable habitat required within a stand's neighbourhood for the stand to be qualified as habitat (minHabitatAreaInNeighbourhood)&lt;br /&gt;
*the minimum proportion of the entire forest that should meet the habitat conditions in each period (minTotalHabitatAreaProportion)&lt;br /&gt;
Before solving the optimization problem, the user must also run the tool ”compute stand neighbourhood” to calculate the area of each other stand that is within the neighboring area of a stand. When this tool is executed the parameter standNeighbourhood is filled out.&lt;br /&gt;
&lt;br /&gt;
==Solving problems and saving optimization results==&lt;br /&gt;
When a problem has been formulated and is ready to be solved, and you have run the Treatment Program Generator (TPG), the problem is ready to be solved:&lt;br /&gt;
#Right-click in the optimization model tree view, and select &amp;quot;Compile and Solve&amp;quot;&lt;br /&gt;
#Select the TPG result that the optimization model will be solved for and click OK&lt;br /&gt;
#Wait until the solver has finished&lt;br /&gt;
&lt;br /&gt;
After solving, you will see the problem status in the output window (at the bottom). If you have obtained a feasible solution the solution status will be reported as &amp;quot;Optimal&amp;quot;. To be able to view the optimization results in [[User'27s_guide_to_PlanWise#Analyzing_Results | reports]], you must first '''save the optimization result'''. You do this by clicking on the button &amp;quot;Save Optimization Result&amp;quot;, at the top of the Optimization Model window.&lt;br /&gt;
&lt;br /&gt;
====Infeasible solution?====&lt;br /&gt;
If the problem status is Infeasible, no solution has been found. There are two main reason why this may occur:&lt;br /&gt;
*There is some error in the optimization model.&lt;br /&gt;
*No solution exists. The constraints are too severe. &lt;br /&gt;
&lt;br /&gt;
To identify the cause of the problem, include constraints, one by one, in a systematic order. Try to solve the problem after including each constraint.&lt;br /&gt;
;Note: Do not exclude the constraint &amp;quot;maxArea&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Importing optimization solutions from external sources==&lt;br /&gt;
You can use an external analytics software to solve your optimization problem outside the interface of PlanWise, for example AIMMS, AMPL, Python or R. It is then possible to import that solution to PlanWise, for example to use the report tool to build charts. See the Help for further instructions.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Optimization&amp;diff=10974</id>
		<title>Optimization</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Optimization&amp;diff=10974"/>
		<updated>2024-11-26T09:28:32Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:User's Guides]]&lt;br /&gt;
[[Category:Optimization]]&lt;br /&gt;
&lt;br /&gt;
==New help documentation==&lt;br /&gt;
See also {{HeurekaHelpLinkEng}}optimering.htm , under construction.&lt;br /&gt;
&lt;br /&gt;
==About the optimization tool==&lt;br /&gt;
====Assignment problem====&lt;br /&gt;
The optimization problem solved in Heureka can be categorized as an '''assignment problem''': Each treatment unit should be assigned a treatment schedule.  The problem types handled are linear programming (LP) and 0/1 mixed-integer linear programming (MIP or MILP). The difference between the two is how treatment schedules are assigned. If a treatment unit can be assigned one and only one alternative, then the associated decision variables are set to binary (by the user). If the management of a treatment unit can be &amp;quot;split&amp;quot; and spatial integrity is not an issue, then these variables can be treated as continuous variables (default). In this case the value of the decision variables refers to the proportion of treatment unit area that should be managed with a certain schedule. More information on decision variables is given below.&lt;br /&gt;
&lt;br /&gt;
====ZIMPL====&lt;br /&gt;
For PlanWise a very flexible optimization tool is built-in for formulating and solving LP and MIP problems. The optimization tool is basically a graphical user interface to the [http://zimpl.zib.de/ ZIMPL optimization modelling language]. For solving a problem, external third-party solvers are used and directly linked to the optimization tool. Currently, the solvers available are listed below:&lt;br /&gt;
&lt;br /&gt;
====Solvers====&lt;br /&gt;
For solving a problem, external third-party solvers are used and directly linked to the optimization tool. Currently, the solvers available are &lt;br /&gt;
&lt;br /&gt;
*[https://www.coin-or.org/ CoinOR CLP/CBC], which is freely available under the Eclipse public license v 2.0 and included in the Heureka installation. &lt;br /&gt;
*[https://soplex.zib.de SoPlex], which is freely available for academic use. You will need the SCIP Windows binary (exe) file (&amp;quot;SCIP version 3.0 (Windows/PC 64 bit)&amp;quot; has been tested with Heureka), and specify the path under Settings. &lt;br /&gt;
*[https://www.gurobi.com Gurobi&amp;lt;sup&amp;gt;&amp;amp;reg;&amp;lt;/sup&amp;gt;], versions 9.0 - 12.0&lt;br /&gt;
*[https://www.ibm.com/support/pages/how-do-i-download-cplex-optimization-studio?mhsrc=ibmsearch_a&amp;amp;mhq=cplex IBM CPLEX&amp;lt;sup&amp;gt;&amp;amp;reg;&amp;lt;/sup&amp;gt;], version 22.1.0 &lt;br /&gt;
*[https://www.mosek.com MOSEK&amp;lt;sup&amp;gt;&amp;amp;reg;&amp;lt;/sup&amp;gt;], version 7-8.1&lt;br /&gt;
*[https://www.fico.com/en/products/fico-xpress-solver FICO Xpress&amp;lt;sup&amp;gt;&amp;amp;reg;&amp;lt;/sup&amp;gt;], version 7.9&lt;br /&gt;
&lt;br /&gt;
CPLEX, Gurobi, Xpress and MOSEK are very efficient, state-of-the-art solvers. They require a license, which can be obtained for free for academic use. These solvers must be obtained and installed by the user, they are not distributed with the Heureka install package.&lt;br /&gt;
&lt;br /&gt;
CoinOR CLP/CBC is an efficient free alternative and performs well in benchmarks.  &lt;br /&gt;
&lt;br /&gt;
LpSolve is no longer supported (from version 2.20).&lt;br /&gt;
&lt;br /&gt;
====Integration with prognosis data====&lt;br /&gt;
The optimization model is linked to a Heureka-formatted SQL Server database used for storing input data, simulation data, and result data. This enables a seamless integration with the input data required by the optimization model, as well as direct presentation of optimization results in the form of tables, graphs, and maps. This simplifies the analysis and visualization of scenarios or plans of forest development and outputs.  &lt;br /&gt;
&lt;br /&gt;
==Settings==&lt;br /&gt;
{{:Optimization_Settings}}&lt;br /&gt;
&lt;br /&gt;
==Managing models==&lt;br /&gt;
A standard optimization model is distributed with the program. There is also the opportunity to create a new model from scratch, or to use a wizard guide to taylor an optimization model with some of the most common objective functions and restrictions. All these models can then be further modified and saved by the user.&lt;br /&gt;
&lt;br /&gt;
To create and save models, used the buttons at the top of Optimization Model window, or the Model Wizard button in the Models section further down in the same window.&lt;br /&gt;
&lt;br /&gt;
For more info on the Model Wizard, please confer [https://www.heurekaslu.se/help/en/index.htm?model_wizard.htm the Heureka Help]&lt;br /&gt;
&lt;br /&gt;
==Editing an optimization model==&lt;br /&gt;
====Sets====&lt;br /&gt;
When you create a new model, the following set are added automatically:&lt;br /&gt;
* treatmentUnits: Set of all treatment units. Index = i.&lt;br /&gt;
* alternatives: Set of all management schedule numbers. Index = j. Note: Alternative j for one treatment unit has nothing to with alternative j for another unit. The number of available j:s varies between treatment units.&lt;br /&gt;
* periods: Time periods. Index = p. The length of a period is five years in strategic planning, and one year in tactical planning.&lt;br /&gt;
* rowNo: Index for the treatment number in a time period that a treatment unit alternative refers to.&lt;br /&gt;
&lt;br /&gt;
When adding opening size constraints (from the menu Optimization &amp;gt; Add Opening Size Constraint), additional sets are added.&lt;br /&gt;
&lt;br /&gt;
You can also add arbitrary sets manually, for e.g. organizational units, road ID columns, and so on.&lt;br /&gt;
&lt;br /&gt;
====Decision variables====&lt;br /&gt;
When you create a new model, some basic problem elements are added automatically (the sets and some constraints), including the most important decision variables. The decision variable &amp;lt;code&amp;gt;x[i,j] &amp;lt;/code&amp;gt; is always added:&lt;br /&gt;
&lt;br /&gt;
x[i,j] = proportion of the area of treatment unit ''i'' that is managed with management schedule ''j''.&lt;br /&gt;
&lt;br /&gt;
By default, the x[i,j] variables are continuous (non-integer) and bounded between 0 and 1. You can change the variable to binary (0/1-integer) by changing its RangeType to Binary, thus changing the problem type from LP to MIP.&lt;br /&gt;
&lt;br /&gt;
A constraint called &amp;lt;code&amp;gt;maxArea &amp;lt;/code&amp;gt; is also added automatically. It ensures that the area managed for each treatment unit is correct, so that the whole area (no more and no less) is assigned a schedule. Each treatment unit must be fully assigned a management. &amp;quot;No management&amp;quot; may be counted as an alternative, depending on what control categories are used when generating the alternative with the Treatment Program Generator.&lt;br /&gt;
&lt;br /&gt;
====Adding an accounting variable====&lt;br /&gt;
Accounting variables are preferrably added to the optimization model to improve readability and simplify the writing of constraints. An accounting variable is ''defined'' - it is a function of other decision variables in the model. The definition is actually an equality constraint in the the optimization model. &lt;br /&gt;
&lt;br /&gt;
One example of a useful accounting variable is total harvested volume in a period. This variable can then be used in other constraints.&lt;br /&gt;
&lt;br /&gt;
To add an accounting variable:&lt;br /&gt;
# In the Optimization Model window, right-click in the &amp;quot;Variables&amp;quot; section and Select &amp;quot;Add new variable&amp;quot;&lt;br /&gt;
# Right-click on the variable and change its name from &amp;lt;code&amp;gt;&amp;quot;DefaultName...&amp;quot;&amp;lt;/code&amp;gt; to something more proper, in the example below &amp;lt;code&amp;gt;volTot&amp;lt;/code&amp;gt;.&lt;br /&gt;
# To define an indexed variable, for example to have one variable for each time period, click on Data binding &amp;gt; Sets, and add the index set, for example &amp;quot;periods&amp;quot;. After that the variable name should have a suffix (&amp;lt;code&amp;gt;[p]&amp;lt;/code&amp;gt;).&lt;br /&gt;
# In the syntax window, type the definition with the the expression on the left side and the name of the variable on the right-hand side of an equality-symbol marked as &amp;lt;code&amp;gt;&amp;quot;==&amp;quot;&amp;lt;/code&amp;gt;. Example: An ccounting variable for total stand volume is defined, with an index p for time period. Note that before adding the variable, the parameter &amp;lt;code&amp;gt;volume[i,j,p]&amp;lt;/code&amp;gt; (which is linked to the Heureka result variable Forest Data.Volume Before) must have been added. Syntax:&lt;br /&gt;
#:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;FORALL &amp;lt;p&amp;gt; IN periods DO &amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
#:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt; SUM &amp;lt;i,j&amp;gt; IN treatmentunits * alternatives WITH altIncluded[i,j] == 1:&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
#:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt; volume[i,j,p] * area[i] * x[i,j] == volTot[p]; &amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
'''Important!''' By default, a variable (decision or accounting) has the property RangeType set to non-negative. This means that negative values are considered infeasible. For example, a volume cannot be negative. However, some accounting variables should  be allowed to take negative values, for example the net revenue in a period can be negative if costs are larger than revenues. In this case you must change its RangeType to &amp;quot;All&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====Adding a parameter which is linked to a prognosis variable ====&lt;br /&gt;
The coefficients in the LP-models (the coefficient matrix is usually denoted as '''A''') are constant values in the optimization model. In Heureka, these coefficients are generated by the Treatment Program Generator and referred to as Heureka result variables. A coefficient may represent for example stand volume for a given treatment unit, management schedule alternative, and time period.&lt;br /&gt;
Hence, stand volume is a variable in a prognosis, but a constant/parameter in the optimization model. &lt;br /&gt;
&lt;br /&gt;
# In the Optimization Model window, right-click in the &amp;quot;Parameters&amp;quot;-section and Select &amp;quot;Add new parameter&amp;quot;&lt;br /&gt;
# Type a name, for example &amp;quot;pulpWood&amp;quot; (without apostrophes)&lt;br /&gt;
# Let &amp;quot;Heureka result variable&amp;quot; be selected&lt;br /&gt;
# Click Next&lt;br /&gt;
# Select Financial Value &amp;gt; PulpWood Volume Total (if this is the variable you are interested in)&lt;br /&gt;
# Click Finish&lt;br /&gt;
&lt;br /&gt;
To check what Heureka variable a certain parameter is linked to:&lt;br /&gt;
# Select the parameter&lt;br /&gt;
# In the Properties window for the parameter (under the syntax window), under Databinding &amp;gt; ResultProperty, you can see what Heureka variable the parameter is bounded to. If you click on it you can change the binding.&lt;br /&gt;
&lt;br /&gt;
====Adding a parameter that has a definition====&lt;br /&gt;
# In the Optimization Model window, right-click in &amp;quot;Parameters&amp;quot; section and Select &amp;quot;Add new parameter&amp;quot;&lt;br /&gt;
# Type a name, for example &amp;quot;totalArea&amp;quot; (without apostrophes)&lt;br /&gt;
# Select &amp;quot;Formula&amp;quot; as parameter type&lt;br /&gt;
# Click Next&lt;br /&gt;
# In the syntax window, type the defiintion, for example &lt;br /&gt;
#:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;sum &amp;lt;i&amp;gt; in treatmentunits: area[i];&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  &lt;br /&gt;
#:(This can be edited later)&lt;br /&gt;
# Click Finish&lt;br /&gt;
&lt;br /&gt;
;Note 1: When defining an accounting variable (see above), you would also add a definition to the variable itself, such as &amp;lt;code&amp;gt;== VariableName&amp;lt;/code&amp;gt;. For a defined parameter, you only type the expression.&lt;br /&gt;
;Note 2: A shortcoming of a parameter with a formula is that you cannot preview its value.&lt;br /&gt;
&lt;br /&gt;
====Adding a constraint====&lt;br /&gt;
# In the Optimization Model window, right-click in &amp;quot;Constraints&amp;quot; and select &amp;quot;Add new constraint&amp;quot;&lt;br /&gt;
# Type a name, for example &amp;quot;MinOldForestArea&amp;quot; (without apostrophes)&lt;br /&gt;
# Click OK&lt;br /&gt;
# Select the constraint in the model tree and type the definition in the syntax window. For example, to add a constraint to ensure a non-declining harvest over time, you would type:&lt;br /&gt;
#:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;forall &amp;lt;p&amp;gt; in periods with p &amp;gt;= 1 : TotalHarvestVolume[p] &amp;gt;= TotalHarvestVolume*[p-1];&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  &lt;br /&gt;
#:(If you have defined an accounting variable for total harvest volume)&lt;br /&gt;
# Click Finish&lt;br /&gt;
&lt;br /&gt;
;Note: For constraints, you do not add indices explicitly as you do with variables. In the example, we do not add &amp;quot;p&amp;quot; for periods, but the &amp;quot;forall&amp;quot;-statement will take care of generating one constraint for each time period.&lt;br /&gt;
&lt;br /&gt;
;Tip: Use accounting variables in constraints to simplify reading and formulating the model, as well as to minimize problem size (considerably fewer coefficients and only a few additional variables).&lt;br /&gt;
&lt;br /&gt;
====Adding opening size constraints====&lt;br /&gt;
The generation of an EARM-model (see Goycoolea et al 2005) &amp;lt;ref name=&amp;quot;Goycoolea&amp;quot;&amp;gt; Goycoolea, M., Murray, A. T., Barahona, F., Epstein, R., Weintraub, A. 2005. Harvest scheduling subject to maximum area restrictions: Exploring exact approaches. Operations Research, 2005. Volume 53. Number 3.[http://mgoycool.uai.cl/papers/mgw04.pdf]&amp;lt;/ref&amp;gt;&lt;br /&gt;
is automated. The original model have been adapted to suit the way management alternatives are handled in Heureka (decision variables are defined for complete treatment schedules instead of single treatment activities). To formulate and EARM-model, select Add Opening Size Constraints from menu Optimization. &lt;br /&gt;
&lt;br /&gt;
To use this functionality, you must have provided a [[Import_of_forest_map_and_background_image | forest map]].&lt;br /&gt;
There is a built-in function to compute adjacency pairs, and enumeration of harvest blocks (combinations of polygons) that meet a given maximum opening size tolerance. (The computed adjacency pairs and their common border lengths can also be used in user-defined spatial constraints such as a URM (Unit Restriction Model)). The program can then calculate all feasible combinations of treatment units (that form harvest clusters), compute all so called cliques, and all constraints necessary. For more info, see &amp;lt;ref name=&amp;quot;Goycoolea&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A very fast algorithm has been developed in Heureka to compute what Goycoolea et al (2005) refer to as cliques and clusters.&lt;br /&gt;
&lt;br /&gt;
====Linking management in partial set-asides to parent stands====&lt;br /&gt;
*Partial set-asides (hänsynsytor) within stands can be handled as separate treatment units, in which no harvest activities are carried out. The development in such set-asides is in reality affected by the surroundings in the way that the risk of mortality increases in the set-aside after clear-cutting the main stand. In PlanWise, you can let the program generate alternatives for the set-aside area for each management program generated for the main stand, let the mortality be affected by when and if clear-cutting takes place in the main stand, and also choose to link nature conservation management activities to coincide with management activities in the parent stand. This is non-default, by default only one alternative is generated for the set-aside. If choosing the non-default optiona link between the set-aside and the main stand is added automatically to the optimization model. Read more here: http://heurekaslu.se/help/index.html?naturvardsatgarder.htm, section &amp;quot;Lämnande av hänsynsytor&amp;quot; (only in Swedish).&lt;br /&gt;
&lt;br /&gt;
====Using neighborhood relations for habitat analyses====&lt;br /&gt;
Neighborhood areas can be calculated for each stand. This means that for a user-specified radius originating from the centroid of each stand, the area for every other stand that is overlapped by the circle is computed. This information can then be used in optimization models that take habitat area requirements into account (see [http://www.nrcresearchpress.com/doi/abs/10.1139/x10-232#.Uz5hhfmSx8E Öhman et. al 2011]). The necessary variables can be added to any optimization model, for modification of the habitat conditions to reflect the species of interest. &lt;br /&gt;
&lt;br /&gt;
The needed model parameters, variables, and constraints for including a habitat demands are pre-formulated in Heureka and can automatically be included in the model formulation of an optimization problem. This is done by adding neighbourhood constraints available in the optimization tab (Optimization / Add Neighborhood Constraints). After this is done the user must specify three parameters in the optimization model:&lt;br /&gt;
*the stand specific conditions that should be fulfilled before a stand qualifies as a habitat (the habitat condition parameter, habitatCondition[i,j,p), &lt;br /&gt;
*the amount of suitable habitat required within a stand's neighbourhood for the stand to be qualified as habitat (minHabitatAreaInNeighbourhood)&lt;br /&gt;
*the minimum proportion of the entire forest that should meet the habitat conditions in each period (minTotalHabitatAreaProportion)&lt;br /&gt;
Before solving the optimization problem, the user must also run the tool ”compute stand neighbourhood” to calculate the area of each other stand that is within the neighboring area of a stand. When this tool is executed the parameter standNeighbourhood is filled out.&lt;br /&gt;
&lt;br /&gt;
==Solving problems and saving optimization results==&lt;br /&gt;
When a problem has been formulated and is ready to be solved, and you have run the Treatment Program Generator (TPG), the problem is ready to be solved:&lt;br /&gt;
#Right-click in the optimization model tree view, and select &amp;quot;Compile and Solve&amp;quot;&lt;br /&gt;
#Select the TPG result that the optimization model will be solved for and click OK&lt;br /&gt;
#Wait until the solver has finished&lt;br /&gt;
&lt;br /&gt;
After solving, you will see the problem status in the output window (at the bottom). If you have obtained a feasible solution the solution status will be reported as &amp;quot;Optimal&amp;quot;. To be able to view the optimization results in [[User'27s_guide_to_PlanWise#Analyzing_Results | reports]], you must first '''save the optimization result'''. You do this by clicking on the button &amp;quot;Save Optimization Result&amp;quot;, at the top of the Optimization Model window.&lt;br /&gt;
&lt;br /&gt;
====Infeasible solution?====&lt;br /&gt;
If the problem status is Infeasible, no solution has been found. There are two main reason why this may occur:&lt;br /&gt;
*There is some error in the optimization model.&lt;br /&gt;
*No solution exists. The constraints are too severe. &lt;br /&gt;
&lt;br /&gt;
To identify the cause of the problem, include constraints, one by one, in a systematic order. Try to solve the problem after including each constraint.&lt;br /&gt;
;Note: Do not exclude the constraint &amp;quot;maxArea&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Importing optimization solutions from external sources==&lt;br /&gt;
You can use an external analytics software to solve your optimization problem outside the interface of PlanWise, for example AIMMS, AMPL, Python or R. It is then possible to import that solution to PlanWise, for example to use the report tool to build charts. See the Help for further instructions.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Install_database&amp;diff=10971</id>
		<title>Install database</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Install_database&amp;diff=10971"/>
		<updated>2024-11-26T09:19:19Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages|Install_database}}&lt;br /&gt;
&lt;br /&gt;
See http://heurekaslu.org/help/en/index.html?skapa_databas.htm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
==Create new or demo database==&lt;br /&gt;
PlanStart version 1.0.3 and later lets you [[Create Forest Database | create a database]] automatically.&lt;br /&gt;
&lt;br /&gt;
==Install existing database==&lt;br /&gt;
&lt;br /&gt;
You can install an existing database either locally on &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt; or on a central server (like &amp;lt;code&amp;gt;server1.mycompany.com&amp;lt;/code&amp;gt;). It is assumed that you have [[Install SQL Server | installed]] or have access to SQL Server.&lt;br /&gt;
&lt;br /&gt;
'''Prerequisite''': A backup file (. Bak) from an existing database.&lt;br /&gt;
Use the &amp;quot;Restore&amp;quot; function i SQL Server Management Studio to install the database:&lt;br /&gt;
# Open Management Studio. Enter the server name (localhost, localhost\SQLExpress, or the server name).&lt;br /&gt;
# Right click on &amp;quot;Databases&amp;quot;, select &amp;quot;New Database ...&amp;quot; and enter a name for the new database (no blanks or spaces)&lt;br /&gt;
# Right-click the new database, select &amp;quot;Tasks&amp;quot; &amp;gt; &amp;quot;Restore&amp;quot; &amp;gt; &amp;quot;Database ...&amp;quot;. &lt;br /&gt;
# As the source, select &amp;quot;From device&amp;quot; and &amp;quot;...&amp;quot;-button. Click &amp;quot;Add&amp;quot;, and locate the backup-file.&lt;br /&gt;
# Check &amp;quot;Restore&amp;quot; for both files (including log-file if it exists)&lt;br /&gt;
# In &amp;quot;Options&amp;quot;, select &amp;quot;Overwrite ...&amp;quot; and change the &amp;quot;Restore as ...&amp;quot; to valid paths (folders must exist on your computer if you install locally, and on the server if you install on a remote server.&lt;br /&gt;
&lt;br /&gt;
'''Alternative:''' Install an .mdf file via the &amp;quot;Attach&amp;quot;-option in SQL Server Management Studio.&lt;br /&gt;
 &lt;br /&gt;
This alternative is available if you have an -mdf-file instead of a backup (.bak) file.&lt;br /&gt;
# Open Management Studio. Enter the server name (localhost, localhost\SQLExpress, or the server name).&lt;br /&gt;
# Right click on &amp;quot;Databases&amp;quot;, select &amp;quot;New Database ...&amp;quot; and enter a name for the new database (no blanks or spaces)&lt;br /&gt;
# Right click on &amp;quot;Databases&amp;quot; and select &amp;quot;Attach&amp;quot;.&lt;br /&gt;
# Click &amp;quot;Add&amp;quot; and select the .ndf file.&lt;br /&gt;
# In the &amp;quot;Database details', check and if necessary edit the file path to valid ones.&lt;br /&gt;
&lt;br /&gt;
[[Category:Reference Manual]]&lt;br /&gt;
[[Category:Software]]&lt;br /&gt;
[[Category:Install]]&lt;br /&gt;
[[Category:Database]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Version_2.0.0&amp;diff=10966</id>
		<title>Version 2.0.0</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Version_2.0.0&amp;diff=10966"/>
		<updated>2024-11-26T08:16:10Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Version 2.0.0.0&lt;br /&gt;
{{Languages|Version 2.0.0}}&lt;br /&gt;
[[Category:Release]]&lt;br /&gt;
[[Newsdate::2014-04-04]] [[language::en| ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
==Summary==&lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
*Version 2 represents a more well-tried program. &lt;br /&gt;
*Several efforts have been made to improve and simplify the user interface. &lt;br /&gt;
*Some changes of the growth and yield functions have been implemented, and you should expect slight changes of results, even if you run an identical analysis and on the same data. &lt;br /&gt;
*There is now a possibility to take into account price- and cost changes over time.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
====Important note!====&lt;br /&gt;
For already imported stand registers that have been used as input data (and not only to link with existing data), it is recommended that you '''re-simulate the forest data via menu Data Management &amp;gt; Stand Register &amp;gt; Simulate Treelist (Datahantering &amp;gt; Beståndsregister &amp;gt; Simulera träddata).''' As a result, the tree ages and heights for young stands will be more consistent with the input data.&lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(see [[#Improved handling of mean age in young stands|section below]])&lt;br /&gt;
[[image:SimulateTreeList.png|400px|none]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
==Changes in the user interface ==&lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====First steps to simplified use: Hiding seldom used parameters ====&lt;br /&gt;
There is indeed an overwhelming number of parameters that confront the user of a Heureka application. Therefore, a simplified view of the so called control tables is now available. By choosing this, you will only see a subset of parameters, those we consider the most important for normal users to have access to. You can also customize what parameters to display in the simplifed view. You can change freely between Advanced and Simplified View, it is only how and what parameters are displayed that is affected. You can access the simplifed view via menu Settings &amp;gt; Advanced/Simplified View. When using Simplified View, only one table is displayed for each control category, instead of one table for each control table in the control category. A table will show all parameters with non-default values, and all parameters that have been added to the simplified view.&lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
see [http://heurekaslu.org/help/index.html?detaljerad_eller_foerenklad_vy.htm help documentation]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
====Modified start page ====&lt;br /&gt;
The start page has been redesigned and displays news from SHa and release notes.   &lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
====Project page removed ====&lt;br /&gt;
The project page contained information on the name of the project and the database connections. This information has been moved to the start page and the project page has been removed.    &lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
====Modified page for Initial State Overview====&lt;br /&gt;
In PlanWise and RegWise, the Intial State Overview page  has been redesigned and shows more diagrams than before. You can also copy data from the page to Excel.&lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
====Improved display of forest domain contents====&lt;br /&gt;
In PlanWise and RegWise, the visual structure of the contents of a forest domain has been improved, so that is easier to distinguish between conditions and control category connections.&lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Possibility to add comment to forest domain====&lt;br /&gt;
In PlanWise and RegWise, you can add comments to a forest domain. Just right-click on a forest domain and select Edit/Show comment.&lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====More symbols and line colors====&lt;br /&gt;
In StandWise, PlanWise and RegWise, graph symbols and lines have more variation.&lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Settings dialog collects application settings in one place ====&lt;br /&gt;
From menu Tools, you can open the Settings-dialog (meny Vertyg &amp;gt; Inställningar). It contains performance settings, log file settings, settings for what control tables should be added to new control categories by default, user interface settings (language, simplified view), and optimization settings (default solver and solver settings). &lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
==Growth-and yield model changes==&lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
====Changed default choice for growth model====&lt;br /&gt;
The default choice of using a whole stand growth model for calibrating the single-tree calculations is inactivated when creating a new project. This parameter is found in control table Production Model as &amp;quot;Growth Model Whole-Stand&amp;quot;, and has been changed to &amp;quot;None&amp;quot;, meaning that Björn Elfving's single-tree functions are used alone, without calibrating them with the stand-level growth model. The reason is not more accurate growth predictions per se, the differences between the models are rather small, but the single-tree growth functions used alone gives a smoother transition from the young stand phase to the established phase, at least in numerous cases tried. &lt;br /&gt;
&lt;br /&gt;
The default function choice for calculating tree diameters for sapling trees (parameter &amp;quot;Sapling Diameter Model&amp;quot; in control table Production Model) has also been changed, from &amp;quot;NystromSoderberg&amp;quot; to &amp;quot;Elfving&amp;quot;, for the same reason. &lt;br /&gt;
&lt;br /&gt;
For existing projects, it is not critical to change these parameters, but if you do detailed stand-level analysis for example and find it annoying that the annual increment marks a drop or sudden increase when a stand leaves the young stand phase and enters the established phase, consider testing the new default settings.&lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
==== New mortality model ====&lt;br /&gt;
A new mortality model is available and used as default model in new project. For existing projects (created in previous program version), we recommend that you select this model instead. The model is called &amp;quot;Elfving&amp;quot; and is selected in control table Production Model. With the old model, mortality in non-dense stands have been calculated with a somewhat &amp;quot;primitive&amp;quot; model (Göte Bengtsson 1978), with a fixed mortality precentage for each species. The new model is a single-tree model based on a large set of NFI-data (Rikskogstaxeringens data). The new model also replaces the single-tree mortality model by Fridman &amp;amp; Ståhl which has been used until now to distribute mortality to trees. The latter is in it basic form a stochastic model, while the new one is determinstic, and therefore better suited for Heureka. &amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
==== Improved handling of mean age in young stands ====&lt;br /&gt;
For already imported stand registers that have been used as input data (and not only to link with existing data), it is recommended that you '''re-simulate the forest data via menu Data Management &amp;gt; Stand Register &amp;gt; Simulate Treelist (Datahantering &amp;gt; Beståndsregister &amp;gt; Simulera träddata).''' As a result, the tree ages and heights for young stands will be more consistent with the input data.&lt;br /&gt;
&lt;br /&gt;
For an established stand, Heureka calculates the mean age (variable &amp;quot;ForestData.MeanAge excl overstorey&amp;quot;) as the basal area weighted mean age of the trees. For a young stand, the variable is calculated as a weighted arithmetic mean age, where the calculated probabilities for crop trees (beräknade huvudstamssannolkheter) are used as weights. In established stands (mean height ≥ 7 m), tree ages are by default calibrated so that the calculated mean age and the mean age imported (for example from the stand register) are the same. This calibration has not been applied for young stands. The reason for this is that the imported mean age for young stands has not been used if a mean height has been available. In that case, the mean age has been based on the calculated sapling ages, which in turn depend on tree heights and site index. This have resulted in a more model-driven than data-driven approach, which is probably good since data for young stands are often reported as very uncertain. If relying too much on the age/height relation in young stands, there is a risk that the calculated growth for young stands with a large height/age ratio is overestimated. In stands where there have been a few years of large height growth, these few years constitute a large part of the total age of the stand and will affect growth much more in relative terms than is the case for an older stand. As a drawback, the ages for young stands calculated in Heureka have often differed from the mean ages in the stand register. Several measures has been taken to handle this, and some more will be available later this year in version 2.1. &lt;br /&gt;
*One change is that by default, mean heights for young stands are ignored when simulating tree list. When simulating tree lists from stand register data, you will find a new check box &amp;quot;Let system automatically calculate tree heights for young stands&amp;quot;. The corresponding function is available when entering data manually, in the sapling simulator dialog you can choose &amp;quot;Calculate from age&amp;quot; (see Figure 2a and 2b). Using this option (which is default) will result in more robust height/age-relations in young stands, and smaller differences between stand register age and age calculated by Heureka.&lt;br /&gt;
*Sapling ages can now be calibrated so that the mean arithmetic age of main saplings should be close to the entered mean age of the stand. The use of this calibration is activated in control table ProductionModel, parameter Calibrate Age Young Stand, which is set to True in new projects. You should change this parameter when you open old projects. Before this calibration, the program projects the growth for the number of years that differs between the mean age calculated by the model (as a function of tree heights), and the entered mean age. &lt;br /&gt;
*Another improvement is that the start up of a young stand has been refined to better match the usage of five-year period lengths. When not using this function (by unchecking the check box), tree heights will be calibrated so that the mean height for each species is as close as possible to the entered mean height. &lt;br /&gt;
&lt;br /&gt;
The variable &amp;quot;ForestData.Stand Age&amp;quot; (see above) could also be useful when the mean ages calculated in Heureka are not consistent with those in the register data.  Heureka creates a tree list not until the mean height is 2 m. For smaller stands, a &amp;quot;waiting&amp;quot; period is used, and once the period is reached when the stand is at least 2 m, the stand is &amp;quot;activated&amp;quot;.&lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:PlantSimulatorDialog_CalculateFromAge.png|400px|thumb|none|Figure 2a. You can select whether the mean height of a young should be calculated by the program based on the entered stand age, or retrieved from the entered value. ]]&lt;br /&gt;
[[Image:SimulateTreeDataFromStandRegister.png|600px|thumb|none|Figure 2b. You can select whether the mean height of a young should be calculated by the program based on the entered stand age, or retrieved from the entered value. ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
==== Sapling type ====&lt;br /&gt;
When entering data manually for a young stand, the sapling type origin and age when planted can be entered for each species. Using this feature does not currently affect results much, but is more a preparation for future refinements for the modelling of young stands and regeneration.    &lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
==== Modified implementation of fertilization effect ====&lt;br /&gt;
Growth response after fertilization is calculated with a model that predicts volume growth increase on a per ha basis on each sample plot. The way this growth increment is distributed to the trees has been modified to a more exact but also a simpler and faster solution. The growth response will be marginally different than in previous versions.&lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Price and costs changes==&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
==== Price and cost trends ====&lt;br /&gt;
You can evaluate your own assumptions on future changes in real costs and prices. You can do this by setting a time point and a cost or price adjustment factor that will apply from that time and onwards. You can define different price factors for timber, pulpwood and bio fuel, and different cost factors for different treatment activites. For price lists, an additional bucking (aptering) is applied, to get the correct output for the adjusted prices. Interpolation is applied to time periods between the start period and the time point you enter. &lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [http://heurekaslu.org/help/index.html?kontrolltabell_cost.htm Help documentation, chapter Kontrolltabell Cost, heading &amp;quot;Pris- och kostnadstrender&amp;quot;], and&lt;br /&gt;
[http://heurekaslu.org/help/index.html?prislistor.htm, Helpdocumentation, chapter Prislistor, heading &amp;quot;Pristrender&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
==== Price list length corrections as percentage or absolute values ====&lt;br /&gt;
Until now, price list length corrections have been defined as absolute price corrections (in SEK/m3fub). Now you can choose between absolute corrections or relative prices. The pricelist included for Mellanskog has been faulty, absolute corrections were assumed but relative prices had been entered in the table. &lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
Read more here: [http://heurekaslu.org/help/index.html?prislistor.htm Helpdocumentation, chapter Prislistor, heading &amp;quot;Timmerprislistor och kvalitetsutfall&amp;quot;, figure 1]&lt;br /&gt;
&lt;br /&gt;
==Other changes==&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
====TreatmentUnit.MinFinalFellingAge replaced with ForestData.Initial Min Final Felling Age====&lt;br /&gt;
Minimum final felling (LÅF) is calculated in each time period and management alternative and depends on regeneration species. The minimum final felling at the initial state has been available as result variable TreatmentUnit.MinFinalFellingAge. This has been moved to ForestData.MinFinalFellingAge. The result database is automatically updated, but if you use the old variable in report templates or optimization problem you must change the column mapping to the new variable. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
==== High stump retention ====&lt;br /&gt;
You can now take into account the retention of high stumps. Leaving high stumps will affect both harvest yields (decreased) and occurrence of dead wood (increased). You can set the height of high stumps in the price list. This will keep track of the timber value for a tree if it is left as a high stump. You must also activate the retention of high stumps via control table Nature Conservation. &lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
Read more here:&lt;br /&gt;
[http://heurekaslu.org/help/index.html?naturvardsatgarder.htm, Helpdocumentation chapter Naturvårdsåtgärder, heading &amp;quot;Lämnande av högstubbar&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
==== Amount of dead wood affected by final felling ====&lt;br /&gt;
When doing final felling, the harvesting and forwarding operations destroys a considerable part of the existing dead wood. In control table Dead Wood, the advanced user can modify how much of the existing dead wood (percentage) that is removed to the last decay class (4). It is also possible to define assumptions on to what extent dead wood in set-asides within a stand (hänsynsytor) is affected.&lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
==== New result variable &amp;quot;Stand Age&amp;quot; ====&lt;br /&gt;
Heureka calculates mean age (variable &amp;quot;ForestData.MeanAge excl overstorey&amp;quot;) as the basal area weighted mean age of trees in established stands. For a young stand, it is calculated as a weighted arithmetic mean age, where the calculated probabilities for crop trees (beräknade huvudstamssannolkheter) are used as weights. Typically, the calculated mean age does not increase by exactly the same value as the period length, since it is weighted. Also, the initial age may deviate from the input mean age, especially in young stands. Variable StandAge has been added to result category ForestData to represent age since regeneration (plus sapling age when planted which is currently hard-coded to 2 years). In period 0, it is the same as the input data, and then increases by five years per five-year period until final felling. &lt;br /&gt;
&lt;br /&gt;
The variable &amp;quot;ForestData.Stand Age&amp;quot; can be used in reports and in optimization problems. For example, you could replace ForestData.MeanAge with ForestData.Stand Age to keep track of the area of bare land or young forest allowed (in the optimization model).  &lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
==== Column names in tree list template used for variable mapping ====&lt;br /&gt;
The import routine for tree list data has been sensitive to the ordering of columns, but is now using the column names (in the same way as the import routine for a stand register). This makes the import less error-prone, but you must assure that the column names are correct. &lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
(see http://heurekaslu.org/help/index.html?importera_bestand_med_provytor.htm)&lt;br /&gt;
&lt;br /&gt;
==Help and support==&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== New help section - overview of user interface (Swedish only) ====&lt;br /&gt;
A new help section gives an overview of the user interface, with sub chapters for each application.&lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
see http://heurekaslu.org/help/test/index.html?oversikt_anvandargranssnitt.htm (only in Swedish)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
==== New user forum ====&lt;br /&gt;
A new user forum is available at &lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
http://heurekaslu.org/forum&lt;br /&gt;
&lt;br /&gt;
==Bug fixes ==&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
==== Bugfix: Report variable net annual growth after regeneration now consistent with forest-level reports====&lt;br /&gt;
After regeneration, result variable GrowthData.CAI net has been calculated as annual growth since since plantation, instead of change in standing stock between periods + harvested volume in previous period divided by number of years since last period. This is not a true error, but it has given missleading results when generating forest-level reports on mean annual increment. This has been fixed.  &lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bugfix: Contorta volume ====&lt;br /&gt;
When importing contorta sample trees from FMPP data (Indelningspaketet), the tree height calibration factors were faulty, because of a mix up in the translation of species codes. This affects calculations of contorta, oak and beech volumes and heights. Contorta tree heights have been calibrated with those for beech, and vice versa. If an area has contained contorta but not beech, the tree heights for contorta has not been calibrated, and vice versa. &lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
==== Bugfix: Web links in the help menu ====&lt;br /&gt;
Links to web page were faulty both in the help documentation and the in the programs.&lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
==== Bugfix: No additional thinnings were simulated when applying user-defined thinning proposal  ====&lt;br /&gt;
When applying imported thinning proposals, no more thinnings were simulated until final felling. This has been fixed.&lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;startFeed /&amp;gt;&lt;br /&gt;
==== Bugfix: Wrong treatment proposal code given in help documentation for final felling with seed trees  ====&lt;br /&gt;
This is not really a program bug, but a documentation error. The code for final felling with seed trees was defined as 16383 instead of 16384 on both the wiki and in the help documentation. This has been corrected. But the program has also been modified so that it recodes an imported treatment proposal code 16383 to 16384.&lt;br /&gt;
&amp;lt;feedDate&amp;gt;2014-04-04&amp;lt;/feedDate&amp;gt;&lt;br /&gt;
&amp;lt;endFeed /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Get_Started&amp;diff=10961</id>
		<title>Get Started</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Get_Started&amp;diff=10961"/>
		<updated>2024-11-25T15:53:25Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages|Get Started}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User's Guides]]&lt;br /&gt;
To get started quickly, you can follow the steps below.&lt;br /&gt;
&lt;br /&gt;
==Heureka Helpdoc== &lt;br /&gt;
You can find instructions on how to install SQL Server and Heureka here: {{HeurekaHelpLink}}&lt;br /&gt;
&lt;br /&gt;
==Run StandWise==&lt;br /&gt;
# Start StandWise (from Start &amp;gt; Program &amp;gt; SLU).&lt;br /&gt;
# Run the [[StandWise_Tutorial | StandWise tutorial]].&lt;br /&gt;
# For more information, see [[User's guide to StandWise]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
If you like, you can add new data to the databas (or to a new, empty database), by directly entering data for a stand in StandWise: &lt;br /&gt;
[[Mata_in_data_manuellt | Enter data manually In StandWise ]] (for the moment only available in Swedish)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Run PlanWise==&lt;br /&gt;
# Start PlanWise (from Start &amp;gt; Program &amp;gt; SLU).&lt;br /&gt;
# Run the [[PlanWise_Tutorial | PlanWise tutorial]].&lt;br /&gt;
# For more information see [[User's guide to PlanWise]].&lt;br /&gt;
&lt;br /&gt;
== Availability and Support ==&lt;br /&gt;
{{:Availability_and_Support}}&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Dialogue_Simulate_/_Generate_Treatment_Programs&amp;diff=10957</id>
		<title>Dialogue Simulate / Generate Treatment Programs</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Dialogue_Simulate_/_Generate_Treatment_Programs&amp;diff=10957"/>
		<updated>2024-11-25T15:32:54Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Control Tables|Dialogue Simulate / Generate Treatment Programs]]&lt;br /&gt;
[[Category:Control Tables]]&lt;br /&gt;
&lt;br /&gt;
In this dialogue, you can adjust simulation or treatment program generation settings prior to starting the process. For further usage tips and instructions, please see the Heureka Help. [[https://www.heurekaslu.se/help/en/index.html?skapa_skotselprog_planvis.htm]]&lt;br /&gt;
&lt;br /&gt;
== RegWise ==&lt;br /&gt;
&lt;br /&gt;
The following options and settings are available in the dialogue window Simulation:&lt;br /&gt;
&lt;br /&gt;
:'''Select Result Variables:''' Allows selection of which result variables to store in the result database.&lt;br /&gt;
:'''Start year simulation: (to be added)'''&lt;br /&gt;
:'''Reference year:''' Adjusts the year to which the underlying indata is projected.&lt;br /&gt;
:'''Simulation name (optional):''' Allows naming the simulation.&lt;br /&gt;
:'''Max periods:''' Sets the number of periods for which the simulation results will be stored.&lt;br /&gt;
:'''Random seed:''' &lt;br /&gt;
::The random seed is used in stochastic models if any stochastic models are enabled in the control tables. The random seed sets the order in which random numbers are drawn from random number generators. Thus, different seeds will generate different results from stochastic models. If the random seed is set to zero the seed itself will be randomly generated.&lt;br /&gt;
::The random seed will not affect the outcome of deterministic models.&lt;br /&gt;
&lt;br /&gt;
:'''Random seed Control Categories:''' Random seed for stochastically assigning treatment units within a forest domain to control categories.&lt;br /&gt;
:''' Discount rate (%):''' Real discount rate used for calculating net present values.&lt;br /&gt;
:''' Additional periods:''' (to be added)&lt;br /&gt;
:'''Log trees to file:''' Allows storing tree results to files for detailed analyses and scrutinizing.&lt;br /&gt;
&lt;br /&gt;
==PlanWise==&lt;br /&gt;
To be added.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====Dead Wood Classes====&lt;br /&gt;
:'''None:''' Upper volume limit (m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;/ha) to be classified as &amp;quot;no occurence&amp;quot; of downed dead wood.&lt;br /&gt;
:'''Low:''' Upper limit (m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;/ha) to be classified as &amp;quot;low occurence&amp;quot; of downed dead wood.&lt;br /&gt;
:'''High:''' Upper limit  (m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;/ha) to be classified as having &amp;quot;high occurence&amp;quot; of downed dead wood.&lt;br /&gt;
:If the volume is larger than the limit for High, the class is set to &amp;quot;Very High&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Soil damage ==&lt;br /&gt;
Settings for whether any soil damages should be regarded in the simulations, with respect to recreation.&lt;br /&gt;
&lt;br /&gt;
====Avoid Soil Damage====&lt;br /&gt;
:'''True''' means that harvesting should be donw with more carefulness to minimize soil damages. This will induce a cost. '''False''' if not.&lt;br /&gt;
&lt;br /&gt;
====Soil DamageCost====&lt;br /&gt;
:(only if Avoid Soil Damage = '''True''' is selected above)&lt;br /&gt;
:Cost, in SEK per m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;sk, of more careful harvests to avoid soil damages.&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=ControlTable_Treatment_Model&amp;diff=10954</id>
		<title>ControlTable Treatment Model</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=ControlTable_Treatment_Model&amp;diff=10954"/>
		<updated>2024-11-25T15:27:30Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Control Tables|Treatment Model]]&lt;br /&gt;
[[Category:Reference Manual]]&lt;br /&gt;
Overview of TreatmentModel control table parameters. &lt;br /&gt;
&amp;lt;br&amp;gt;For a more detailed description of the usage, see the [http://heurekaslu.org/help/en/index.html?simulering_av_atgarder.htm help documention] chapters on simulation of treatments, for example:&lt;br /&gt;
*Regeneration: [http://heurekaslu.org/help/en/index.html?foryngring.htm Regeneration help documention]&lt;br /&gt;
*Cleaning: [http://heurekaslu.org/help/en/index.html?rojning.htm Cleaning (precommercial thinning) help documention]&lt;br /&gt;
*Thinning: [http://heurekaslu.org/help/en/index.html?gallring.htm#Utforande Thinning help documention]&lt;br /&gt;
*Final felling: [http://heurekaslu.org/help/en/index.html?slutavverkning.htm#Utforande Final Felling help documention]&lt;br /&gt;
&lt;br /&gt;
In the treatment model control table you can configure how individual forest management activities are simulated.&lt;br /&gt;
&lt;br /&gt;
== Regeneration - model ==&lt;br /&gt;
Allows you to control how forest regenerations are simulated, regarding planting, natural regeneration using seed trees, and sowing.&lt;br /&gt;
&lt;br /&gt;
====Regeneration Model Type====&lt;br /&gt;
*Simulation: simulate regeneration from a Weibull distribution.&lt;br /&gt;
*Database: simulate regeneration by imputation of plot data from a database (supplied).&lt;br /&gt;
&lt;br /&gt;
== Regeneration - settings ==&lt;br /&gt;
&lt;br /&gt;
====Deterministic Application==== &lt;br /&gt;
:(only if '''Simulation''' is selected) '''True''' applies deterministic regeneration model components, '''False''' do not (then stochastic).&lt;br /&gt;
&lt;br /&gt;
====Mean Sapling Height When Activated==== &lt;br /&gt;
(only if '''Simulation''' is selected)&lt;br /&gt;
:Defines the arithmetic mean height in meters at stand-level[plot-level?] when trees are initiated, for '''Natural regeneration''', '''Sowing''', '''Spruce plantation''', '''Pine plantation''', and '''Contorta plantation''', respectively. Development before this height is obtained by linear interpolation.&lt;br /&gt;
&lt;br /&gt;
====Regeneration Year====&lt;br /&gt;
:Defines the number of years from time of final felling to time of regeneration, applied in simulations of '''Plantation''' and '''Sowing'''.&lt;br /&gt;
&lt;br /&gt;
====Regeneration Settings====&lt;br /&gt;
:Defines the number of seedlings per hectare applied in '''Plantation''' (or in '''Sowing''', or in '''Natural regeneration using seed trees''', respectively) following '''Soil scarification''' (or '''Controlled burning''', or '''None''', respectively), regarding the tree species and site index. This seedling consumption table will, obviously, lead to certain regeneration costs. &lt;br /&gt;
&lt;br /&gt;
====Soil Preparation Year====&lt;br /&gt;
:Defines the number of years from time of final felling to time of soil preparation, applied in simulations of '''Soil scarification''' and '''Controlled burning'''. Obviously, this number can not exceed settings in '''Regeneration Year'''.&lt;br /&gt;
&lt;br /&gt;
== Cleaning ==&lt;br /&gt;
Allows you to control how cleanings, a.k.a. pre-commercial thinnings, are simulated.&lt;br /&gt;
&lt;br /&gt;
====Cleaning Model====&lt;br /&gt;
:'''Heureka cleaning''' defines one model of tree removal, actually cutting of saplings, in the cleaning simulations.&lt;br /&gt;
:'''Hugin cleaning''' defines another model of tree removal, currently corresponding to the above, in the cleaning simulations.&lt;br /&gt;
&lt;br /&gt;
====Deterministic Application====&lt;br /&gt;
:'''True''' applies deterministic cleaning model components, '''False''' do not (then stochastic).&lt;br /&gt;
&lt;br /&gt;
====Mean Height Cleaning====&lt;br /&gt;
:'''Min''' defines the minimum arithmetic mean height in meters at stand-level when cleaning is simulated.&lt;br /&gt;
:'''Max''' defines the maximum arithmetic mean height in meters at stand-level when cleaning is simulated.&lt;br /&gt;
&lt;br /&gt;
====Min Stems Cleaned====&lt;br /&gt;
:Defines the minimum number of stems per hectare to be cut in cleanings. No cleaning will be simulated if stem density is so low that less stems are able to cut, regarding all current tree species.&lt;br /&gt;
&lt;br /&gt;
====Settings for Deciduous Trees====&lt;br /&gt;
:'''Alfa''' and '''Beta''' are coefficients in a function calculating the priority factor of deciduous tree species. Deciduous trees, i.e. all broadleaves, will then be retained in cleanings prior to coniferuous trees.&lt;br /&gt;
&lt;br /&gt;
====Settings for Pine====&lt;br /&gt;
:'''Alfa''' and '''Beta''' are coefficients in function calculating the priority factor of pine trees. Pines, i.e. ''Pinus ssp.'', will then be retained in cleanings prior to deciduous and other coniferuous trees.&lt;br /&gt;
&lt;br /&gt;
====Settings for Spruce====&lt;br /&gt;
:'''Alfa''' and '''Beta''' are coefficients in function calculating the priority factor of spruce trees. Spruces, i.e. ''Picea ssp.'' and ''Abies ssp.'', will then be retained in cleanings prior to deciduous and other coniferuous trees.&lt;br /&gt;
&lt;br /&gt;
== Thinning or Selection Felling ==&lt;br /&gt;
Settings in common for thinning and selection felling&lt;br /&gt;
&lt;br /&gt;
====Thinning Configuration====&lt;br /&gt;
Opens a dialog where you can select Thinning Algoritm and how different species should be prioritized. See [{{HeurekaHelpLinkEng}}gallring.htm Help doc on thinning settings]. &lt;br /&gt;
&lt;br /&gt;
The thinning algorithm that can be selected are:&lt;br /&gt;
:'''HuginOld''' Algorithm developed for the Hugin system. It uses three species groups, and groups trees into four diameter classes for each group. See [[Thinning]]&lt;br /&gt;
:'''Hugin''' Derived from HuginOld but allows you to specify more species groups, and explicit species distribution targets. The algorithm operates on a species group level in the same way as HuginOld. See [[Thinning]]&lt;br /&gt;
:'''LOEriksson''' defines another model of tree selection in the thinning simulations. You enter species groups in the same ways as with Hugin, but the thinning form (above/below) is entered using a relative diameter target value.&lt;br /&gt;
&lt;br /&gt;
The dialog contains parameters for how thinning should be distributed over trees and species, depending on the thinning algorithm chosen.&lt;br /&gt;
====Relative Diameter====&lt;br /&gt;
(only if '''LOEriksson''' is selected)&lt;br /&gt;
:'''First''' defines the relationship between the mean diameters of trees cut and trees retained in first thinning of a stand, expressed in percentage.  &lt;br /&gt;
:'''Second''' defines the relationship between the mean diameters of trees cut and trees retained in second and following thinnings of a stand, expressed in percentage.&lt;br /&gt;
&lt;br /&gt;
====Thinning Algorithm Parameters====&lt;br /&gt;
See [[Thinning Algorithm Parameters]]&lt;br /&gt;
&lt;br /&gt;
====Vary Thinning Grade====&lt;br /&gt;
:'''True''': thinning intensity is distributed over PredictionUnits (plots) proportionally to basal area. '''False''': Same thinning intensity on all plots in the treatment unit.&lt;br /&gt;
&lt;br /&gt;
====Min Diameter Cut====&lt;br /&gt;
:Defines the minimum diameter, in centimeters, of trees to be cut when thinning or selection felling.&lt;br /&gt;
&lt;br /&gt;
====Min Prop. Thinnable Plots====&lt;br /&gt;
:Min proportion of plots (impediment plots ignored) that should be thinned according to thinning guide in order for thinning to be applied. '''''Currently only available when Thinning Guide = StemDensity.'''''&lt;br /&gt;
&lt;br /&gt;
====Min Thinning Grade====&lt;br /&gt;
:Defines the minimum thinning grade required in order to apply a thinning, in percentage of basal area, stem density or volume (depending on thinning guide), including any cutting of strip roads. Is thinning grade accoring to guide is lesser, thinning is cancelled.&lt;br /&gt;
&lt;br /&gt;
====Max Thinning Grade====&lt;br /&gt;
:Defines the maximum thinning grade, in percentage of basal area, stem density or volume (depending on thinning guide), including any cutting of strip roads. If thinning guide suggest a larger thinning grade, it is set to Max Thinning Grade.&lt;br /&gt;
&lt;br /&gt;
====Thinning System====&lt;br /&gt;
:'''These parameters are only used in cost functions and should not be confused with settings for how a thinning should be simulated.'''&lt;br /&gt;
:*NotSpecified: defines that non specified thinning types should be simulated.&lt;br /&gt;
:*StripRoad: defines that thinnings with strip roads should be simulated.&lt;br /&gt;
:*StripRoadMidFieldMachine: defines that thinnings with harvester should be simulated.&lt;br /&gt;
:*StripRoadMidFieldChainsaw: defines that thinnings with harvester and manual labour (with chainsaw) should be simulated.&lt;br /&gt;
&lt;br /&gt;
====Harvest Striproads====&lt;br /&gt;
:'''True''' simulates the cutting of strip roads if a stand is thinned for the first time, '''False''' do not.&lt;br /&gt;
&lt;br /&gt;
====Effective Striproad Width====&lt;br /&gt;
:Defines the effective width of strip roads in meters. Effective means that the harvesting machines can thread (slingra sig fram). A &amp;quot;threading factor&amp;quot; (slingerfaktor) of 75 % gives an effective strip road width of 3 m with an actual strip road width of 4 m.&lt;br /&gt;
&lt;br /&gt;
====Distance Between Striproads====&lt;br /&gt;
:Defines the distance in meters between the centre of adjacent stip roads, used in simulation of the first thinning in a stand.&lt;br /&gt;
&lt;br /&gt;
== Thinning ==&lt;br /&gt;
Allows you to control how thinnings are simulated.&lt;br /&gt;
See [[Thinning]] for a complete description.&lt;br /&gt;
&lt;br /&gt;
====UMin==== &lt;br /&gt;
(only if '''LOEriksson''' is selected as thinning algorithm in Thinning Configuration Dialog)&lt;br /&gt;
:Defines the minimum proportion, regarding basal area, of a single tree of all trees cut at the plot-level, expressed in percentage and value range (0, 20). &lt;br /&gt;
&lt;br /&gt;
====UMax==== &lt;br /&gt;
(only if '''LOEriksson''' is selected as thinning algorithm in Thinning Configuration Dialog)&lt;br /&gt;
:Defines the maximum proportion, regarding basal area, of a single tree of all trees cut at the plot-level, expressed in percentage and value range (80, 100). &lt;br /&gt;
&lt;br /&gt;
====Thinning Guide====&lt;br /&gt;
:A thinning guide is used to determine whether thinning should or could be done, and the thinning intensity.&lt;br /&gt;
:'''Hugin''', '''Skogsstyrelsen''', '''Ingvar''', '''Logarithmic''' and '''Polynomial''' are defined for basal area.  &lt;br /&gt;
:'''StemDensity''' is defined for number of trees. &amp;lt;!--Only Thinning Algorithm = Hugin can handle stem density targets (as well as basal area and volume targets).--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Thinning Guide Hugin Settings&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;Thinning Guide SKS Settings&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;Thinning Guide Polynomial Settings&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;Thinning Guide Logarithmic Settings&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;Thinning Guide Ingvar Settings&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====Thinning Guide Settings====&lt;br /&gt;
:;All guides but StemDensity and Ingvar:Opens dialog with coefficients for thinning guide (such as site index and dominant height, respectively) used in calculations of the tree species' basal area, before and after thinning.&lt;br /&gt;
&lt;br /&gt;
:'''Thinning Guide Stem Dens. Beta:''' Setting for thinning guide &amp;quot;StemDensity&amp;quot;, parameter β = Domainant height at which first thinning should be done.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Thinning Guide Stem Dens. Delta&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
:'''Thinning Guide Stem Dens. Delta''':Setting for thinning guide &amp;quot;StemDensity&amp;quot;. This parameter controls slope of function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Ingvar Version for Pine, Larch and Contorta&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;Ingvar Version for Spruce&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
:'''Ingvar version''': Ingvar thinning guide (by Skogforsk) has different levels.&lt;br /&gt;
&lt;br /&gt;
====Max Relative Age====&lt;br /&gt;
:Time for last thinning in terms of maximum relative age. If relative age is larger, then no more thinning will be simulated. Relative age is an approximation for how close a stand is to culmination of mean annual growth (MAI). It is computed as mean age divided by 1.1*LSÅ, where LSÅ = minimum eligible age for final felling according to Swedish Forestry Act.&lt;br /&gt;
&lt;br /&gt;
====Min Height Thinning====&lt;br /&gt;
:Min dominant height required for thinning.&lt;br /&gt;
&lt;br /&gt;
====Max Height Any Thinning====&lt;br /&gt;
:Max dominant height (m) when last thinning can be applied. '''''Currently only available when Thinning Guide = StemDensity.'''''&lt;br /&gt;
&lt;br /&gt;
====Max Height First Thinning====&lt;br /&gt;
:Max dominant height (m) when first thinning can be applied. If dominannt height is larger and stand has never been thinned, then it is considered too late to do first thinning, due to risk of felling damages on remaining trees.&lt;br /&gt;
&lt;br /&gt;
====Thinning Guide Reduction Factors====&lt;br /&gt;
:Thinning guide reduction factors for upper and lower curve. Applies to basal area thinning guides. Example: 0.95 for upper curve means that upper curve is lowered by 5 percent. &lt;br /&gt;
&lt;br /&gt;
====Previously Thinned Threshold====&lt;br /&gt;
:Threshold for when stands of a given SIS is considered previously thinned if thinning history is not available. If stems/ha is lower than given value, stand is assumed to have been thinned.&lt;br /&gt;
&lt;br /&gt;
=====Pine Threshold=====&lt;br /&gt;
:Maximum stem density (stems/ha) in pine stands to consider them as previously thinned if thinning history is missing.&lt;br /&gt;
&lt;br /&gt;
=====Spruce Threshold=====&lt;br /&gt;
:Maximum stem density (stems/ha) in spruce stands to consider them as previously thinned if thinning history is missing.&lt;br /&gt;
&lt;br /&gt;
=====Other Threshold=====&lt;br /&gt;
:Maximum stem density (stems/ha) in deciduous stands to consider them as previously thinned if thinning history is missing.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
====Tolerance====&lt;br /&gt;
(only if '''LOEriksson''' is selected)&lt;br /&gt;
:Defines the maximum deviation between target and simulated thinning intensity, expressed in value range (0, 1), to be accepted at the plot-level[?].&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Understorey Max Diameter====&lt;br /&gt;
:Upper diameter limit for understorey trees in thinnings (cm). Trees with dbh lesser than this value will be considered understorey trees (in mature stands, not in plantations). Note: Setting this to 0 means that no trees will be considered understorey trees.&lt;br /&gt;
:Default: 8 cm&lt;br /&gt;
&lt;br /&gt;
====Understorey Cleaning Stems Threshold====&lt;br /&gt;
:Minimum understorey stem density required for understory cleaning to be performed (stems/ha). If the number of understorey stems is less than this parameter, no understorey cleaning will be performed, but the harvester cost may increase due to the hindrance of understorey. For example, with 4000 undestorey trees, the harvester productivity will decrease with 3 percent.&lt;br /&gt;
:Default: 800 st/ha&lt;br /&gt;
&lt;br /&gt;
====Min Understorey Stems Retained====&lt;br /&gt;
:Minimum number of understorey trees left when understorey cleaning is done.&lt;br /&gt;
:Default: 200 st/ha&lt;br /&gt;
&lt;br /&gt;
====Understorey Proportion Removal====&lt;br /&gt;
:Proportion of understorey stems to remove when and if understorey cleaning is performed (%). The program may adjust so that parameter 'Min Understorey Stems Retained' is not violated.&lt;br /&gt;
:Default: 90%&lt;br /&gt;
&lt;br /&gt;
== Selection felling ==&lt;br /&gt;
(only if '''Hugin''' is selected as thinning model)&lt;br /&gt;
Allows you to control how selection fellings (usually applied in &amp;quot;continuous forestry&amp;quot;) are simulated.&lt;br /&gt;
&lt;br /&gt;
====SelectionControlParameter====&lt;br /&gt;
Equivalent to [[#Thinning Algorithm Parameters | Thinning Algorithm Parameters]] but other settings for selection fellings.&lt;br /&gt;
&lt;br /&gt;
==Young Stand Thinning==&lt;br /&gt;
Criteria to determine whether a stand should be considered a young stand. Biofuel thinning is only allowed in stands classified as young. Also, to determine whether a stand is a young stand thinned for the first time (swe: förstagallring), this information is used.&lt;br /&gt;
&lt;br /&gt;
====Max Relative Age====&lt;br /&gt;
Max relative age for a stand to be considered young. Relative age is a ratio of stand age and &amp;quot;mature&amp;quot; age, see [{{HeurekaHelpLinkEng}}relativ_alder.htm]].&lt;br /&gt;
&lt;br /&gt;
====Max Age ====&lt;br /&gt;
Max age for a stand to be considered a young stand&lt;br /&gt;
&lt;br /&gt;
====Min Height====&lt;br /&gt;
Minimum height for a stand to be considered young, but old enough for thinning&lt;br /&gt;
&lt;br /&gt;
====Max Height====&lt;br /&gt;
Maximum height for a stand to be considered young &lt;br /&gt;
&lt;br /&gt;
====Thinning Type====&lt;br /&gt;
:;Ordinary:&lt;br /&gt;
:;Biofuel:&lt;br /&gt;
&lt;br /&gt;
====Understorey Density Trigger Biofuel Thinning====&lt;br /&gt;
(From version 2.11) Understorey stem density when thinning is automatically switched to biofuel thinning (stems/ha). In this case no understorey cleaning will be done. Leave blank or set to a negative number to inactivate.&lt;br /&gt;
&lt;br /&gt;
== Final Felling ==&lt;br /&gt;
Allows you to control how final fellings (sometimes referred to as &amp;quot;clear cuttings&amp;quot;) are simulated.&lt;br /&gt;
&amp;lt;br&amp;gt;'''See also''': [http://heurekaslu.org/help/en/index.html?slutavverkning.htm#Utforande Help chapter on final felling ]&lt;br /&gt;
&lt;br /&gt;
====Min Diameter in Final Felling====&lt;br /&gt;
:Defines the minimum diameter, in centimeters, to be cut in the simulations.&lt;br /&gt;
&lt;br /&gt;
====Seed Tree Retention==== &lt;br /&gt;
(only if '''SeedTree''' or '''Shelterwood''' is selected)&lt;br /&gt;
Same as [[#ThinningControlParameter | ThinningControlParameter]]&lt;br /&gt;
&lt;br /&gt;
====Shelterwood Retention==== &lt;br /&gt;
(only if '''Seed Tree''' or '''Shelterwood''' is selected)&lt;br /&gt;
Note: Do not confuse with Tree Retention in control table [[ControlTable_NatureConservation | Nature Conservation]]&lt;br /&gt;
*RetainedBasalAreaLowSI: The basal area, in m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;/ha, of seed trees and shelterwood to be retained in stands with site index less than 20 m. *RetainedBasalAreaHighSI: The basal area, in m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;/ha, of seed trees and shelterwood to be retained in stands with site index greater than 20 m.&lt;br /&gt;
*RemovalTime: The number of years from final felling to when retained trees are cut.&lt;br /&gt;
*RetainDominantSpecies: If '''True''', retain trees of the dominant tree species, '''False''' do not.&lt;br /&gt;
*MinimumRetainedBasalArea: The minimum basal area, in m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;/ha at the stand-level, of seed trees and shelterwood to be retained.&lt;br /&gt;
*RetainedSpecies: (only if '''RetainDominantSpecies''' is '''False''') The tree species to be retained as seed trees and shelterwood.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- (Moved to Regeneration Settings)&lt;br /&gt;
====TypeOfFinalFelling====&lt;br /&gt;
*Ordinary: All trees with diameter larger than the minimum diameter defined above will be cut in the simulations.&lt;br /&gt;
*SeedTree: If set to true, all trees except seed trees, as defined in SeedTreeControlParameter and TreeRetention above, will be cut in the simulations.&lt;br /&gt;
*Shelterwood: If set to true, all trees except the shelterwood trees, as defined in SeedTreeControlParameter and TreeRetention above, will be cut in the simulations.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remove Existing Overstorey====&lt;br /&gt;
Regulates how shelterwood, seed trees or retention trees (trees left for the next rotation) will be handled. With the latest template for stand register, you will also be able to specify suggestions for treatments and control how they are used in each stand. Existing trees retained for nature conservation can also be treated separately in the new version.&lt;br /&gt;
&lt;br /&gt;
====Use SI Management====&lt;br /&gt;
Set '''Use SI Management''' to True if you have typed values in the Site Index Management column in the stand register (version 3), and you want to use them to govern the minimum age of final felling. If you use the Forest Management Planning Package (FMPP) and have a stand register linked to it with values for the Site Index Management column, the latter will be given precedence. If SI Management is set to False, or SI Management is missing, SIS is used (Site quality index according to site factors).&lt;br /&gt;
&lt;br /&gt;
== Fertilization ==&lt;br /&gt;
Allows you to control how fertilizations are simulated.&lt;br /&gt;
&lt;br /&gt;
====FertilizerAmount====&lt;br /&gt;
:Defines the amount of fertilizer in kilogram per hectare used in the simulations.&lt;br /&gt;
&lt;br /&gt;
====FertilizerSubstance====&lt;br /&gt;
:'''AN''' defines that ammonium nitrate is the active substance in fertilizations.&lt;br /&gt;
:'''UREA''' defines that urea, i.e. ammoniac[?], is the active substance in fertilizations.&lt;br /&gt;
&lt;br /&gt;
====MaxAnnualGrowth====&lt;br /&gt;
:Defines the maximum annual growth, in m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;sk/ha, if fertilization of the stand is to be simulated.&lt;br /&gt;
&lt;br /&gt;
====MeanHeightLimitFertilization====&lt;br /&gt;
:Defines the minimum average height (basal area weighted) in meters if fertilization of the stand is to be simulated. &lt;br /&gt;
&lt;br /&gt;
====MinConiferProportion====&lt;br /&gt;
:Defines the minimum proportion of conifers, in percentage of basal area, if fertilization of the stand is to be simulated. &lt;br /&gt;
&lt;br /&gt;
====SiteIndex====&lt;br /&gt;
:'''Min''' defines the minimum site index value in meters if fertilization of the stand is to be simulated.&lt;br /&gt;
:'''Max''' defines the maximum site index value in meters if fertilization of the stand is to be simulated.&lt;br /&gt;
&lt;br /&gt;
== Intensive Fertilization ==&lt;br /&gt;
Allows you to control how intensive fertilization is simulated.&lt;br /&gt;
&lt;br /&gt;
''Note that intensive fertilization can only be simulated if the soil moisture is mesic or mesic-moist, in the southern part (latitude &amp;lt;58° N) and the central part (58-61° N) of Sweden also moist soils are possible to intensively fertilize. Moreover, the site index (H100, m) must in the northern part of Sweden (&amp;gt;61° N) be below G26, in the central part below G30, and in the southern part below G34, to allow for intensive fertilization.''&lt;br /&gt;
&lt;br /&gt;
====HeightIntensiveFertilization====&lt;br /&gt;
:'''Min''' defines the minimum average height in meters if fertilization is to be initiated in the young stand.&lt;br /&gt;
:'''Max''' defines the maximum average height in meters if fertilization is to be initiated in the young stand.&lt;br /&gt;
&lt;br /&gt;
====MinSpruceProportionIntensiveFertilization====&lt;br /&gt;
:Defines the minimum proportion of spruce, in percentage of basal area (or of stems per hectare), if fertilization is to be initiated in the young stand. &lt;br /&gt;
&lt;br /&gt;
====MinStemsIntensiveFertilization====&lt;br /&gt;
:Defines the minimum number of stems per hectare if fertilization is to be initiated in the young stand.&lt;br /&gt;
&lt;br /&gt;
== Biofuel ==&lt;br /&gt;
Allows you to control how forest fuel extractions are simulated.&lt;br /&gt;
&lt;br /&gt;
====Restrictions====&lt;br /&gt;
:*MinSpruce: defines the minimum proportion of spruce, in percentage of basal area, if extraction is to be simulated.&lt;br /&gt;
:*MaxDiamStump: defines the maximum diameter, in centimeters, of the stump if extraction is to be simulated.&lt;br /&gt;
:*MinDiamStump: defines the minimum diameter, in centimeters, of the stump if extraction is to be simulated.&lt;br /&gt;
&lt;br /&gt;
====Stump Extraction====&lt;br /&gt;
:Selection of species for which stumps and roots can be extracted. For each species to extract, set value to True.&lt;br /&gt;
&lt;br /&gt;
====Utilization====&lt;br /&gt;
:*Top: defines the proportion, in percentage, of the top (incl. stem, branches, and needles) that is utilized in extraction.&lt;br /&gt;
:*BranchesNotTop: defines the proportion, in percentage, of the branches below the top that is utilized in extraction.&lt;br /&gt;
:*BranchesTop: defines the proportion, in percentage, of the branches of the top that is utilized in extraction.&lt;br /&gt;
:*DeadBranchesNotTop: defines the proportion, in percentage, of the dead branches below the top that is utilized in extraction.&lt;br /&gt;
:*DeadBranchesTop: defines the proportion, in percentage, of the dead branches of the top that is utilized in extraction.&lt;br /&gt;
:*NeedlesTop: defines the proportion, in percentage, of the needles of the top that is utilized in extraction.&lt;br /&gt;
:*NeedlesNotTop: defines the proportion, in percentage, of the needles below the top that is utilized in extraction.&lt;br /&gt;
:*Stump: defines the proportion, in percentage, of the stump that is utilized in extraction.&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;div id=&amp;quot;TreeRetention&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;Nature Conservation Activities (Tree Retention) ==&lt;br /&gt;
(moved here from Nature Conservation control table in version 2.9)&lt;br /&gt;
&amp;lt;br&amp;gt;Allows you to control if trees should be retained, as a part of the simulation of the biological considerations to be taken. &lt;br /&gt;
&lt;br /&gt;
=== Tree Retention Settings ===&lt;br /&gt;
(only if [[#Retain Trees|Retain Trees]] = '''True''')&lt;br /&gt;
Allows you to control how trees are to be retained.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id = &amp;quot;Retain Trees&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====Retain Trees?====&lt;br /&gt;
:'''True:''' Selected trees (according to settings below) should be left after final felling or after selecion felling, and left until the next final felling or selection felling at which a new decision taken what trees to retain. &lt;br /&gt;
:'''False:''' No nature conservation trees should be retained.&lt;br /&gt;
&lt;br /&gt;
====Retained Trees/ha====&lt;br /&gt;
:Mumber of trees to retain (per hectare).&lt;br /&gt;
&lt;br /&gt;
====Retention Priority====&lt;br /&gt;
:Priority settings for which trees to retain as nature conservation trees, regarding species, age and size.&lt;br /&gt;
&lt;br /&gt;
====Retention Time====&lt;br /&gt;
:Defines for how long trees are retained (in years). After this time the retained trees will be transferred to downed, coarse woody debris (the &amp;quot;dead wood&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id = &amp;quot;High Stump Settings&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Retention of High Stumps===&lt;br /&gt;
&amp;lt;div id = &amp;quot;Leave High Stumps&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====Leave High Stumps?====&lt;br /&gt;
:If set to True, high stumps will be &amp;quot;created&amp;quot; at final felling. Unlike retention trees, high stumps immediately become part of the dead wood pool of standing dead trees, with a volume reductions for the part of the tree that was harvested. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id = &amp;quot;High Stumpsha&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====High Stumps/ha====&lt;br /&gt;
:Mumber of high stumps to create (per hectare).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id = &amp;quot;Height Of High Stumps&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Height of High Stumps====&lt;br /&gt;
:This is set in the Pricelist Manager (which control the bucking of trees when harvesting).&lt;br /&gt;
&lt;br /&gt;
====High Stump Priority====&lt;br /&gt;
:Priority settings for which trees to leave high stumps for, regarding species, age and size.&lt;br /&gt;
&lt;br /&gt;
=== Leave stems in forest after treatment ===&lt;br /&gt;
Allows you to control the proportion of stems to be left in the forest as deadwood, after a thinning or selection felling.&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Download_and_install/sv&amp;diff=10945</id>
		<title>Download and install/sv</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Download_and_install/sv&amp;diff=10945"/>
		<updated>2024-11-25T15:01:06Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages|Download_and_install}}&lt;br /&gt;
{{DISPLAYTITLE:Nedladdning och installation}}&lt;br /&gt;
&lt;br /&gt;
==Registrering==&lt;br /&gt;
Heurekas programvaror är gratis att används men vi vill att du registrerar dig: [{{HeurekaRegisterUrlSv}} Registreringssida]&lt;br /&gt;
&lt;br /&gt;
== Licens ==&lt;br /&gt;
För Heurekas programvaror gäller följande licensvillkor: [[Heureka_EULA | End-User License Agreement (EULA)]].&lt;br /&gt;
&lt;br /&gt;
==Systemkrav==&lt;br /&gt;
Windows 7, 8, 10 eller 11, 64-bit.&lt;br /&gt;
&lt;br /&gt;
.NET Framework 4.8&lt;br /&gt;
&lt;br /&gt;
== Instruktioner ==&lt;br /&gt;
Se [{{HeurekaHelpLink}}installera_heureka.htm Heurekas hjäldokumentation]&lt;br /&gt;
&lt;br /&gt;
==Hämta programvaror==&lt;br /&gt;
&lt;br /&gt;
====MSI (rekommenderat)====&lt;br /&gt;
MSI ([http://en.wikipedia.org/wiki/Windows_Installer Windows Installer]) innebär att programmet installeras som ett &amp;quot;vanligt&amp;quot; program under t ex C:\Program Files. &lt;br /&gt;
&lt;br /&gt;
{{#clear_external_data:}} &lt;br /&gt;
{{#get_web_data:url={{HeurekaPublishUrl}}MSIversions.xml&lt;br /&gt;
|format=XML&lt;br /&gt;
|data=x86version=x86,x64version=x64,HabitatPrognosis=HabitatPrognosis,StandWise=x32Subset}}&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;200&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Application'''&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;100&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Platform'''&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;100&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Version'''&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;100&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Note'''&lt;br /&gt;
|-&lt;br /&gt;
| StandWise, PlanWise, PlanEval, RegWise ||x64 (64-bit)|| [{{HeurekaPublishUrl}}MSI/Slu.Heureka.Setup_x64.msi {{#external_value:x64version}}] || &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
|-&lt;br /&gt;
| StandWise, PlanWise, PlanEval, RegWise ||x86 (32-bit)|| [{{HeurekaPublishUrl}}MSI/Slu.Heureka.Setup_x86.msi {{#external_value:x86version}}] || &lt;br /&gt;
|-&lt;br /&gt;
| StandWise || x86 (32-bit)|| [{{HeurekaPublishUrl}}MSI/Slu.Heureka.Setup_StandWise_x86.msi {{#external_value:StandWise}}] || StandWise kan bara köras som 32-bitars version (men fungerar på 64-bitars system!).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Clickonce====&lt;br /&gt;
&amp;quot;ClickOnce&amp;quot; innebär att programmet installeras under användares egen profil, och administratör-rättigheter behövs inte (vilket dock behövs för att installera SQL Server). Nackdelen med ClickOnce är att de olika applikationerna installerar varsin Heureka-kärna, vilket gör att programmen tar något mer plats på din hårddisk (ca 50 MB per applikation).&lt;br /&gt;
&lt;br /&gt;
{{#get_web_data:url={{HeurekaPublishUrl}}ClickOnceVersions.xml&lt;br /&gt;
|format=XML&lt;br /&gt;
|data=StandWise=StandWise,PlanWise=PlanWise,PlanStart=PlanStart,RegWise=RegWise,PlanEval=PlanEval,HabitatPrognosis=HabitatPrognosis}}&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;200&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Applikation'''&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;100&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Version'''&lt;br /&gt;
|-&lt;br /&gt;
| BeståndsVis (StandWise)||[{{HeurekaPublishUrl}}ClickOnce/StandWise/setup.exe {{#external_value:StandWise}}]&lt;br /&gt;
|-&lt;br /&gt;
| PlanVis||[{{HeurekaPublishUrl}}ClickOnce/PlanWise/setup.exe {{#external_value:PlanWise}}]&lt;br /&gt;
|-&lt;br /&gt;
| RegVis||[{{HeurekaPublishUrl}}ClickOnce/RegWise/setup.exe {{#external_value:RegWise}}]&lt;br /&gt;
|-&lt;br /&gt;
| PlanEval||[{{HeurekaPublishUrl}}ClickOnce/PlanEval/setup.exe {{#external_value:PlanEval}}]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
{{#clear_external_data:}} &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''Beta-versioner:'''&lt;br /&gt;
{{#get_web_data:url={{HeurekaPublishUrl}}test/ClickOnceVersions.xml&lt;br /&gt;
|format=XML&lt;br /&gt;
|data=StandWise=StandWise,PlanWise=PlanWise,PlanStart=PlanStart,RegWise=RegWise,PlanEval=PlanEval,HabitatPrognosis=HabitatPrognosis}}&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;200&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Applikation'''&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;100&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Version'''&lt;br /&gt;
|-&lt;br /&gt;
| BeståndsVis (StandWise)||[{{HeurekaPublishUrl}}test/ClickOnce/StandWise/setup.exe {{#external_value:StandWise}}]&lt;br /&gt;
|-&lt;br /&gt;
| PlanVis||[{{HeurekaPublishUrl}}test/ClickOnce/PlanWise/setup.exe {{#external_value:PlanWise}}]&lt;br /&gt;
|-&lt;br /&gt;
| RegVis||[{{HeurekaPublishUrl}}test/ClickOnce/RegWise/setup.exe {{#external_value:RegWise}}]&lt;br /&gt;
|-&lt;br /&gt;
| PlanEval||[{{HeurekaPublishUrl}}test/ClickOnce/PlanEval/setup.exe {{#external_value:PlanEval}}]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
====Tidigare versioner====&lt;br /&gt;
Tidigare versioner kan hämtas här (endast som MSI):&lt;br /&gt;
[{{HeurekaPublishUrl}}MSI/Archive/ Arkiv]&lt;br /&gt;
&lt;br /&gt;
==Hämta ytterligare Heureka-programvaror==&lt;br /&gt;
&lt;br /&gt;
====PlanEvalWeb====&lt;br /&gt;
Se [[PlanEvalWeb]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Hämta HabitatPrognosis==&lt;br /&gt;
'''Från och med version 2.6 ersätts denna applikation av ett inbyggt verktyg i PlanVis och RegVis.'''&lt;br /&gt;
Se {{HeurekaHelpLink}}&lt;br /&gt;
&lt;br /&gt;
HabitatPrognosis är ett fristående verktyg som baseras på ArcGIS för att beräkna hur arealen habitat för ett antal utvalda arter utvecklas över tiden. Som indata används resultat från PlanVis. Du kan läsa mer om verktyget [[HabitatPrognosis|här]] och i [{{HeurekaHelpLink}}habitatmodeller.htm avsnittet Habitatmodeller i Heurekas hjälpdokumentation].&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;200&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Application'''&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;100&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Platform'''&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;100&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Version'''&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;100&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Note'''&lt;br /&gt;
|-&lt;br /&gt;
| HabitatPrognosis (ArcGIS 9.3.1)||x86 (32-bit)|| [http://heureka2-1.slu.se/publish/HabitatPrognosis/ArcGIS_9_3_1/msi/HabitatSetup.msi 0.9.3] || Kräver ArcGIS 9.3.1 (ArcInfo) och tillägget Spatial Analyst &lt;br /&gt;
|-&lt;br /&gt;
| HabitatPrognosis (ArcGIS 10.1)||x86 (32-bit)|| [http://heureka2-1.slu.se/publish/HabitatPrognosis/ArcGIS_10_1/msi/HabitatSetup.msi 1.0.0] || Kräver ArcGIS 10.1 (Desktop Advanced) och tillägget  Spatial Analyst&lt;br /&gt;
|-&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Download_and_install/sv&amp;diff=10944</id>
		<title>Download and install/sv</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Download_and_install/sv&amp;diff=10944"/>
		<updated>2024-11-25T15:00:35Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages|Download_and_install}}&lt;br /&gt;
{{DISPLAYTITLE:Nedladdning och installation}}&lt;br /&gt;
&lt;br /&gt;
==Registrering==&lt;br /&gt;
Heurekas programvaror är gratis att används men vi vill att du registrerar dig: [{{HeurekaRegisterUrlSv}} Registreringssida]&lt;br /&gt;
&lt;br /&gt;
== Licens ==&lt;br /&gt;
För Heurekas programvaror gäller följande licensvillkor: [[Heureka_EULA | End-User License Agreement (EULA)]].&lt;br /&gt;
&lt;br /&gt;
==Systemkrav==&lt;br /&gt;
Windows 7, 8 eller 10, 64-bit.&lt;br /&gt;
&lt;br /&gt;
.NET Framework 4.8&lt;br /&gt;
&lt;br /&gt;
== Instruktioner ==&lt;br /&gt;
Se [{{HeurekaHelpLink}}installera_heureka.htm Heurekas hjäldokumentation]&lt;br /&gt;
&lt;br /&gt;
==Hämta programvaror==&lt;br /&gt;
&lt;br /&gt;
====MSI (rekommenderat)====&lt;br /&gt;
MSI ([http://en.wikipedia.org/wiki/Windows_Installer Windows Installer]) innebär att programmet installeras som ett &amp;quot;vanligt&amp;quot; program under t ex C:\Program Files. &lt;br /&gt;
&lt;br /&gt;
{{#clear_external_data:}} &lt;br /&gt;
{{#get_web_data:url={{HeurekaPublishUrl}}MSIversions.xml&lt;br /&gt;
|format=XML&lt;br /&gt;
|data=x86version=x86,x64version=x64,HabitatPrognosis=HabitatPrognosis,StandWise=x32Subset}}&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;200&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Application'''&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;100&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Platform'''&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;100&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Version'''&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;100&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Note'''&lt;br /&gt;
|-&lt;br /&gt;
| StandWise, PlanWise, PlanEval, RegWise ||x64 (64-bit)|| [{{HeurekaPublishUrl}}MSI/Slu.Heureka.Setup_x64.msi {{#external_value:x64version}}] || &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
|-&lt;br /&gt;
| StandWise, PlanWise, PlanEval, RegWise ||x86 (32-bit)|| [{{HeurekaPublishUrl}}MSI/Slu.Heureka.Setup_x86.msi {{#external_value:x86version}}] || &lt;br /&gt;
|-&lt;br /&gt;
| StandWise || x86 (32-bit)|| [{{HeurekaPublishUrl}}MSI/Slu.Heureka.Setup_StandWise_x86.msi {{#external_value:StandWise}}] || StandWise kan bara köras som 32-bitars version (men fungerar på 64-bitars system!).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Clickonce====&lt;br /&gt;
&amp;quot;ClickOnce&amp;quot; innebär att programmet installeras under användares egen profil, och administratör-rättigheter behövs inte (vilket dock behövs för att installera SQL Server). Nackdelen med ClickOnce är att de olika applikationerna installerar varsin Heureka-kärna, vilket gör att programmen tar något mer plats på din hårddisk (ca 50 MB per applikation).&lt;br /&gt;
&lt;br /&gt;
{{#get_web_data:url={{HeurekaPublishUrl}}ClickOnceVersions.xml&lt;br /&gt;
|format=XML&lt;br /&gt;
|data=StandWise=StandWise,PlanWise=PlanWise,PlanStart=PlanStart,RegWise=RegWise,PlanEval=PlanEval,HabitatPrognosis=HabitatPrognosis}}&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;200&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Applikation'''&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;100&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Version'''&lt;br /&gt;
|-&lt;br /&gt;
| BeståndsVis (StandWise)||[{{HeurekaPublishUrl}}ClickOnce/StandWise/setup.exe {{#external_value:StandWise}}]&lt;br /&gt;
|-&lt;br /&gt;
| PlanVis||[{{HeurekaPublishUrl}}ClickOnce/PlanWise/setup.exe {{#external_value:PlanWise}}]&lt;br /&gt;
|-&lt;br /&gt;
| RegVis||[{{HeurekaPublishUrl}}ClickOnce/RegWise/setup.exe {{#external_value:RegWise}}]&lt;br /&gt;
|-&lt;br /&gt;
| PlanEval||[{{HeurekaPublishUrl}}ClickOnce/PlanEval/setup.exe {{#external_value:PlanEval}}]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
{{#clear_external_data:}} &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''Beta-versioner:'''&lt;br /&gt;
{{#get_web_data:url={{HeurekaPublishUrl}}test/ClickOnceVersions.xml&lt;br /&gt;
|format=XML&lt;br /&gt;
|data=StandWise=StandWise,PlanWise=PlanWise,PlanStart=PlanStart,RegWise=RegWise,PlanEval=PlanEval,HabitatPrognosis=HabitatPrognosis}}&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;200&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Applikation'''&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;100&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Version'''&lt;br /&gt;
|-&lt;br /&gt;
| BeståndsVis (StandWise)||[{{HeurekaPublishUrl}}test/ClickOnce/StandWise/setup.exe {{#external_value:StandWise}}]&lt;br /&gt;
|-&lt;br /&gt;
| PlanVis||[{{HeurekaPublishUrl}}test/ClickOnce/PlanWise/setup.exe {{#external_value:PlanWise}}]&lt;br /&gt;
|-&lt;br /&gt;
| RegVis||[{{HeurekaPublishUrl}}test/ClickOnce/RegWise/setup.exe {{#external_value:RegWise}}]&lt;br /&gt;
|-&lt;br /&gt;
| PlanEval||[{{HeurekaPublishUrl}}test/ClickOnce/PlanEval/setup.exe {{#external_value:PlanEval}}]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
====Tidigare versioner====&lt;br /&gt;
Tidigare versioner kan hämtas här (endast som MSI):&lt;br /&gt;
[{{HeurekaPublishUrl}}MSI/Archive/ Arkiv]&lt;br /&gt;
&lt;br /&gt;
==Hämta ytterligare Heureka-programvaror==&lt;br /&gt;
&lt;br /&gt;
====PlanEvalWeb====&lt;br /&gt;
Se [[PlanEvalWeb]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Hämta HabitatPrognosis==&lt;br /&gt;
'''Från och med version 2.6 ersätts denna applikation av ett inbyggt verktyg i PlanVis och RegVis.'''&lt;br /&gt;
Se {{HeurekaHelpLink}}&lt;br /&gt;
&lt;br /&gt;
HabitatPrognosis är ett fristående verktyg som baseras på ArcGIS för att beräkna hur arealen habitat för ett antal utvalda arter utvecklas över tiden. Som indata används resultat från PlanVis. Du kan läsa mer om verktyget [[HabitatPrognosis|här]] och i [{{HeurekaHelpLink}}habitatmodeller.htm avsnittet Habitatmodeller i Heurekas hjälpdokumentation].&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;200&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Application'''&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;100&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Platform'''&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;100&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Version'''&lt;br /&gt;
| align=&amp;quot;left&amp;quot; width=&amp;quot;100&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Note'''&lt;br /&gt;
|-&lt;br /&gt;
| HabitatPrognosis (ArcGIS 9.3.1)||x86 (32-bit)|| [http://heureka2-1.slu.se/publish/HabitatPrognosis/ArcGIS_9_3_1/msi/HabitatSetup.msi 0.9.3] || Kräver ArcGIS 9.3.1 (ArcInfo) och tillägget Spatial Analyst &lt;br /&gt;
|-&lt;br /&gt;
| HabitatPrognosis (ArcGIS 10.1)||x86 (32-bit)|| [http://heureka2-1.slu.se/publish/HabitatPrognosis/ArcGIS_10_1/msi/HabitatSetup.msi 1.0.0] || Kräver ArcGIS 10.1 (Desktop Advanced) och tillägget  Spatial Analyst&lt;br /&gt;
|-&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Intro&amp;diff=10943</id>
		<title>Intro</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Intro&amp;diff=10943"/>
		<updated>2024-11-25T14:59:33Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Languages|Intro}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
The Heureka Forestry Decision Support System (DSS) (http://www.slu.se/SHa) is a suite of freely available softwares developed and hosted by the [http://www.slu.se Swedish University of Agricultural Sciences (SLU)]. The system covers the whole decision support process from data inventory to tools for selecting among plan alternatives with multi-criteria decision making techniques.&lt;br /&gt;
&lt;br /&gt;
The software applications are intended for both large-scale and small-scale forestry and are designed for different users' specific problem areas:&lt;br /&gt;
*[[StandWise]] for stand-level analysis &lt;br /&gt;
*[[PlanWise]] for forest-level planning and analysis &lt;br /&gt;
*[[PlanEval]] for multi-critera decision analysis, to help comparing plans generated in PlanWise  &lt;br /&gt;
*[[RegWise]] for regional and national scenario analysis &lt;br /&gt;
&amp;lt;!--*[[Ivent]] is an application for field inventory - plotwise sampling of single-tree data (for Windows mobile devices)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The system is maintained, developed and supported by the [http://heureka.slu.se/SHa Forest Sustainability Analysis] program at SLU.&lt;br /&gt;
&lt;br /&gt;
The softwares are the results of a research programme carried out in collaboration with [http://www.skogforsk.se Forestry Research Institute of Sweden (Skogforsk)]. &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
[[Category:Software]]&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Definition:SlopeTypeCode&amp;diff=10938</id>
		<title>Definition:SlopeTypeCode</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Definition:SlopeTypeCode&amp;diff=10938"/>
		<updated>2024-11-25T14:57:15Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages|SlopeTypeCode}}&lt;br /&gt;
{{ForestInputData&lt;br /&gt;
|description = Slope type code. Corresponds to &amp;quot;L&amp;quot; in Swedish GYL (Lutning))&lt;br /&gt;
|I_O = Input&lt;br /&gt;
|type = integer&lt;br /&gt;
|membership = Stand level&lt;br /&gt;
|unit_values = 1 = 0-10 % &amp;lt;br&amp;gt;2 = 10-20 % &amp;lt;br&amp;gt;3 = 20-33 %&amp;lt;br&amp;gt;4 = 33-50 %&amp;lt;br&amp;gt;5 = &amp;gt;50 %&lt;br /&gt;
|database = StandObject and SiteData&lt;br /&gt;
}}&lt;br /&gt;
{{VariableCategory}}&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Harvested_Wood_Products&amp;diff=10936</id>
		<title>Harvested Wood Products</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Harvested_Wood_Products&amp;diff=10936"/>
		<updated>2024-11-25T14:56:55Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages|Harvested_Wood_Products}}&lt;br /&gt;
&lt;br /&gt;
See also [[Harvested Wood Products Results|description for Harvested Wood Products results]].&lt;br /&gt;
&lt;br /&gt;
https://pub.epsilon.slu.se/8673/1/Wikberg_P-E_120329.pdf&lt;br /&gt;
&lt;br /&gt;
https://pub.epsilon.slu.se/9320/1/Wikberg_PE_121213.pdf&lt;br /&gt;
&lt;br /&gt;
Soon to be updated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Model]]&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=BreedingEffects&amp;diff=10935</id>
		<title>BreedingEffects</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=BreedingEffects&amp;diff=10935"/>
		<updated>2024-11-25T14:55:57Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages|BreedingEffects}}&lt;br /&gt;
[[Category:Model|Breeding]]&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Import_of_climate_scenario&amp;diff=10932</id>
		<title>Import of climate scenario</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Import_of_climate_scenario&amp;diff=10932"/>
		<updated>2024-11-25T14:54:42Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages|Import_of_climate_scenario}}&lt;br /&gt;
&lt;br /&gt;
See http://heurekaslu.org/help/en/index.html?importera_klimatscenario.htm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Description===&lt;br /&gt;
Todo&lt;br /&gt;
&lt;br /&gt;
===Instruction===&lt;br /&gt;
# Download a .csv-file (file name starts with &amp;quot;CC_response...&amp;quot;) from [ftp://salix.slu.se/download/Heureka/Climate%20response/].&lt;br /&gt;
# Start PlanStart and select the database to which the scenario should be imported.&lt;br /&gt;
# Select &amp;quot;Import Climate Scenario&amp;quot; from the menu &amp;quot;External Data&amp;quot;.&lt;br /&gt;
# Click &amp;quot;Browse&amp;quot; and select the file.&lt;br /&gt;
# Assign a name, e.g. &amp;quot;ECHAM5_A1B&amp;quot;.&lt;br /&gt;
# Enter the cell size = 50 000 m.&lt;br /&gt;
# Click OK.&lt;br /&gt;
# More information about the A1B-scenario is found in [ftp://salix.slu.se/download/Heureka/Climate%20response/ar4_syr.pdf], e.g. in section (and figure) 3.1.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Database]]&lt;br /&gt;
[[Category:Reference Manual]]&lt;br /&gt;
[[Category:User's Guides]]&lt;br /&gt;
[[Category:PlanStart]]&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=User%27s_guide_to_PlanWise&amp;diff=10917</id>
		<title>User's guide to PlanWise</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=User%27s_guide_to_PlanWise&amp;diff=10917"/>
		<updated>2024-11-25T13:18:02Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: /* New help documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages|User%27s_guide_to_PlanWise}}&lt;br /&gt;
[[Category:User's Guides|PlanVis|PlanVis]]&lt;br /&gt;
&lt;br /&gt;
==New help documentation==&lt;br /&gt;
A newer help documentation is available at http://heurekaslu.org/help.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
PlanWise is an application for long term forestry planning, including both strategic and tactical planning. It can be considered a problem solver that helps you find solutions to problems of the type &amp;quot;What to do and when?&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The application can can handle full cover geographical analysis which gives the basic conditions for spatial forestry planning, enabling the consideration of landscape patterns and concentration of treatments. It also gives a better connection to short term operational planning.&lt;br /&gt;
&lt;br /&gt;
The application includes two main components, a growth-and-yield simulator and an optimizer. The simulator is called the Treatment Program Generator (TPG). The TPG computes alternative treatment programs for each treatment unit (stand) in a given forest area. The optimizer is called Heureka Optimization Programming System (HOPS). It is used to formulate and solve linear programming and mixed-integer programming problems for choosing between optional treatment programs. Another component is a map viewer for visualization of forest development and management under different plans, or scenarios.&lt;br /&gt;
&lt;br /&gt;
==Get Started==&lt;br /&gt;
The best way to get started is probably to read the [[Get Started]] section and follow the instruction for  installing the software. After that you can through the tutorial suggested there or check up another one in [[Tutorials | tutorials]]. This one (only in Swedish though) is probably the current best: [[SG0060_2010 | introductury exercise used in MSc course]].&lt;br /&gt;
&lt;br /&gt;
== Working with Projects ==&lt;br /&gt;
&lt;br /&gt;
[[Introduction to Projects]]&lt;br /&gt;
&lt;br /&gt;
[[Create a new Project]]&lt;br /&gt;
&lt;br /&gt;
[[Open an existing Project]]&lt;br /&gt;
&lt;br /&gt;
[[Making a copy of a Project|Making a copy of a Project (incl. Name of Objects)]]&lt;br /&gt;
&lt;br /&gt;
[[Delete a Project]]&lt;br /&gt;
&lt;br /&gt;
== Generating treatment programs ==&lt;br /&gt;
&lt;br /&gt;
[[Control Categories, Control Tables, and Forest Domains]]&lt;br /&gt;
&lt;br /&gt;
== Optimizing ==&lt;br /&gt;
[[Optimization | User's Guide to Optimization]]&lt;br /&gt;
&lt;br /&gt;
== Analyzing Results ==&lt;br /&gt;
Results can be viewed in maps, tables and graphs. See [[:Category:Results | Results]].&lt;br /&gt;
&lt;br /&gt;
== How Do I? ==&lt;br /&gt;
&lt;br /&gt;
It is possible to look at the [[PlanWise_Tutorial|tutorial]] and you are free to do the exercises (all of them or those you find relevant). However, be aware of the fact that they were written for MSc-students that worked with earlier releases of PlanWise (e.g., screenshots and programming syntax will not be applicable).&lt;br /&gt;
&lt;br /&gt;
[[Create a New Result Database]]&lt;br /&gt;
&lt;br /&gt;
[[Improve Performance]]&lt;br /&gt;
&lt;br /&gt;
[[Organize Windows]]&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
[[:Category:Control Tables|Control Tables]]&lt;br /&gt;
&lt;br /&gt;
[[:Category:Dialog|Common Dialogs]]&lt;br /&gt;
&lt;br /&gt;
[[:Category:Error Messages|Error Messages]]&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=User%27s_guide_to_PlanWise&amp;diff=10916</id>
		<title>User's guide to PlanWise</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=User%27s_guide_to_PlanWise&amp;diff=10916"/>
		<updated>2024-11-25T13:17:44Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: /* New help documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages|User%27s_guide_to_PlanWise}}&lt;br /&gt;
[[Category:User's Guides|PlanVis|PlanVis]]&lt;br /&gt;
&lt;br /&gt;
==New help documentation==&lt;br /&gt;
A newer help documentation is available at http://heurekaslu.org/help&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
PlanWise is an application for long term forestry planning, including both strategic and tactical planning. It can be considered a problem solver that helps you find solutions to problems of the type &amp;quot;What to do and when?&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The application can can handle full cover geographical analysis which gives the basic conditions for spatial forestry planning, enabling the consideration of landscape patterns and concentration of treatments. It also gives a better connection to short term operational planning.&lt;br /&gt;
&lt;br /&gt;
The application includes two main components, a growth-and-yield simulator and an optimizer. The simulator is called the Treatment Program Generator (TPG). The TPG computes alternative treatment programs for each treatment unit (stand) in a given forest area. The optimizer is called Heureka Optimization Programming System (HOPS). It is used to formulate and solve linear programming and mixed-integer programming problems for choosing between optional treatment programs. Another component is a map viewer for visualization of forest development and management under different plans, or scenarios.&lt;br /&gt;
&lt;br /&gt;
==Get Started==&lt;br /&gt;
The best way to get started is probably to read the [[Get Started]] section and follow the instruction for  installing the software. After that you can through the tutorial suggested there or check up another one in [[Tutorials | tutorials]]. This one (only in Swedish though) is probably the current best: [[SG0060_2010 | introductury exercise used in MSc course]].&lt;br /&gt;
&lt;br /&gt;
== Working with Projects ==&lt;br /&gt;
&lt;br /&gt;
[[Introduction to Projects]]&lt;br /&gt;
&lt;br /&gt;
[[Create a new Project]]&lt;br /&gt;
&lt;br /&gt;
[[Open an existing Project]]&lt;br /&gt;
&lt;br /&gt;
[[Making a copy of a Project|Making a copy of a Project (incl. Name of Objects)]]&lt;br /&gt;
&lt;br /&gt;
[[Delete a Project]]&lt;br /&gt;
&lt;br /&gt;
== Generating treatment programs ==&lt;br /&gt;
&lt;br /&gt;
[[Control Categories, Control Tables, and Forest Domains]]&lt;br /&gt;
&lt;br /&gt;
== Optimizing ==&lt;br /&gt;
[[Optimization | User's Guide to Optimization]]&lt;br /&gt;
&lt;br /&gt;
== Analyzing Results ==&lt;br /&gt;
Results can be viewed in maps, tables and graphs. See [[:Category:Results | Results]].&lt;br /&gt;
&lt;br /&gt;
== How Do I? ==&lt;br /&gt;
&lt;br /&gt;
It is possible to look at the [[PlanWise_Tutorial|tutorial]] and you are free to do the exercises (all of them or those you find relevant). However, be aware of the fact that they were written for MSc-students that worked with earlier releases of PlanWise (e.g., screenshots and programming syntax will not be applicable).&lt;br /&gt;
&lt;br /&gt;
[[Create a New Result Database]]&lt;br /&gt;
&lt;br /&gt;
[[Improve Performance]]&lt;br /&gt;
&lt;br /&gt;
[[Organize Windows]]&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
[[:Category:Control Tables|Control Tables]]&lt;br /&gt;
&lt;br /&gt;
[[:Category:Dialog|Common Dialogs]]&lt;br /&gt;
&lt;br /&gt;
[[:Category:Error Messages|Error Messages]]&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=User%27s_guide_to_PlanWise&amp;diff=10914</id>
		<title>User's guide to PlanWise</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=User%27s_guide_to_PlanWise&amp;diff=10914"/>
		<updated>2024-11-25T13:15:14Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: /* New help documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages|User%27s_guide_to_PlanWise}}&lt;br /&gt;
[[Category:User's Guides|PlanVis|PlanVis]]&lt;br /&gt;
&lt;br /&gt;
==New help documentation==&lt;br /&gt;
A newer help documentation is available at http://heurekaslu.org/help (currently only in Swedish).&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
PlanWise is an application for long term forestry planning, including both strategic and tactical planning. It can be considered a problem solver that helps you find solutions to problems of the type &amp;quot;What to do and when?&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The application can can handle full cover geographical analysis which gives the basic conditions for spatial forestry planning, enabling the consideration of landscape patterns and concentration of treatments. It also gives a better connection to short term operational planning.&lt;br /&gt;
&lt;br /&gt;
The application includes two main components, a growth-and-yield simulator and an optimizer. The simulator is called the Treatment Program Generator (TPG). The TPG computes alternative treatment programs for each treatment unit (stand) in a given forest area. The optimizer is called Heureka Optimization Programming System (HOPS). It is used to formulate and solve linear programming and mixed-integer programming problems for choosing between optional treatment programs. Another component is a map viewer for visualization of forest development and management under different plans, or scenarios.&lt;br /&gt;
&lt;br /&gt;
==Get Started==&lt;br /&gt;
The best way to get started is probably to read the [[Get Started]] section and follow the instruction for  installing the software. After that you can through the tutorial suggested there or check up another one in [[Tutorials | tutorials]]. This one (only in Swedish though) is probably the current best: [[SG0060_2010 | introductury exercise used in MSc course]].&lt;br /&gt;
&lt;br /&gt;
== Working with Projects ==&lt;br /&gt;
&lt;br /&gt;
[[Introduction to Projects]]&lt;br /&gt;
&lt;br /&gt;
[[Create a new Project]]&lt;br /&gt;
&lt;br /&gt;
[[Open an existing Project]]&lt;br /&gt;
&lt;br /&gt;
[[Making a copy of a Project|Making a copy of a Project (incl. Name of Objects)]]&lt;br /&gt;
&lt;br /&gt;
[[Delete a Project]]&lt;br /&gt;
&lt;br /&gt;
== Generating treatment programs ==&lt;br /&gt;
&lt;br /&gt;
[[Control Categories, Control Tables, and Forest Domains]]&lt;br /&gt;
&lt;br /&gt;
== Optimizing ==&lt;br /&gt;
[[Optimization | User's Guide to Optimization]]&lt;br /&gt;
&lt;br /&gt;
== Analyzing Results ==&lt;br /&gt;
Results can be viewed in maps, tables and graphs. See [[:Category:Results | Results]].&lt;br /&gt;
&lt;br /&gt;
== How Do I? ==&lt;br /&gt;
&lt;br /&gt;
It is possible to look at the [[PlanWise_Tutorial|tutorial]] and you are free to do the exercises (all of them or those you find relevant). However, be aware of the fact that they were written for MSc-students that worked with earlier releases of PlanWise (e.g., screenshots and programming syntax will not be applicable).&lt;br /&gt;
&lt;br /&gt;
[[Create a New Result Database]]&lt;br /&gt;
&lt;br /&gt;
[[Improve Performance]]&lt;br /&gt;
&lt;br /&gt;
[[Organize Windows]]&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
[[:Category:Control Tables|Control Tables]]&lt;br /&gt;
&lt;br /&gt;
[[:Category:Dialog|Common Dialogs]]&lt;br /&gt;
&lt;br /&gt;
[[:Category:Error Messages|Error Messages]]&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Heureka_Wiki&amp;diff=10913</id>
		<title>Heureka Wiki</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Heureka_Wiki&amp;diff=10913"/>
		<updated>2024-11-25T12:49:50Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ __NOEDITSECTION__&lt;br /&gt;
{{Languages|Heureka Wiki}}&lt;br /&gt;
{|width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;vertical-align: top; border-right: 2em solid white; &amp;quot;|&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #F7F7F7; border: 1px solid #999999; padding: 1em; &amp;quot;&amp;gt;&lt;br /&gt;
==About this Wiki==&lt;br /&gt;
This Wiki contains complementary information to the [{{HeurekaHelpLinkEng}} Heureka Online Help]. Here are, for example, variable definitions and how certain models work described.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #F7F7F7; border: 1px solid #999999; padding: 1em; &amp;quot;&amp;gt;&lt;br /&gt;
==Heureka Forestry DSS==&lt;br /&gt;
{{:Intro}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[About Heureka | More about Heureka and its features...]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #F7F7F7; border: 1px solid #999999; padding: 1em; &amp;quot;&amp;gt;&lt;br /&gt;
==Features==&lt;br /&gt;
More info will come soon!&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #F7F7F7; border: 1px solid #999999; padding: 1em; &amp;quot;&amp;gt;&lt;br /&gt;
==Get Started==&lt;br /&gt;
[{{HeurekaHelpLink}} Help documentation] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Get Started|Get Started (English)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #F7F7F7; border: 1px solid #999999; padding: 1em; &amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right; &amp;quot;&amp;gt;&lt;br /&gt;
{{#ask:[[Newsdate::+]] |&lt;br /&gt;
 sort=newsdate|&lt;br /&gt;
 order=desc|&lt;br /&gt;
 format=rss|&lt;br /&gt;
 searchlabel= RSS|&lt;br /&gt;
 rsstitle=Heureka MediaWiki|&lt;br /&gt;
 rssdescription=News from Heureka&lt;br /&gt;
}}[[Image:Feed_icon.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== News ==&lt;br /&gt;
{{#ask:[[Category:News]] [[newsdate::+]]|&lt;br /&gt;
 ?newsdate=|&lt;br /&gt;
 sort=newsdate|&lt;br /&gt;
 order=desc|&lt;br /&gt;
 limit=3|&lt;br /&gt;
 format=template|&lt;br /&gt;
 template=news list|&lt;br /&gt;
 searchlabel= &amp;lt;br /&amp;gt;older news &amp;amp;hellip;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #F7F7F7; border: 1px solid #999999; padding: 1em; &amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right; &amp;quot;&amp;gt;&lt;br /&gt;
{{#ask:[[Newsdate::+]] |&lt;br /&gt;
 sort=newsdate|&lt;br /&gt;
 order=desc|&lt;br /&gt;
 format=rss|&lt;br /&gt;
 searchlabel= RSS|&lt;br /&gt;
 rsstitle=Heureka MediaWiki|&lt;br /&gt;
 rssdescription=Calender for Heureka&lt;br /&gt;
}}[[Image:Feed_icon.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Calendar ==&lt;br /&gt;
{{#ask:[[Category:Calendar]] [[calendardate::&amp;gt;{{CURRENTYEAR}}-{{CURRENTMONTH}}-{{CURRENTDAY}}]]|&lt;br /&gt;
 ?calendardate=|&lt;br /&gt;
 sort=calendardate|&lt;br /&gt;
 order=asc|&lt;br /&gt;
 limit=5|&lt;br /&gt;
 default=none|&lt;br /&gt;
 format=template|&lt;br /&gt;
 template=news list|&lt;br /&gt;
 searchlabel= &amp;lt;br /&amp;gt;all activities (including past) &amp;amp;hellip;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #F7F7F7; border: 1px solid #999999; padding: 1em; &amp;quot;&amp;gt;&lt;br /&gt;
==Disclaimer==&lt;br /&gt;
SLU can not be held responsible for any errors in the software. Please read the license agreement: [[Heureka_EULA|Heureka EULA]]!&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
	<entry>
		<id>https://www.heurekaslu.se/w/index.php?title=Get_Started&amp;diff=10911</id>
		<title>Get Started</title>
		<link rel="alternate" type="text/html" href="https://www.heurekaslu.se/w/index.php?title=Get_Started&amp;diff=10911"/>
		<updated>2024-11-25T10:53:35Z</updated>

		<summary type="html">&lt;p&gt;Osskyn: /* Run PlanWise */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages|Get Started}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User's Guides]]&lt;br /&gt;
&lt;br /&gt;
==Heureka Helpdoc== &lt;br /&gt;
You can find instructions on how to install SQL Server and Heureka here: {{HeurekaHelpLink}}&lt;br /&gt;
&lt;br /&gt;
==Run StandWise==&lt;br /&gt;
# Start StandWise (from Start &amp;gt; Program &amp;gt; SLU).&lt;br /&gt;
# Run the [[StandWise_Tutorial | StandWise tutorial]].&lt;br /&gt;
# For more information, see [[User's guide to StandWise]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
If you like, you can add new data to the databas (or to a new, empty database), by directly entering data for a stand in StandWise: &lt;br /&gt;
[[Mata_in_data_manuellt | Enter data manually In StandWise ]] (for the moment only available in Swedish)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Run PlanWise==&lt;br /&gt;
# Start PlanWise (from Start &amp;gt; Program &amp;gt; SLU).&lt;br /&gt;
# Run the [[PlanWise_Tutorial | PlanWise tutorial]].&lt;br /&gt;
# For more information see [[User's guide to PlanWise]].&lt;br /&gt;
&lt;br /&gt;
== Availability and Support ==&lt;br /&gt;
{{:Availability_and_Support}}&lt;/div&gt;</summary>
		<author><name>Osskyn</name></author>
	</entry>
</feed>