50 : fnvar(nvar), m_eps_rel(eps_rel), m_midpoint(equation,nvar), m_max_dt(max_dt)
54 for(
G4int i = 0; i < m_k_max + 1; ++i)
56 m_interval_sequence[i] = 2 * (i + 1);
59 m_cost[i] = m_interval_sequence[i];
63 m_cost[i] = m_cost[i-1] + m_interval_sequence[i];
65 for(
G4int k = 0; k < i; ++k)
68 /
static_cast<G4double>(m_interval_sequence[k]);
69 m_coeff[i][k] = 1.0 / (r * r - 1.0);
106 for(
G4int k = 0; k <= m_current_k_opt+1; ++k)
110 m_midpoint.SetSteps(m_interval_sequence[k]);
113 m_midpoint.DoStep(in, dxdt, out, dt);
118 m_midpoint.DoStep(in, dxdt, m_table[k-1], dt);
121 for (
G4int i = 0; i < fnvar; ++i)
123 m_err[i] = out[i] - m_table[0][i];
127 h_opt[k] = calc_h_opt(dt, error, k);
128 work[k] =
static_cast<G4double>(m_cost[k]) / h_opt[k];
130 if( (k == m_current_k_opt-1) || m_first)
136 if( (work[k] < KFAC2 * work[k-1]) || (m_current_k_opt <= 2) )
139 m_current_k_opt = std::min(m_k_max - 1 , std::max(2 , k + 1));
141 new_h *=
static_cast<G4double>(m_cost[k + 1])
146 m_current_k_opt = std::min(m_k_max - 1, std::max(2, k));
151 if(should_reject(error , k) && !m_first)
158 if(k == m_current_k_opt)
164 if(work[k-1] < KFAC2 * work[k])
166 m_current_k_opt = std::max( 2 , m_current_k_opt-1 );
167 new_h = h_opt[m_current_k_opt];
169 else if( (work[k] < KFAC2 * work[k-1]) && !m_last_step_rejected )
171 m_current_k_opt = std::min(m_k_max - 1, m_current_k_opt + 1);
173 new_h *=
static_cast<G4double>(m_cost[m_current_k_opt])
178 new_h = h_opt[m_current_k_opt];
182 if(should_reject(error, k))
185 new_h = h_opt[m_current_k_opt];
189 if(k == m_current_k_opt + 1)
194 if(work[k-2] < KFAC2 * work[k-1])
196 m_current_k_opt = std::max(2, m_current_k_opt - 1);
198 if((work[k] < KFAC2 * work[m_current_k_opt]) && !m_last_step_rejected)
200 m_current_k_opt = std::min(m_k_max - 1 , k);
202 new_h = h_opt[m_current_k_opt];
207 new_h = h_opt[m_current_k_opt];
219 if(!m_last_step_rejected || new_h < dt)
222 new_h = std::min(m_max_dt, new_h);
227 m_last_step_rejected = reject;