traitecoevo / plant

Trait-Driven Models of Ecology and Evolution :evergreen_tree:
https://traitecoevo.github.io/plant
53 stars 20 forks source link

Define a Strategy class and inherit from it in FF16_Strategy #211

Closed rafaqz closed 4 years ago

rafaqz commented 5 years ago

The base Strategy class would include all methods called from the Plant class, and all methods that would be universally required.

This will simplify adding strategies that differ from FF16, but avoid a lot of the duplication that occurred in FW20.

dfalster commented 5 years ago

Great idea

dfalster commented 5 years ago

Actually, not sure about this. In a very simple strategy, we would drop most of the content FF16. So agreed we should create a base class with Strategy, but this would not necessarily remove all the duplication. The core functions would be something like this:


class Base_Strategy {
public:
  typedef std::shared_ptr<Base_Strategy> ptr;
  FF16_Strategy();

  // update this when the length of state_names changes
  static size_t state_size ();
  // update this when the length of aux_names changes
  size_t aux_size ();

  static std::vector<std::string> state_names();

  std::vector<std::string> aux_names();

  // TODO : expose this so can access state_names directly
  std::map<std::string, int> state_index; 
  std::map<std::string, int> aux_index; 

  bool collect_all_auxillary;

  // This would get renamed to something more generic - get_competiton_effect ?
  double area_leaf(double height) const;

  void refresh_indices();

  // This would get renamed to something more generic -- compute_rates
  void compute_vars_phys(const Environment& environment, bool reuse_intervals,
                Internals& vars);

  void update_dependent_aux(const int index, Internals& vars);

  // [eqn 20] Survival of seedlings during germination
  double germination_probability(const Environment& environment);

  // * Competitive environment
  // This would get renamed to something more generic -- compute_competition
  double area_leaf_above(double z, double height, double area_leaf_) const;

  // This would get renamed to something more generic -- initial size?

  // The aim is to find a plant height that gives the correct seed mass.
  double height_seed(void) const;

  // Every Strategy needs a set of Control objects
  Control control;

  std::string name;
};

Base_Strategy::ptr make_strategy_ptr(Base_Strategy s);

}
rafaqz commented 5 years ago

For sure, it might not save that much code. But it's also useful for being explicit about the core requirements for a strategy. Currently its not so clear to me what is specific to FF_16 and what is general.

Should I put together a pull request with this Strategy class? it would be a good practise run.

dfalster commented 5 years ago

Agreed. Yes, sure.

dfalster commented 5 years ago

Review for yourself what should be included.

rafaqz commented 5 years ago

We can also do more layers of inheritance when there are similar strategies that share a larger amount of code than is covered in Strategy

dfalster commented 5 years ago

Yes, sounds good.

We should also find a place to pull out those routines integrating assimilation over the leaf area of the plant. While the particular photosynthesis equation may differ among strategies, the integration function is more generic may all be used by multiple strategies. Plus, we'd like to try alternatives for each strategy.

rafaqz commented 5 years ago

Ok I'll have a look at doing that too.

dfalster commented 4 years ago

Addressed via #235