Object subclass: #VortexLattice instanceVariableNames: 'size vortices couplingStrength time dt periodicBoundary rng' classVariableNames: '' package: 'RBG-FS-Civilization-Primitives' VortexLattice class >> nx: nx ny: ny nz: nz coupling: coupling seed: seed periodic: periodic ^ self new initNx: nx ny: ny nz: nz coupling: coupling seed: seed periodic: periodic VortexLattice >> initNx: nx ny: ny nz: nz coupling: coupling seed: seed periodic: periodic size := {nx. ny. nz}. couplingStrength := coupling. time := 0.0. dt := 0.01. periodicBoundary := periodic. rng := BobRNG new seed: seed. vortices := Array2D rows: nx columns: ny. 1 to: nx do: [:i | 1 to: ny do: [:j | | vortex | vortex := QuantumVortex new. vortex position: {i. j. 1} winding: (rng integerFrom: -1 to: 1) phase: ((rng normal) + (rng normal) i) normalized energy: (rng uniform * 2 - 1). vortices at: i at: j put: vortex. ]. ]. self createEntanglement. ^ self VortexLattice >> createEntanglement 1 to: (size first) do: [:i | 1 to: (size second) do: [:j | | neighbors | neighbors := self neighborsOf: i y: j z: 1. neighbors do: [:each | (vortices at: i at: j) entangleWith: each. ]. ]. ]. VortexLattice >> neighborsOf: x y: y z: z | neighbors offsets | neighbors := OrderedCollection new. offsets := #(#(1 0 0) #(-1 0 0) #(0 1 0) #(0 -1 0) #(0 0 1) #(0 0 -1)). offsets do: [:offset | | ni nj nk | ni := x + (offset at: 1). nj := y + (offset at: 2). nk := z + (offset at: 3). periodicBoundary ifTrue: [ ni := ((ni - 1) \\ (size first)) + 1. nj := ((nj - 1) \\ (size second)) + 1. nk := ((nk - 1) \\ (size third)) + 1. ]. ((ni between: 1 and: (size first)) and: [ (nj between: 1 and: (size second)) and: [ nk between: 1 and: (size third) ] ]) ifTrue: [ neighbors add: (vortices at: ni at: nj). ]. ]. ^ neighbors VortexLattice >> evolve: aDt dt := aDt. 1 to: (size first) do: [:i | 1 to: (size second) do: [:j | | hamiltonian evolutionFactor | hamiltonian := self hamiltonianAt: i y: j z: 1. evolutionFactor := (0 - (hamiltonian * dt) i) exp. (vortices at: i at: j) phase: ((vortices at: i at: j) phase * evolutionFactor). (vortices at: i at: j) energy: hamiltonian. ]. ]. time := time + dt. VortexLattice >> hamiltonianAt: x y: y z: z | vortex kinetic interaction neighbors | vortex := vortices at: x at: y. kinetic := vortex windingNumber squared asFloat. interaction := 0.0. neighbors := self neighborsOf: x y: y z: z. neighbors do: [:neighbor | interaction := interaction + (vortex phase * neighbor phase conjugate) real. ]. interaction := couplingStrength negated * interaction. ^ kinetic + interaction VortexLattice >> totalEnergy | energy | energy := 0.0. vortices do: [:each | energy := energy + each energy]. ^ energy VortexLattice >> entanglementEntropy | total max | total := 0. vortices do: [:each | total := total + each entangledNeighbors size]. max := vortices size * 6. ^ max > 0 ifTrue: [total asFloat / max] ifFalse: [0.0] VortexLattice >> applyErrorCorrection | corrected | corrected := 0. vortices do: [:each | each applyErrorCorrection. corrected := corrected + 1]. ^ corrected VortexLattice >> vortices ^ vortices VortexLattice >> size ^ size VortexLattice >> time ^ time