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