1010#include " nlohmann/json.hpp"
1111#include " gimmicks.hpp"
1212#include " pmc_resource.hpp"
13+ #include " gas_data.hpp"
1314
1415extern " C" void f_gas_state_ctor (void *ptr) noexcept ;
1516extern " C" void f_gas_state_dtor (void *ptr) noexcept ;
@@ -18,21 +19,32 @@ extern "C" void f_gas_state_get_item(const void *ptr, const int *idx, double *va
1819extern " C" void f_gas_state_len (const void *ptr, int *len) noexcept ;
1920extern " C" void f_gas_state_to_json (const void *ptr) noexcept ;
2021extern " C" void f_gas_state_from_json (const void *ptr) noexcept ;
22+ extern " C" void f_gas_state_set_size (const void *ptr, const void *gasdata_ptr) noexcept ;
23+ extern " C" void f_gas_state_mix_rats (const void *ptr, const double *data, const int *len);
2124
2225struct GasState {
2326 PMCResource ptr;
2427
25- GasState (const nlohmann::json &json) :
28+ /* GasState(const GasData &gas_data,
29+ const nlohmann::json &json) :
2630 ptr(f_gas_state_ctor, f_gas_state_dtor)
2731 {
2832 gimmick_ptr() = std::make_unique<InputGimmick>(json);
2933
3034 const int n = json.empty() ? 0 : gimmick_ptr()->find("gas_mixing_ratio")->size();
35+ f_gas_state_set_size(this->ptr.f_arg(), &gas_data.ptr);
3136 //f_gas_state_set_size(this->ptr.f_arg(), &n);
3237 if (n != 0) f_gas_state_from_json(this->ptr.f_arg());
3338
3439 gimmick_ptr().reset(); // TODO #117: guard
3540 }
41+ */
42+
43+ GasState (const GasData &gas_data) :
44+ ptr (f_gas_state_ctor, f_gas_state_dtor)
45+ {
46+ f_gas_state_set_size (this ->ptr .f_arg (), &gas_data.ptr );
47+ }
3648
3749 static void set_item (const GasState &self, const int &idx, const double &val) {
3850 if (idx < 0 || idx >= (int )__len__ (self))
@@ -63,4 +75,29 @@ struct GasState {
6375 f_gas_state_len (&self.ptr , &len);
6476 return len;
6577 }
78+
79+ static double mix_rat (const GasState &self, const GasData &gasData,
80+ const std::string &name) {
81+ int value;
82+ const int name_size = name.size ();
83+
84+ f_gas_data_spec_by_name (&gasData.ptr , &value, name.c_str (), &name_size);
85+ if (value==0 ) throw std::runtime_error (" Element not found." );
86+ return get_item (self, value-1 );
87+ }
88+
89+ static void set_size (GasState &self, const GasData &GasData) {
90+ f_gas_state_set_size (&self.ptr , &GasData.ptr );
91+ }
92+
93+ static std::valarray<double > mix_rats (const GasState &self) {
94+ int len;
95+ f_gas_state_len (&self.ptr , &len);
96+ std::valarray<double > data (len);
97+
98+ for (int idx = 0 ; idx < len; idx++) {
99+ f_gas_state_get_item (&self.ptr , &idx, &data[idx]);
100+ }
101+ return data;
102+ }
66103};
0 commit comments