167{
170
172
173 a = current_substep.state_x[DERIVATIVE_2][index]/2;
174 b = current_substep.state_x[DERIVATIVE_1][index] - current_substep.state_q[DERIVATIVE_1][index] ;
175 c = current_substep.state_x[DERIVATIVE_0][index] - current_substep.state_q[DERIVATIVE_0][index];
176
177
178 if (qss_order == 3 && current_substep.state_x[DERIVATIVE_3][index] != 0.0)
179 {
180
181 h = current_substep.state_x[DERIVATIVE_3][index]/6;
182 a -= current_substep.state_q[DERIVATIVE_2][index]/2;
183
184 G4double q_cube = fCharge*fCharge*fCharge;
185
186
187 if (a == 0 && b == 0 && c == 0)
188 {
189 delta_sync_t = cbrt(std::fabs(dq/h));
190 }
191 else
192 {
193 a /= h;
194 b /= h;
195 c /= h;
196
197 G4double qLocal = (a * a - 3 * b) * (1.0 / 9.0);
198 G4double r_base = (2*a*a*a - 9*a*b + 27*c)*(1.0/54.0);
199
200 G4double sqrt_q = std::sqrt(qLocal);
201 G4double sqrt_q_cube = std::sqrt(q_cube);
204 {
206
207 if (r*r < q_cube)
208 {
209 G4double theta = std::acos(r/sqrt_q_cube);
210 G4double t1 = -2*sqrt_q*std::cos((1./3.)*theta) - a_over_3;
211 G4double t2 = -2*sqrt_q*std::cos((1./3.)*(theta+2*CLHEP::pi)) - a_over_3;
212 G4double t3 = -2*sqrt_q*std::cos((1./3.)*(theta-2*CLHEP::pi)) - a_over_3;
214 {
215 if (t > 0) { delta_sync_t = std::fmin(delta_sync_t,t); }
216 }
217 }
218
219 else
220 {
221 G4double A = -copysign(1,r) * cbrt(std::fabs(r) + std::sqrt(r*r - q_cube));
224 if (t1 > 0) {delta_sync_t = std::fmin(delta_sync_t,t1);}
225 }
226 }
227 }
228 }
229
230
231 else if (qss_order == 1 || a == 0)
232 {
233
234 if (b == 0) { delta_sync_t = INFTY; }
235
236
237 else if ( (b > 0) == (dq > c) ) { delta_sync_t = (dq-c)/b; }
238 else { delta_sync_t = (-dq-c)/b; }
239 }
240
241 else
242 {
243 if (b == 0)
244 {
245
246
247 if ((a > 0) == (dq > c)) {delta_sync_t = std::sqrt((dq-c)/a);}
248 else {delta_sync_t = std::sqrt((-dq-c)/a);}
249 }
250 else
251 {
252
255 G4double discriminator_base = b*b - a4*c;
256 G4double discriminator_difference = a4*dq;
257 G4double discriminator_1 = discriminator_base + discriminator_difference;
258 G4double discriminator_2 = discriminator_base - discriminator_difference;
259 G4double fixed_solution_part = -b/a2;
260
261
262 for(
G4double discriminator : {discriminator_1, discriminator_2})
263 {
264 if (discriminator < 0) { continue; }
265 G4double variable_solution_part = std::sqrt(discriminator)/std::fabs(a2);
266 G4double t_local = fixed_solution_part - variable_solution_part;
267
268 if (t_local <= 0 )
269 {
270 t_local = fixed_solution_part + variable_solution_part;
271 }
272 if (t_local > 0) { delta_sync_t = std::fmin(delta_sync_t,t_local); }
273 }
274 }
275 }
276
277 current_substep.sync_t[index] = current_substep.state_tx[index] + delta_sync_t;
278}
G4double B(G4double temperature)