BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
ranlxd.c File Reference
#include <float.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

Go to the source code of this file.

Classes

struct  vec_t
struct  dble_vec_t

Macros

#define BASE   0x1000000
#define MASK   0xffffff
#define STEP(pi, pj)

Functions

void rlxd_init (int level, int seed)
void ranlxd (double r[], int n)
int rlxd_size (void)
void rlxd_get (int state[])
void rlxd_reset (int state[])

Macro Definition Documentation

◆ BASE

#define BASE   0x1000000

Definition at line 305 of file Phokhara/src/ranlxd.c.

◆ MASK

#define MASK   0xffffff

Definition at line 306 of file Phokhara/src/ranlxd.c.

◆ STEP

#define STEP ( pi,
pj )

Definition at line 325 of file Phokhara/src/ranlxd.c.

325# define STEP( pi, pj ) \
326 d = ( *pj ).c1.c1 - ( *pi ).c1.c1 - carry.c1; \
327 ( *pi ).c2.c1 += ( d < 0 ); \
328 d += BASE; \
329 ( *pi ).c1.c1 = d & MASK; \
330 d = ( *pj ).c1.c2 - ( *pi ).c1.c2 - carry.c2; \
331 ( *pi ).c2.c2 += ( d < 0 ); \
332 d += BASE; \
333 ( *pi ).c1.c2 = d & MASK; \
334 d = ( *pj ).c1.c3 - ( *pi ).c1.c3 - carry.c3; \
335 ( *pi ).c2.c3 += ( d < 0 ); \
336 d += BASE; \
337 ( *pi ).c1.c3 = d & MASK; \
338 d = ( *pj ).c1.c4 - ( *pi ).c1.c4 - carry.c4; \
339 ( *pi ).c2.c4 += ( d < 0 ); \
340 d += BASE; \
341 ( *pi ).c1.c4 = d & MASK; \
342 d = ( *pj ).c2.c1 - ( *pi ).c2.c1; \
343 carry.c1 = ( d < 0 ); \
344 d += BASE; \
345 ( *pi ).c2.c1 = d & MASK; \
346 d = ( *pj ).c2.c2 - ( *pi ).c2.c2; \
347 carry.c2 = ( d < 0 ); \
348 d += BASE; \
349 ( *pi ).c2.c2 = d & MASK; \
350 d = ( *pj ).c2.c3 - ( *pi ).c2.c3; \
351 carry.c3 = ( d < 0 ); \
352 d += BASE; \
353 ( *pi ).c2.c3 = d & MASK; \
354 d = ( *pj ).c2.c4 - ( *pi ).c2.c4; \
355 carry.c4 = ( d < 0 ); \
356 d += BASE; \
357 ( *pi ).c2.c4 = d & MASK

Function Documentation

◆ ranlxd()

void ranlxd ( double r[],
int n )

Definition at line 493 of file Phokhara/src/ranlxd.c.

493 {
494 int k;
495
496 if ( init == 0 ) rlxd_init( 0, 1 );
497
498 for ( k = 0; k < n; k++ )
499 {
500 is = next[is];
501 if ( is == is_old ) update();
502 r[k] = one_bit * ( (double)( x.num[is + 4] ) + one_bit * (double)( x.num[is] ) );
503 }
504}
const Int_t n
void rlxd_init(int level, int seed)

◆ rlxd_get()

void rlxd_get ( int state[])

Definition at line 508 of file Phokhara/src/ranlxd.c.

508 {
509 int k;
510
511 if ( init == 0 ) error( 3 );
512
513 state[0] = rlxd_size();
514
515 for ( k = 0; k < 96; k++ ) state[k + 1] = x.num[k];
516
517 state[97] = carry.c1;
518 state[98] = carry.c2;
519 state[99] = carry.c3;
520 state[100] = carry.c4;
521
522 state[101] = pr;
523 state[102] = ir;
524 state[103] = jr;
525 state[104] = is;
526}
int rlxd_size(void)

◆ rlxd_init()

void rlxd_init ( int level,
int seed )

Definition at line 430 of file Phokhara/src/ranlxd.c.

