Program Listing for File neutral_analytical.cpp¶
↰ Return to documentation for file (necsim/neutral_analytical.cpp
)
// This file is part of necsim project which is released under MIT license.
// See file **LICENSE.txt** or visit https://opensource.org/licenses/MIT) for full license details.
#include <sstream>
#include <stdexcept>
#include "neutral_analytical.h"
#include "RNGController.h"
namespace neutral_analytical
{
long double siMetacommunitySpeciesWithAbundance(const unsigned long &n, const unsigned long &metacommunity_size,
const long double &speciation_rate)
{
long double fundamental_biodiversity_number = calcFundamentalBiodiversityNumber(metacommunity_size, speciation_rate);
long double term1 = fundamental_biodiversity_number / n;
long double term2 = lgamma(metacommunity_size + 1) + lgamma(metacommunity_size + fundamental_biodiversity_number - n);
long double term3 = lgamma(metacommunity_size + 1 - n) + lgamma(metacommunity_size + fundamental_biodiversity_number);
return term1 * exp(term2 - term3);
}
long double calcFundamentalBiodiversityNumber(const unsigned long &community_size,
const long double &speciation_rate)
{
if(speciation_rate == 1.0)
{
return 0.000000000000001;
}
return community_size * speciation_rate / (1.0 - speciation_rate);
}
long double calcSpeciationRate(const long double &fundamental_biodiversity_number,
const unsigned long &metacommunity_size)
{
return 1.0/(1.0 + ((metacommunity_size - 1)/fundamental_biodiversity_number));
}
long double siSpeciesRichnessDeprecated(const unsigned long &community_size, const long double &speciation_rate)
{
long double total_species = 0.0;
long double fundamental_biodiversity_number = calcFundamentalBiodiversityNumber(community_size, speciation_rate);
for(unsigned long i = 0; i < community_size - 1; i++)
{
total_species += fundamental_biodiversity_number / (fundamental_biodiversity_number + i);
}
return total_species;
}
long double siSpeciesRichness(const unsigned long &community_size, const long double &speciation_rate)
{
return community_size * speciation_rate * log(1.0 / speciation_rate) / (1 - speciation_rate);
}
std::map<unsigned long, long double> siSpeciesAbundanceCumulativeDistribution(const unsigned long &community_size,
const long double &speciation_rate)
{
std::map<unsigned long, long double> sad;
for(unsigned long i = 1; i < community_size; i++)
{
sad[i] = siMetacommunitySpeciesWithAbundance(i, community_size, speciation_rate);
}
return sad;
}
}