340{
344
346 G4int k, noReRoots = 0;
347
348 for(k = 0; k < 4; k++)
349 {
351 }
352
353 if(p[0] != 1.0)
354 {
355 for(k = 1; k < 5; k++)
356 {
357 p[k] = p[k] / p[0];
358 }
359 p[0] = 1.;
360 }
361 a3 = p[1];
362 a2 = p[2];
363 a1 = p[3];
365
366
367
368 p[1] = -a2;
369 p[2] = a1 * a3 - 4 *
a0;
370 p[3] = 4 * a2 *
a0 - a1 * a1 - a3 * a3 *
a0;
371
373
374 for(k = 1; k < 4; k++)
375 {
376 if(r[2][k] == 0.)
377 {
378 noReRoots++;
379 reRoot[k] = r[1][k];
380 }
381 else
383 }
385 for(k = 1; k < 4; k++)
386 {
387 if(reRoot[k] < y1)
388 {
389 y1 = reRoot[k];
390 }
391 }
392
393 R2 = 0.25 * a3 * a3 - a2 + y1;
394 b = 0.25 * (4 * a3 * a2 - 8 * a1 - a3 * a3 * a3);
395 c = 0.75 * a3 * a3 - 2 * a2;
396 a = c - R2;
397 d = 4 * y1 * y1 - 16 *
a0;
398
399 if(R2 > 0.)
400 {
401 R = std::sqrt(R2);
402 D2 = a + b / R;
403 E2 = a - b / R;
404
405 if(D2 >= 0.)
406 {
408 r[1][1] = -0.25 * a3 + 0.5 * R + 0.5 *
D;
409 r[1][2] = -0.25 * a3 + 0.5 * R - 0.5 *
D;
410 r[2][1] = 0.;
411 r[2][2] = 0.;
412 }
413 else
414 {
416 r[1][1] = -0.25 * a3 + 0.5 * R;
417 r[1][2] = -0.25 * a3 + 0.5 * R;
420 }
421 if(E2 >= 0.)
422 {
423 E = std::sqrt(E2);
424 r[1][3] = -0.25 * a3 - 0.5 * R + 0.5 * E;
425 r[1][4] = -0.25 * a3 - 0.5 * R - 0.5 * E;
426 r[2][3] = 0.;
427 r[2][4] = 0.;
428 }
429 else
430 {
431 E = std::sqrt(-E2);
432 r[1][3] = -0.25 * a3 - 0.5 * R;
433 r[1][4] = -0.25 * a3 - 0.5 * R;
434 r[2][3] = 0.5 * E;
435 r[2][4] = -0.5 * E;
436 }
437 }
438 else if(R2 < 0.)
439 {
440 R = std::sqrt(-R2);
443
444 r[1][1] = -0.25 * a3 + 0.5 * real(CD);
445 r[1][2] = -0.25 * a3 - 0.5 * real(CD);
446 r[2][1] = 0.5 * R + 0.5 * imag(CD);
447 r[2][2] = 0.5 * R - 0.5 * imag(CD);
450
451 r[1][3] = -0.25 * a3 + 0.5 * real(CE);
452 r[1][4] = -0.25 * a3 - 0.5 * real(CE);
453 r[2][3] = -0.5 * R + 0.5 * imag(CE);
454 r[2][4] = -0.5 * R - 0.5 * imag(CE);
455 }
456 else
457 {
458 if(d >= 0.)
459 {
460 D2 = c + std::sqrt(d);
461 E2 = c - std::sqrt(d);
462
463 if(D2 >= 0.)
464 {
466 r[1][1] = -0.25 * a3 + 0.5 * R + 0.5 *
D;
467 r[1][2] = -0.25 * a3 + 0.5 * R - 0.5 *
D;
468 r[2][1] = 0.;
469 r[2][2] = 0.;
470 }
471 else
472 {
474 r[1][1] = -0.25 * a3 + 0.5 * R;
475 r[1][2] = -0.25 * a3 + 0.5 * R;
478 }
479 if(E2 >= 0.)
480 {
481 E = std::sqrt(E2);
482 r[1][3] = -0.25 * a3 - 0.5 * R + 0.5 * E;
483 r[1][4] = -0.25 * a3 - 0.5 * R - 0.5 * E;
484 r[2][3] = 0.;
485 r[2][4] = 0.;
486 }
487 else
488 {
489 E = std::sqrt(-E2);
490 r[1][3] = -0.25 * a3 - 0.5 * R;
491 r[1][4] = -0.25 * a3 - 0.5 * R;
492 r[2][3] = 0.5 * E;
493 r[2][4] = -0.5 * E;
494 }
495 }
496 else
497 {
498 ds = std::sqrt(-d);
501
502 r[1][1] = -0.25 * a3 + 0.5 * real(CD);
503 r[1][2] = -0.25 * a3 - 0.5 * real(CD);
504 r[2][1] = 0.5 * R + 0.5 * imag(CD);
505 r[2][2] = 0.5 * R - 0.5 * imag(CD);
506
509
510 r[1][3] = -0.25 * a3 + 0.5 * real(CE);
511 r[1][4] = -0.25 * a3 - 0.5 * real(CE);
512 r[2][3] = -0.5 * R + 0.5 * imag(CE);
513 r[2][4] = -0.5 * R - 0.5 * imag(CE);
514 }
515 }
516 return 4;
517}
std::complex< G4double > G4complex