Class: RedShift::DerivativeFlow
- Defined in:
- lib/redshift/component.rb,
lib/redshift/target/c/flow/derivative.rb
Constant Summary
Constants inherited from Flow
Instance Attribute Summary collapse
-
#feedback ⇒ Object
readonly
Returns the value of attribute feedback.
Attributes inherited from Flow
Instance Method Summary collapse
- #flow_wrapper(cl, state) ⇒ Object
-
#initialize(v, f, feedback) ⇒ DerivativeFlow
constructor
A new instance of DerivativeFlow.
Methods inherited from Flow
#external_constant?, #make_ct_struct, #translate, #translate_link
Constructor Details
#initialize(v, f, feedback) ⇒ DerivativeFlow
Returns a new instance of DerivativeFlow.
108 109 110 111 |
# File 'lib/redshift/component.rb', line 108 def initialize v, f, feedback super(v, f) @feedback = feedback end |
Instance Attribute Details
#feedback ⇒ Object (readonly)
Returns the value of attribute feedback.
107 108 109 |
# File 'lib/redshift/component.rb', line 107 def feedback @feedback end |
Instance Method Details
#flow_wrapper(cl, state) ⇒ Object
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/redshift/target/c/flow/derivative.rb', line 2 def flow_wrapper cl, state var_name = @var flow = self flow_name = "flow_#{CGenerator.make_c_name cl.name}_#{var_name}_#{state}" feedback = @feedback Component::FlowWrapper.make_subclass flow_name do @inspect_str = "#{cl.name}:#{state}: #{var_name} = #{flow.formula}'" ssn = cl.shadow_struct.name cont_state_ssn = cl.cont_state_class.shadow_struct.name # We need the struct shadow_library_source_file.include(cl.shadow_library_include_file) init_rhs_name = "#{var_name}_init_rhs" cl.class_eval do shadow_attr_accessor init_rhs_name => "double #{init_rhs_name}" end shadow_library_source_file.define(flow_name).instance_eval do arguments "ComponentShadow *comp_shdw" declare :shadow => %{ struct #{ssn} *shadow; struct #{cont_state_ssn} *cont_state; ContVar *var; double antiddt, *scratch; double time_step; } setup :shadow => %{ shadow = (#{ssn} *)comp_shdw; cont_state = (#{cont_state_ssn} *)shadow->cont_state; var = &cont_state->#{var_name}; scratch = &shadow->#{init_rhs_name}; time_step = shadow->world->time_step; } setup :rk_level => %{ shadow->world->rk_level--; } # has to happen before referenced alg flows are called in other setups if feedback ## possible to unite these cases somehow? body %{ switch (shadow->world->rk_level) { case 0: #{flow.translate(self, "antiddt", 0, cl).join(" ")}; var->value_0 = var->value_1 = var->value_2 = var->value_3 = (antiddt - *scratch) / time_step; *scratch = antiddt; } shadow->world->rk_level++; var->rk_level = shadow->world->rk_level; } else body %{ switch (shadow->world->rk_level) { case 0: #{flow.translate(self, "antiddt", 0, cl).join(" ")}; var->value_1 = var->value_0; *scratch = antiddt; break; case 1: #{flow.translate(self, "antiddt", 1, cl).join(" ")}; var->value_2 = (antiddt - *scratch) / (time_step/2); *scratch = antiddt; break; case 2: #{flow.translate(self, "antiddt", 2, cl).join(" ")}; var->value_3 = (antiddt - *scratch) / (time_step/2); break; case 3: #{flow.translate(self, "antiddt", 3, cl).join(" ")}; var->value_0 = (antiddt - *scratch) / (time_step/2); break; default: rb_raise(#{declare_class RuntimeError}, "Bad rk_level, %d!", shadow->world->rk_level); } shadow->world->rk_level++; var->rk_level = shadow->world->rk_level; } end end define_c_method :calc_function_pointer do body "shadow->flow = &#{flow_name}" end end end |