Model Desktop1 : 
 
Event   start : 
    start =         1 (boolean) 
    Maximum = 0
    Comments:
        Event that occurs once at start of simulation 
 
State   split id : 
    split id =         [[U235 atoms/fission,trigger_magnitude()],[reset...,0]] (real) 
    
    Comments:
        Only one atom should split at a time, so this state is the index of the last atom to split 
Submodel Hit : 
    Submodel "Hit" an association submodel between "U235 atoms" (in role "is") and "Neutrons" (in role "does").
 
Condition   cond1 : 
    cond1 =         dist<1 (cond_spec) 
    Where:
        dist = Value(s) of dist_sqd
    
    Comments:
        True if neutron and atom are less than 1 distance unit apart. This allows the time of the collision event to be set precisely since the association will already exist. 
 
Event   happens : 
    happens =         dist_sqd (boolean) 
    Where:
        dist_sqd = Value(s) of dist_sqd
    Minimum = 0.25
    Comments:
        Splitting happens if neutron gets within 0.5 distance units of atom. 
 
Variable   dist_sqd : 
    dist_sqd =         (is_x-does_x)^2+(is_y-does_y)^2 (real) 
    Where:
        is_y = Value(s) of ../U235 atoms/y from submodel "U235 atoms" in role "is"
        {every_y} = Value(s) of ../U235 atoms/y
        is_x = Value(s) of ../U235 atoms/x from submodel "U235 atoms" in role "is"
        {every_x} = Value(s) of ../U235 atoms/x
        does_x = Value(s) of ../Neutrons/x from submodel "Neutrons" in role "does"
        {every_x_0} = Value(s) of ../Neutrons/x
        does_y = Value(s) of ../Neutrons/y from submodel "Neutrons" in role "does"
        {every_y_0} = Value(s) of ../Neutrons/y
    
    Comments:
        Square of distance between neutron and atom 
Submodel U235 atoms : 
    Submodel "U235 atoms" is a population submodel.
 
Creation   cr1 : 
    cr1 =         896 (real) 
    
    Comments:
        Initial population of atoms 
 
Event   decay : 
    decay =         after(exprnd(10000),"true") (boolean) 
    
    Comments:
        Each atom will spontaneously decay after a time sampled from a random-exponential distribution if left alone 
 
Event   fission : 
    fission =         index(1) (real) 
    
    Comments:
        Caused either by spontaneous decay or splitting by a neutron. Value is index of atom. 
 
Loss   loss1 : 
    loss1 =         1 (int) 
    
    Comments:
        Atom always removed after fission occurs 
 
Variable   size : 
    size =         2 (int) 
    
    Comments:
        For lollipop display 
 
Variable   x : 
    x =         element([x],index(1)) (real) 
    Where:
        [x] = Value(s) of ../start posns/x
    
 
Variable   y : 
    y =         element([y],index(1)) (real) 
    Where:
        [y] = Value(s) of ../start posns/y
    
Submodel Neutrons : 
    Submodel "Neutrons" is a population submodel.
 
Compartment   x : 
    Initial value = element([x],split_id) (real)
    Where:
        [x] = Value(s) of ../start posns/x
        split_id = Value(s) of ../split id
    
    
    Comments:
        Starting X position, looked up from array using index of atom that just split 
 
Compartment   y : 
    Initial value = element([y],split_id) (real)
    Where:
        [y] = Value(s) of ../start posns/y
        split_id = Value(s) of ../split id
    
    
    Comments:
        Starting Y position, looked up from array using index of atom that just split 
 
Flow   flow1 : 
    flow1 =         rand_const(-0.5,0.5) (1/day) 
    
 
Flow   flow2 : 
    flow2 =         rand_const(-0.5,0.5) (1/day) 
    
 
Immigration   im1 : 
    im1 =         2 (real) 
    
    Comments:
        Number of new neutrons produced when an atom undergoes fission 
 
Loss   loss102 : 
    loss102 =         x<-20 or x>120 or y<-20 or y>120 (boolean) 
    Where:
        x = Value(s) of x
        y = Value(s) of y
    
    Comments:
        Neutron is removed from simulation if it is heading away from the atoms to save processing time 
 
Loss   loss2 : 
    loss2 =         1 (int) 
    
    Comments:
        Old neutron removed when it splits an atom, so new ones will have new random trajectories 
 
Variable   size : 
    size =         1 (int) 
    
    Comments:
        For lollipop display 
Submodel start posns : 
    Submodel "start posns" is a fixed_membership multi-instance submodel with dimensions [896].
    Comments:
        This is a 1-D array for calculating the positions of all the atoms, used to set them up and to set positions of new neutrons when they split 
 
Variable   x : 
    x =         3*((index(1)-1)%32)+3 (real) 
    
 
Variable   y : 
    y =         3.464*ceil(index(1)/32)+1.732*(index(1)%2) (real)