11#ifndef LDNDC_INPUT_SPECIESTYPES_H_
12#define LDNDC_INPUT_SPECIESTYPES_H_
14#include "crabmeat-common.h"
15#include "memory/cbm_mem.h"
16#include "time/cbm_date.h"
17#include "string/cbm_string.h"
18#include "species/speciesgroups.h"
19#include "speciesparameters/speciesparameterstypes.h"
22#include "containers/lstack.h"
24namespace ldndc{
namespace species
27#define IS_SPECIE(__name1__,__name2__) cbm::is_equal_i( __name1__, __name2__)
29#define MATCH_SPECIE(__type1__,__type2__) cbm::is_equal_i( __type1__, __type2__)
31typedef ldndc::stack< unsigned int > replace_index_t;
33struct species_properties_t;
34struct CBM_API specie_properties_factory_base_t
36 specie_properties_factory_base_t() {}
37 virtual ~specie_properties_factory_base_t() = 0;
39 virtual species_properties_t * new_instance()
const = 0;
40 virtual void delete_instance( species_properties_t *)
const = 0;
41 virtual species_properties_t * clone( species_properties_t *, species_properties_t
const *)
const = 0;
43template <
typename _G >
44struct CBM_API specie_properties_factory_t :
public specie_properties_factory_base_t
46 specie_properties_factory_t()
47 : specie_properties_factory_base_t()
50 species_properties_t * new_instance()
53 return CBM_DefaultAllocator->construct< _G >();
55 void delete_instance( species_properties_t * _props)
60 CBM_DefaultAllocator->destroy(
static_cast< _G *
>( _props));
64 species_properties_t * clone(
65 species_properties_t * _props_dst, species_properties_t
const * _props_src)
68 crabmeat_assert( _props_src);
70 _G * this_props_dst =
static_cast< _G *
>( _props_dst);
73 this_props_dst =
static_cast< _G *
>( this->new_instance());
79 *this_props_dst = *
static_cast< _G
const *
>( _props_src);
81 return this_props_dst;
85struct CBM_API species_properties_t
88 species_group_e group;
97 double fractional_cover;
106 double initial_biomass;
118 int seedbed_duration;
121 double seedling_number;
126 void initialize( species_group_e _group)
130 fractional_cover = 1.0;
131 height_max = invalid_dbl;
132 height_min = invalid_dbl;
133 initial_biomass = invalid_dbl;
134 number = invalid_dbl;
135 reduc_fac_c = invalid_dbl;
136 root_depth = invalid_dbl;
137 seedbed_duration = 0;
138 seedling_number = invalid_dbl;
139 volume = invalid_dbl;
143struct CBM_API any_properties_t :
public species_properties_t
145 any_properties_t & initialize()
147 species_properties_t::initialize( SPECIES_GROUP_ANY);
149 fractional_cover = 1.0;
150 height_max = invalid_dbl;
151 height_min = invalid_dbl;
152 initial_biomass = invalid_dbl;
153 number = invalid_dbl;
154 reduc_fac_c = invalid_dbl;
155 root_depth = invalid_dbl;
156 seedbed_duration = 0;
157 seedling_number = invalid_dbl;
158 volume = invalid_dbl;
163extern any_properties_t CBM_API
const any_properties_default;
164extern specie_properties_factory_t< any_properties_t > CBM_API
const any_properties_factory;
166struct CBM_API crop_properties_t :
public species_properties_t
168 crop_properties_t & initialize()
170 species_properties_t::initialize( SPECIES_GROUP_CROP);
172 seedbed_duration = 0;
173 seedling_number = invalid_dbl;
178extern crop_properties_t CBM_API
const crop_properties_default;
179extern specie_properties_factory_t< crop_properties_t > CBM_API
const crop_properties_factory;
181struct CBM_API grass_properties_t :
public species_properties_t
183 grass_properties_t & initialize()
185 species_properties_t::initialize( SPECIES_GROUP_GRASS);
186 height_max = invalid_dbl;
187 height_min = invalid_dbl;
188 root_depth = invalid_dbl;
194extern grass_properties_t CBM_API
const grass_properties_default;
195extern specie_properties_factory_t< grass_properties_t > CBM_API
const grass_properties_factory;
197struct CBM_API wood_properties_t :
public species_properties_t
199 wood_properties_t & initialize()
201 species_properties_t::initialize( SPECIES_GROUP_WOOD);
203 height_max = invalid_dbl;
204 height_min = invalid_dbl;
205 reduc_fac_c = invalid_dbl;
206 root_depth = invalid_dbl;
207 number = invalid_dbl;
208 volume = invalid_dbl;
213extern wood_properties_t CBM_API
const wood_properties_default;
214extern specie_properties_factory_t< wood_properties_t > CBM_API
const wood_properties_factory;
216extern species_properties_t CBM_API
const * species_properties_default[SPECIES_GROUP_CNT];
217extern specie_properties_factory_base_t CBM_API
const * species_properties_factories[SPECIES_GROUP_CNT];
218struct CBM_API species_properties_factory_t
220 species_properties_factory_t() {}
222 species_properties_t * new_properties( species_group_e)
const;
223 void delete_properties( species_properties_t *)
const;
225 species_properties_t * clone( species_properties_t *, species_properties_t
const *)
const;
227extern species_properties_factory_t CBM_API
const species_properties_factory;
230class CBM_API species_t
238 speciesparameters::speciesparameters_set_t par_;
240 speciesparameters::speciesparameters_set_t
const & get_parameters()
246 speciesparameters::speciesparameters_set_t
const & _par)
250 speciesparameters::speciesparameters_set_t
const * operator->()
257 species_group_e group()
260 return ( this->have_group_properties_) ? this->par_.GROUP() : SPECIES_GROUP_NONE;
263 char const * groupname()
266 return SPECIES_GROUP_NAMES[this->have_group_properties_ ? this->par_.GROUP() : SPECIES_GROUP_NONE];
272 return this->par_.TYPE();
281 return this->name_.c_str();
283 char const * name(
char const * _name)
286 return this->name_.c_str();
292 ldate_t
const & plant_date()
295 return this->plant_date_;
297 ldate_t
const & plant_date( ldate_t
const & _pd)
299 this->plant_date_ = _pd;
300 return this->plant_date_;
305 bool have_group_properties_;
306 union group_properties_t
308 crop_properties_t crop;
309 grass_properties_t grass;
310 wood_properties_t wood;
313 bool properties_exist()
316 return this->have_group_properties_;
319 species_properties_t * get_properties()
321 return static_cast< species_properties_t *
>( &this->group_properties_.wood);
323 species_properties_t
const * get_properties()
326 return static_cast< species_properties_t
const *
>( &this->group_properties_.wood);
330 crop_properties_t
const* crop()
const {
331 crabmeat_assert(this->properties_exist());
332 crabmeat_assert(this->group() == SPECIES_GROUP_CROP);
333 return static_cast<crop_properties_t const*
>(&this->group_properties_.crop);
337 grass_properties_t
const* grass()
const {
338 crabmeat_assert(this->properties_exist());
339 crabmeat_assert(this->group() == SPECIES_GROUP_GRASS);
340 return static_cast<grass_properties_t const*
>(&this->group_properties_.grass);
344 wood_properties_t
const* wood()
const {
345 crabmeat_assert(this->properties_exist());
346 crabmeat_assert(this->group() == SPECIES_GROUP_WOOD);
347 return static_cast<wood_properties_t const*
>(&this->group_properties_.wood);
352 lerr_t set_properties(
353 species_group_e _group,
354 species_properties_t
const * _props);
Spatially explicit groundwater model.
Definition airchemistryput.h:15