9#ifndef LDNDC_DATASYNTH_COMMON_STREAMDATA_H_
10#define LDNDC_DATASYNTH_COMMON_STREAMDATA_H_
12#include "synthesizers/synth.h"
13#include "time/cbm_date.h"
15#define SYNTH_REC_SIZE_(__ic__) ((size_t)__ic__::record::RECORD_SIZE)
17#define SYNTH_REC_GET_(__ic__,__reg__,__item__) (__reg__)[__ic__::record::RECORD_ITEM_ ## __item__]
19#define SYNTH_REC_DECL_GET_(__ic__,__reg__,__t__,__item__) \
20 element_type const __reg__##_##__t__( \
21 SYNTH_REC_GET_(__ic__,_scratch->rec_##__t__,__item__))
23#define SYNTH_REC_DECL_GET_AND_CHK_VALID_(__ic__,__reg__,__t__,__item__) \
24 SYNTH_REC_DECL_GET_(__ic__,__reg__,__t__,__item__); \
25 if ( cbm::is_invalid( __reg__##_##__t__)) \
27 CBM_LogError( "dependency was invalid:", #__item__); \
28 return LDNDC_ERR_FAIL; \
31#define SYNTH_INVALIDATE_BUFFER_(__ic__,__buf__) \
33 __buf__, static_cast< size_t >( \
34 __ic__::record::RECORD_SIZE), \
35 ldndc::invalid_t< __ic__::record::item_type >::value)
38# define SYNTH_CHK_MATCHING_(__ic__,__item__) \
39 if ( __ic__::record::RECORD_ITEM_ ## __item__ != this->record_item_type()) \
41 CBM_LogFatal( "types not matching ..", \
42 __ic__::RECORD_ITEM_NAMES[__ic__::record::RECORD_ITEM_##__item__],\
44 __ic__::RECORD_ITEM_NAMES[this->record_item_type()]); \
47# define SYNTH_CHK_MATCHING_(__ic__,__item__)
50#define SYNTH_CALL_LOOP_TEST_AND_SET_(__ic__,__item__) \
51 SYNTH_CHK_MATCHING_(__ic__,__item__) \
52 if ( _scratch->call_mask_test( __ic__::record::RECORD_ITEM_ ## __item__)) \
54 CBM_LogError( "detected loop in ",#__ic__," synthesizer calls (", #__item__, ")"); \
55 return LDNDC_ERR_FAIL; \
57 _scratch->call_mask_set( __ic__::record::RECORD_ITEM_ ## __item__)
58#define SYNTH_RETURN_SUCCESS_(__ic__,__item__) \
59 _scratch->call_mask_unset( __ic__::record::RECORD_ITEM_ ## __item__); \
63#define SYNTH_RECORD_ITEM_COMMON_DECL_(__ic__,__class__,__item_enum__) \
67 R = record::RECORD_ITEM_## __item_enum__ \
69 record::record_item_e record_item_type() \
72 return (record::record_item_e)R; \
86 __ic__##_info_t const * ) const;
89template <
typename,
unsigned int >
92namespace ldndc{
namespace synth
94 template <
typename _SD >
95 struct streamdata_scratch_base_t
97 virtual ~streamdata_scratch_base_t() = 0;
100 typename _SD::element_type rec_s[_SD::RECORD_SIZE];
102 typename _SD::element_type rec_d[_SD::RECORD_SIZE];
104 unsigned int src_res, tgt_res;
105 unsigned int t_res_inout;
109 unsigned int julian_day;
111 double day_fraction()
114 return 1.0 / (double)this->tgt_res;
119 return 24.0 / (double)this->tgt_res;
122 virtual lerr_t initialize(
123 typename _SD::boundary_data_type
const * ,
125 ltime_t
const * ) = 0;
127 virtual lerr_t configure(
128 typename _SD::boundary_data_type
const * ,
135 typename _SD::record_item_e _e)
137 this->call_mask |= (lflags_t)1 << _e;
139 void call_mask_unset(
140 typename _SD::record_item_e _e)
142 this->call_mask &= ~((lflags_t)1 << _e);
145 typename _SD::record_item_e _e)
const
147 return (( this->call_mask & ((lflags_t)1 << _e)) != 0);
151 template <
typename _SD >
152 streamdata_scratch_base_t< _SD >::~streamdata_scratch_base_t()
156 template <
typename _SD,
typename _SCRATCH_T >
157 struct streamdata_item_base_t
159 typedef typename _SD::element_type element_type;
161 virtual ~streamdata_item_base_t() = 0;
163 virtual typename _SD::record_item_e record_item_type()
const = 0;
165 virtual lerr_t synthesize(
166 typename _SD::element_type * ,
167 typename _SD::element_type * ,
174 typename _SD::boundary_data_type
const * )
const = 0;
177 template <
typename _SD,
typename _SCRATCH_T >
178 streamdata_item_base_t< _SD, _SCRATCH_T >::~streamdata_item_base_t()
182 template <
typename _SD >
183 class streamdata_synth_base_t :
public lsynth_base_t
186 streamdata_synth_base_t();
187 virtual ~streamdata_synth_base_t() = 0;
193 virtual lerr_t configure(
195 unsigned int = ldndc::invalid_t< unsigned int >::value ) = 0;
201 virtual lerr_t synthesize_record(
202 typename _SD::element_type
const * ,
typename _SD::element_type * ,
203 typename _SD::element_type
const * ,
typename _SD::element_type * ,
207 lvector_t< unsigned int, 1 > * = NULL ) = 0;
216 virtual lerr_t check_record(
217 typename _SD::element_type
const * ,
218 typename _SD::element_type
const * )
const = 0;
221 template <
typename _SD >
222 streamdata_synth_base_t< _SD >::streamdata_synth_base_t()
227 template <
typename _SD >
228 streamdata_synth_base_t< _SD >::~streamdata_synth_base_t()
Spatially explicit groundwater model.
Definition airchemistryput.h:15