DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦cdd73fe3d⟧ Ada Source

    Length: 9216 (0x2400)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Ran1_Package, seg_005382

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« 
        └─⟦this⟧ 

E3 Source Code



with Unchecked_Deallocation;

with Xlbt_Arithmetic;  
use Xlbt_Arithmetic;

package body Ran1_Package is
------------------------------------------------------------------------------
-- Ran1 returns a uniform random deviate between 0.0 and 1.0.  Uses linear
-- congruential methods using three portable not-as-good random number
-- generators.  Near infinite period with no sensible sequential correlation.
--
-- Based upon:  Ran1, pg 196;
-- Numerical Recipes: The Art Of Scientific Computing
-- W. H. Press, B. P. Flannery, S. A. Teukolsky, W. T. Vetterling
-- Cambridge University Press, 1986
------------------------------------------------------------------------------

    type Float_Array is array (S_Natural range <>) of Float;

    M1  : constant       := 259200;  
    Ia1 : constant       := 7141;  
    Ic1 : constant       := 54773;  
    Rm1 : constant Float := 1.0 / Float (M1);

    M2  : constant       := 134456;  
    Ia2 : constant       := 8121;  
    Ic2 : constant       := 28411;  
    Rm2 : constant Float := 1.0 / Float (M2);

    M3  : constant := 243000;  
    Ia3 : constant := 4561;  
    Ic3 : constant := 51349;

    type Ran1_Data_Rec is  
        record  
            Ix1 : S_Natural;  
            Ix2 : S_Natural;  
            Ix3 : S_Natural;  
            R   : Float_Array (1 .. 97);  
        end record;

    procedure Free_Ran1_Data is new Unchecked_Deallocation (Ran1_Data_Rec,  
                                                            Ran1_Data);

--\x0c
    function Ran1_Initialize (Iseed : S_Natural) return Ran1_Data is
------------------------------------------------------------------------------
--  Iseed   - Specifies the initial seed value to be passed to the RAN()
--              during our initialization.
-- Called to create and initialize a Ran1_Data area for use with Ran1.
------------------------------------------------------------------------------
        Data : Ran1_Data := new Ran1_Data_Rec;  
    begin

----Seed the first generator.

        Data.Ix1 := (Ic1 - Iseed) mod M1;  
        Data.Ix1 := (Ia1 * Data.Ix1 + Ic1) mod M1;

----Use the first to seed the second and third.

        Data.Ix2 := Data.Ix1 mod M2;  
        Data.Ix1 := (Ia1 * Data.Ix1 + Ic1) mod M1;  
        Data.Ix3 := Data.Ix1 mod M3;

----Fill the table with sequential uniform deviates generated by the first two
--  generators.

        for I in Data.R'Range loop  
            Data.Ix1   := (Ia1 * Data.Ix1 + Ic1) mod M1;  
            Data.Ix2   := (Ia2 * Data.Ix2 + Ic2) mod M2;  
            Data.R (I) := (Float (Data.Ix1) + Float (Data.Ix2) * Rm2) * Rm1;  
        end loop;  
        return Data;

    end Ran1_Initialize;

--\x0c
    procedure Ran1_Free (Idum : in out Ran1_Data) is
------------------------------------------------------------------------------
--  Idum        - Specifies the data area to free.
-- Called to free up the Ran1_Data area allocated by Ran1_Initialize.  It is
-- OK to call this with a null.
------------------------------------------------------------------------------
    begin

        Free_Ran1_Data (Idum);

    end Ran1_Free;

--\x0c
    function Ran1 (Idum : Ran1_Data) return Float is
------------------------------------------------------------------------------
--  Idum    - Specifies the Ran1_Data to use in calculating the next random
--              value.
-- Called to calculate the next uniform random deviate between 0.0 and 1.0.
------------------------------------------------------------------------------
        J : S_Long;  
        F : Float;  
    begin

        Idum.Ix1 := (Ia1 * Idum.Ix1 + Ic1) mod M1;  
        Idum.Ix2 := (Ia2 * Idum.Ix2 + Ic2) mod M2;  
        Idum.Ix3 := (Ia3 * Idum.Ix3 + Ic3) mod M3;  
        J        := 1 + (Idum.R'Last * Idum.Ix3) / M3;  
        if J > Idum.R'Last then  
            J := J - 1;  
        end if;  
        F          := Idum.R (J);  
        Idum.R (J) := (Float (Idum.Ix1) + Float (Idum.Ix2) * Rm2) * Rm1;  
        return F;

    end Ran1;

--\x0c
end Ran1_Package;  

E3 Meta Data

    nblk1=8
    nid=7
    hdr6=e
        [0x00] rec0=1b rec1=00 rec2=01 rec3=03a
        [0x01] rec0=1a rec1=00 rec2=08 rec3=018
        [0x02] rec0=01 rec1=00 rec2=02 rec3=004
        [0x03] rec0=1d rec1=00 rec2=03 rec3=076
        [0x04] rec0=00 rec1=00 rec2=06 rec3=008
        [0x05] rec0=1b rec1=00 rec2=04 rec3=046
        [0x06] rec0=08 rec1=00 rec2=05 rec3=000
        [0x07] rec0=02 rec1=40 rec2=00 rec3=0c3
    tail 0x217008920819788ea4898 0x42a00088462063203
Free Block Chain:
  0x7: 0000  00 00 00 04 80 01 20 01 00 00 00 00 00 00 00 01  ┆                ┆