public static float[] GetPartialSelectionCurve(float qRatio, float basalArea)
{
int x = ResourceTile.treeSizeClassCount;
float[] targetDistribution = new float[x];
float[] normalizedTargetDiameterDistribution = new float[x];
float[] products = new float[x];
float sizeClassCenterOffset = 0.5f*ResourceTile.treeSizeClassInterval;
for (int i=0; i<x; ++i) {
float individualBasalArea = Mathf.Pow(
(i+1)*ResourceTile.treeSizeClassInterval-sizeClassCenterOffset, 2f
) * 0.005454154f; // NOTE: conversion of inches diameter to square feet area
normalizedTargetDiameterDistribution[i] = Mathf.Pow(qRatio, x-i-1);
products[i] = normalizedTargetDiameterDistribution[i] * individualBasalArea;
}
float normalizedTargetDiameterDistributionBasalAreaSum = 0f;
for (int i=0; i<x; ++i) {
normalizedTargetDiameterDistributionBasalAreaSum += products[i];
}
float sumOverBasalArea = normalizedTargetDiameterDistributionBasalAreaSum / ((basalArea==0)?1:basalArea);
for (int i=0; i<x; ++i) {
targetDistribution[i] = normalizedTargetDiameterDistribution[i] * sumOverBasalArea;
}
return targetDistribution;
}