From 1c056e1aa1063f3c58677f0a1fa9aa49ed9be6cc Mon Sep 17 00:00:00 2001
From: Andreas Gattringer <andreas.gattringer@univie.ac.at>
Date: Thu, 13 Jul 2023 15:18:59 +0200
Subject: [PATCH] vital rates: make setting vital rate minimum value more
 consistent

---
 src/cats/configuration/load_vital_rates.c |  4 +++-
 src/cats/vital_rates/setup_rates.c        | 19 +++++++++++++++++++
 src/cats/vital_rates/setup_rates.h        |  4 +++-
 3 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/src/cats/configuration/load_vital_rates.c b/src/cats/configuration/load_vital_rates.c
index 228326b..d2d4d2b 100644
--- a/src/cats/configuration/load_vital_rates.c
+++ b/src/cats/configuration/load_vital_rates.c
@@ -251,7 +251,9 @@ void conf_load_vital_rate_extended(struct cats_vital_rate *vr, struct cats_confi
         conf_load_vital_rates_density(vr, conf, ini, species_section, param);
 
         char *vital_rate_minimum = compound_string(vr_name, "minimum", sep);
-        load_conf_value(false, ini, species_section, vital_rate_minimum, &vr->min_rate);
+        cats_dt_rates min_rate;
+        load_conf_value(false, ini, species_section, vital_rate_minimum, &min_rate);
+        set_vital_rate_minimum(vr, min_rate);
         free(vital_rate_minimum);
 
         switch (param->parametrization) {
diff --git a/src/cats/vital_rates/setup_rates.c b/src/cats/vital_rates/setup_rates.c
index 4e07efe..b826e25 100644
--- a/src/cats/vital_rates/setup_rates.c
+++ b/src/cats/vital_rates/setup_rates.c
@@ -109,6 +109,25 @@ void set_vital_rate_maximum(struct cats_vital_rate *vital, cats_dt_rates max_rat
 }
 
 
+void set_vital_rate_minimum(struct cats_vital_rate *vital, cats_dt_rates minimum)
+{
+        assert(vital != NULL);
+        if (minimum < 0) {
+                log_message(LOG_ERROR, "%s (%s): vital rate minimum %Lf must not be negative ", __func__,
+                            vital->name, minimum);
+                exit_cats(EXIT_FAILURE);
+        }
+
+        if (minimum > vital->max_rate) {
+                log_message(LOG_ERROR, "%s (%s): vital rate minimum %Lf must be less or equal to maximum %Lf "
+                            , __func__, vital->name, minimum, vital->max_rate);
+                exit_cats(EXIT_FAILURE);
+        }
+
+        vital->min_rate = minimum;
+
+}
+
 void set_vital_density(struct cats_vital_rate *vital, enum cats_density_dependence density)
 {
         assert(vital != NULL);
diff --git a/src/cats/vital_rates/setup_rates.h b/src/cats/vital_rates/setup_rates.h
index f700b88..3ea94f6 100644
--- a/src/cats/vital_rates/setup_rates.h
+++ b/src/cats/vital_rates/setup_rates.h
@@ -45,7 +45,7 @@ void set_vital_density(struct cats_vital_rate *vital, enum cats_density_dependen
 
 void load_vital_rates(struct cats_configuration *conf);
 
-void set_vital_cutoff(struct cats_vital_rate *vital, const cats_dt_rates value,
+void set_vital_cutoff(struct cats_vital_rate *vital, cats_dt_rates value,
                       const struct cats_species_param *param);
 
 enum cats_rate_function_type get_function_type(const struct cats_configuration *conf, const char *short_name);
@@ -60,4 +60,6 @@ void set_vital_rate_link_hybrid_function(struct cats_vital_rate *vr, struct cats
 
 void set_vital_density(struct cats_vital_rate *vital, enum cats_density_dependence density);
 
+void set_vital_rate_minimum(struct cats_vital_rate *vital, cats_dt_rates minimum);
+
 #endif //CATS_SETUP_RATES_H
-- 
GitLab