LandscapeDNDC 1.37.0
cmfcolumn.h
1
2#ifndef LM_CMFCOLUMN_H_
3#define LM_CMFCOLUMN_H_
4
5#include "mbe_legacymodel.h"
6#include "state/mbe_state.h"
7
8#include "watercycle/cmfcolumn/cmfcolumn-config.h"
9#include "ld_eventqueue.h"
10#ifdef CMFCOLUMN_HAVE_LATERAL
11# include <kernel/kcomm.h>
12#endif
13#include <string/cbm_string.h>
14#include <comm/cbm_msg.h>
15
16#include <vector>
17#include <memory>
18
19namespace ldndc { namespace event {
20 class EventFlood;
21}}
22
23namespace ldndc {
24
25struct CMFColumnSolute;
26struct CMFColumnSolutesTransportBase;
27
28class LDNDC_API WaterCycleCMFColumn : public MBE_LegacyModel
29{
30 LMOD_EXPORT_MODULE_INFO(WaterCycleCMFColumn,"watercycle:cmf","Watercycle CMF");
31private:
32 CMFConfig cfg;
33
34 int configure_watertransport_model( char const *);
35 int configure_solutetransport_model( char const *);
36 int configure_infiltration_model( char const *);
37 int configure_surfacerunoff_model( char const *);
38 int configure_evapotranspiration_model( char const *);
39
40public:
41 WaterCycleCMFColumn( MoBiLE_State *,
42 cbm::io_kcomm_t *, timemode_e);
43 ~WaterCycleCMFColumn();
44
45 lerr_t configure( ldndc::config_file_t const *);
46 lerr_t initialize();
47 lerr_t solve();
48 lerr_t finalize();
49
50 lerr_t register_ports( cbm::io_kcomm_t *);
51 lerr_t unregister_ports( cbm::io_kcomm_t *);
52
53 lerr_t sleep();
54 lerr_t wake();
55
56
57private:
58 cbm::io_kcomm_t * io_kcomm;
59#ifdef CMFCOLUMN_HAVE_LATERAL
60public:
61 lerr_t process_message( cbm::msg_t const *, cbm::reply_t *);
62 int register_cell();
63private:
64 cbm::kcomm_t kcomm;
65#endif
66 input_class_climate_t const * climate_in;
67 input_class_event_t const * event_in;
68 input_class_groundwater_t const * groundwater_in;
69 input_class_setup_t const * setup_in;
70 input_class_site_t const * site_in;
71 input_class_siteparameters_t const * siteparam_in;
72 input_class_soillayers_t const * soillayers_in;
73
74 substate_airchemistry_t const * airchem;
75 substate_surfacebulk_t * bulk;
76 substate_microclimate_t const * microclim;
77 substate_physiology_t * phys;
78 substate_soilchemistry_t * soilchem;
79 substate_watercycle_t * water;
80
81 MoBiLE_PlantVegetation * m_veg;
82
83 EventQueue m_HarvestEvents;
84 CBM_Handle m_HarvestHandle;
85
86#ifdef MoBiLE_WaterCycleSnowDNDC
87 WaterCycleSnowDNDC submodel_snowdndc;
88#endif
89
90 CMFObjects co;
91
92 // TODO move to transport model
93 // CMFColumnSolute * solutes;
94 // size_t n_solutes;
95
96 CMFColumnSolutesTransportBase * m_solutetransport;
97
98 CMFFluxes cmf_fluxes;
99 int initialize_fluxobservers();
100 bool have_integratables() const
101 { return this->cfg.flags.have_integratables == 1; }
102
103public:
104 lerr_t initialize_cmf();
105 bool configure_outlet_ownership(
106 ldndc::config_file_t const *, lerr_t * /*status*/);
107 bool configure_streamdischarge(
108 ldndc::config_file_t const *, lerr_t * /*status*/);
109 bool configure_groundwaterdischarge(
110 ldndc::config_file_t const *, lerr_t * /*status*/);
111 int create_cmf_cell();
112 int set_cmf_neighborhood();
113 int create_cmf_discharge();
114 int create_cmf_streamdischarge();
115 int create_cmf_groundwaterdischarge();
116 int create_cmf_surfacerunoff();
117 int initialize_cmf_cell();
118 int construct_soil_layers( cmf::upslope::Cell * = NULL,
119 input_class_soillayers_t const * = NULL);
120 int construct_vertical_connections();
121 int construct_infiltration();
122 int construct_canopy_storage();
123 int construct_vegetation();
124 int construct_snow_storage_and_melt();
125 int construct_evapotranspiration();
126 int construct_rainsource();
127 int unset_tracer_filter();
128
129
130 int prepare_solutes( cmf_config::solutestransport::model_e);
131 int link_solutes();
132 int solute_entities(
133 CMFColumnSolute *,
134 char const * /*solute name*/);
135 // sk:rm int link_solutes_for_model_coupled();
136 // sk:rm int link_solutes_for_model_waterflux();
137 // sk:rm int publish_solute_buffers(
138 // sk:rm char const * /*solute name*/, cbm::reply_t *);
139 // sk:rm int publish_fluxscale_buffer( cbm::reply_t *);
140
141 void set_cmf_internal_state();
142 void set_cmf_internal_state( int /*stage*/, cbm::reply_t *);
143 void set_weather();
144 void set_icefraction();
145 void set_vegetation();
146 void set_watertable();
147 void set_groundwaternitrate();
148
149 lerr_t solve_single_timestep();
150 void refresh_evapotranspiration();
151
152 void get_cmf_internal_state();
153 void get_cmf_internal_state(
154 int /*stage*/,
155 cbm::reply_t *);
156
157 void WaterThroughfall();
158 void SurfaceWater();
159 void SoilWater();
160 void WaterFluxes();
161 void CanopyWater();
162 void EvapoTranspiration();
163 void Transpiration();
164 void CanopyEvaporation();
165 // sk:unused void PotentialTranspiration();
166 // sk:unused void PotentialEvaporation();
167 void SoilEvaporation();
168 void SurfacewaterEvaporation();
169 void SnowEvaporation();
170
171 void Discharge();
172 double StreamDischarge();
173 double GroundwaterDischarge();
174 double Runoff();
175
176 // sk:off void SoluteLeaching();
177 // sk:off void SoluteThroughfall();
178
183 bool Harvest();
184
185 lerr_t event_flood();
186 lerr_t do_event_flood( event::EventFlood const *);
187 /* returns true in the case of current flood event, false otherwise */
188 bool have_flood_event();
189 lerr_t event_puddle();
190 /* returns true in the case of current puddle event, false otherwise */
191 bool have_puddle_events();
192
193#ifdef CMFCOLUMN_HAVE_SOLUTEBALANCES
194 lerr_t get_solutebalances( double *);
195 lerr_t send_solutebalances(
196 char const * /*command*/, char const * /*variable key*/);
197 lerr_t send_solutebalances_in();
198 lerr_t send_solutebalances_out();
199#endif
200
201// sk:off void dump_storages();
202};
203} /* namespace ldndc */
204
205#endif /* !LM_CMFCOLUMN_H_ */
206
Spatially explicit groundwater model.
Definition: airchemistryput.h:15