430 {
431 int i, k, l;
432 int ibit, jbit, xbit[31];
433 int ix, iy;
434
435 if ( ( INT_MAX < 2147483647 ) || ( FLT_RADIX != 2 ) || ( FLT_MANT_DIG < 24 ) ||
436 ( DBL_MANT_DIG < 48 ) )
437 error( 0 );
438
439 define_constants();
440
441 if ( level == 1 ) pr = 202;
442 else if ( level == 2 ) pr = 397;
443 else error( 1 );
444
445 i = seed;
446
447 for ( k = 0; k < 31; k++ )
448 {
449 xbit[k] = i % 2;
450 i /= 2;
451 }
452
453 if ( ( seed <= 0 ) || ( i != 0 ) ) error( 2 );
454
455 ibit = 0;
456 jbit = 18;
457
458 for ( i = 0; i < 4; i++ )
459 {
460 for ( k = 0; k < 24; k++ )
461 {
462 ix = 0;
463
464 for ( l = 0; l < 24; l++ )
465 {
466 iy = xbit[ibit];
467 ix = 2 * ix + iy;
468
469 xbit[ibit] = ( xbit[ibit] + xbit[jbit] ) % 2;
470 ibit = ( ibit + 1 ) % 31;
471 jbit = ( jbit + 1 ) % 31;
472 }
473
474 if ( ( k % 4 ) != i ) ix = 16777215 - ix;
475
476 x.num[4 * k + i] = ix;
477 }
478 }
479
480 carry.c1 = 0;
481 carry.c2 = 0;
482 carry.c3 = 0;
483 carry.c4 = 0;
484
485 ir = 0;
486 jr = 7;
487 is = 91;
488 is_old = 0;
489 prm = pr % 12;
490 init = 1;
491}
#define ix(i)

Referenced by ranlxd().

◆ rlxd_reset()

void rlxd_reset ( int state[])

Definition at line 528 of file Phokhara/src/ranlxd.c.

528 {
529 int k;
530
531 if ( ( INT_MAX < 2147483647 ) || ( FLT_RADIX != 2 ) || ( FLT_MANT_DIG < 24 ) ||
532 ( DBL_MANT_DIG < 48 ) )
533 error( 4 );
534
535 define_constants();
536
537 if ( state[0] != rlxd_size() ) error( 5 );
538
539 for ( k = 0; k < 96; k++ )
540 {
541 if ( ( state[k + 1] < 0 ) || ( state[k + 1] >= 167777216 ) ) error( 5 );
542
543 x.num[k] = state[k + 1];
544 }
545
546 if ( ( ( state[97] != 0 ) && ( state[97] != 1 ) ) ||
547 ( ( state[98] != 0 ) && ( state[98] != 1 ) ) ||
548 ( ( state[99] != 0 ) && ( state[99] != 1 ) ) ||
549 ( ( state[100] != 0 ) && ( state[100] != 1 ) ) )
550 error( 5 );
551
552 carry.c1 = state[97];
553 carry.c2 = state[98];
554 carry.c3 = state[99];
555 carry.c4 = state[100];
556
557 pr = state[101];
558 ir = state[102];
559 jr = state[103];
560 is = state[104];
561 is_old = 8 * ir;
562 prm = pr % 12;
563 init = 1;
564
565 if ( ( ( pr != 202 ) && ( pr != 397 ) ) || ( ir < 0 ) || ( ir > 11 ) || ( jr < 0 ) ||
566 ( jr > 11 ) || ( jr != ( ( ir + 7 ) % 12 ) ) || ( is < 0 ) || ( is > 91 ) )
567 error( 5 );
568}

◆ rlxd_size()

int rlxd_size ( void )

Definition at line 506 of file Phokhara/src/ranlxd.c.

506{ return ( 105 ); }

Referenced by rlxd_get(), and rlxd_reset().

Variable Documentation

◆ num

int num[96]

Definition at line 322 of file Phokhara/src/ranlxd.c.

◆ vec

dble_vec_t vec[12]

Definition at line 321 of file Phokhara/src/ranlxd.c.