1__author__ = "Dilawar Singh" 2__email__ = "dilawar@subcom.tech" 3 4""" 5FIXME: Two Simulations could not be run in the serial mode. 6""" 7 8import smoldyn 9import time 10import threading 11 12 13def sim1(): 14 s = smoldyn.Simulation(low=[0, 0], high=[100, 100]) 15 red = s.addSpecies("red", color="red", difc=dict(all=3, front=0), display_size=5) 16 yellow = s.addSpecies( 17 "yellow", color="black", difc=dict(soln=3, back=1), display_size=5 18 ) 19 blue = s.addSpecies("blue", color="blue", difc=3, display_size=5) 20 21 red.addToSolution(100) 22 yellow.addToSolution(50, pos=(50, 50)) 23 blue.addToSolution(50, pos=(20, 20)) 24 25 # Construct a closed path in 2D. 26 p = s.addPath2D((0, 0), (100, 0), (100, 100), (0, 100), closed=True) 27 walls = s.addSurface("walls", panels=p.panels) 28 walls.setAction("both", [red, yellow, blue], "reflect") 29 walls.setStyle("both", color="black") 30 31 sph = s.addSphere(center=(50, 50), radius=20, slices=20) 32 surf = s.addSurface("stick", panels=[sph]) 33 surf.setRate(red, "fsoln", "front", rate=10, revrate=1) 34 surf.setRate(yellow, "bsoln", "back", rate=10, revrate=1) 35 surf.setRate(blue, "fsoln", "bsoln", rate=10, revrate=1) 36 surf.setStyle("front", color=(1, 0.7, 0)) 37 surf.setStyle("back", color=(0.6, 0, 0.6)) 38 surf.addMolecules((red, "front"), 100) 39 40 # FIXME: Concurrent simulation doesn't work when graphics is enabled. 41 # s.setGraphics("opengl") 42 s.addCommand("killmolinsphere red all", "b") 43 s.addOutputData("data1") 44 s.addCommand("molcount data1", 'E') 45 return s 46 47 48def sim2(): 49 sim = smoldyn.Simulation(low=[0, 0, 0], high=[100, 100, 100]) 50 51 # Set it after Simulation object is created. 52 sim.seed = 0 53 54 spRed = sim.addSpecies("red", color="red", difc=3, display_size=3) 55 spRed.addToSolution(20, highpos=[10, 50, 50]) 56 57 spGreen = sim.addSpecies("green", color="green", difc=1, display_size=3) 58 sim.addMolecules(spGreen, 20, highpos=[10, 50, 50]) 59 60 # Add Surfaces 61 r1 = sim.addRectangle(corner=[100, 0, 0], dimensions=[100, 100], axis="-x") 62 r2 = sim.addRectangle(corner=[0, 0, 0], dimensions=[100, 100], axis="+y") 63 r3 = sim.addRectangle(corner=[0, 100, 0], dimensions=[100, 100], axis="-y") 64 r4 = sim.addRectangle(corner=[0, 0, 0], dimensions=[100, 100], axis="+z") 65 r5 = sim.addRectangle(corner=[0, 0, 100], dimensions=[100, 100], axis="-z") 66 67 s1 = sim.addSurface("walls", panels=[r1, r2, r3, r4, r5]) 68 # s1.both.setStyle(drawmode='edge') 69 s1.setStyle("both", drawmode="edge") 70 s1.setAction("both", [spRed, spGreen], "reflect") 71 72 # portsurf 73 rr = sim.addRectangle(corner=[0, 0, 0], dimensions=[100, 100], axis="+x") 74 portSurf = sim.addSurface("portsurf", panels=[rr]) 75 portSurf.setStyle("front", drawmode="face", color="gray") 76 portSurf.setStyle("back", drawmode="face", color=[0.2, 0, 0, 1]) 77 portSurf.setAction("front", [spRed, spGreen], "port") 78 portSurf.setAction("back", [spRed, spGreen], "reflect") 79 80 # Ports 81 sim.addPort(name="testport", surface=portSurf, panel="front") 82 83 # sim.setGraphics("opengl", 20) 84 sim.addOutputData("data2") 85 sim.addCommand("molcount data2", 'E') 86 return sim 87 88def main(): 89 s1, s2 = sim1(), sim2() 90 91 t1 = threading.Thread(target=lambda t: s1.run(t, dt=0.1, overwrite=True), args=(100,)) 92 t1.start() 93 94 t2 = threading.Thread(target=lambda t: s2.run(t, dt=0.1, overwrite=True), args=(100,)) 95 t2.start() 96 97 t1.join() 98 t2.join() 99 100 data1 = s1.getOutputData('data1') 101 data2 = s2.getOutputData('data2') 102 assert len(data1) == len(data2) == 1001, (len(data1), len(data2)) 103 for l1 in data1: 104 print(l1) 105 for l2 in data2: 106 print(l2) 107 108 109if __name__ == "__main__": 110 main() 111