Et ganske ?yeblikkelig problem oppsto jo n?r vi skulle kj?re simuleringen v?r. Partiklene fortsatte i alle retninger for alltid! Boksen v?r utvidet seg og ble bare st?rre og st?rre! Partikler er dumme, vi m?tte jo selvf?lgelig fortelle dem at de opplever et ellastisk st?t med veggen. Vi pr?vde f?rst ? sjekke alle partiklene for ? se om de traff "veggene" for s? endre fortegn til hastigheten til den komponenten som var vinkelrett p? veggene. Du husker at vi definerte ellastisk st?t som ingen energi tapt til omgivelsene? Det er derfor vi bare kan "snu" hastigheten til partikkelen. Viste seg at det tok enormt lang tid! Etter iherdig leting fant vi en funksjon som finner alle OG endrer hastighetene p? ett blunk! Denne heter "numpy.where" og m?ten den fungere p? er at den sjekker om x-, y- eller z-posisjonene er rundt 0 eller L. Om det stemmer s? endrer den fortegnet til den respektive hastighetskomponenten. Du kan se for deg "numpy.where" som en pirat som alltid f?lger med og skyter deg p? rett kurs som illustrert i figur 2.
Endelig! Boksen v?r er full av bevegelige partikler! Da kan vi begynne med ? lage et hull slik at boksen v?r kan f? en drivkraft i retning oppover. Vi setter at z-aksen er positiv oppover og definerer et hull i bunnen av boksen (alts? i x-, y-planet). Partiklene er skikkelig dumme, de aner ikke hvor de er eller hvorfor. De bare flyr rundt. Det vil vi ogs? at de skal gj?re! Fordi, for ? slippe og kompensere for partikler som g?r ut av boksen med nye s? registrerer vi bare de som befinner seg innenfor "hullet". Vanskelig og se for seg, men la oss vise deg i figur 3. En uvitende partikkel (oransje) havner i omr?det hvor vi har definert et hull! Hva er kriteriene for hullet?, sp?rr du. Vel:
- x-posisjonen m? v?re st?rre enn "low" og mindre enn "high". Det vil si at vi kan skrive betingelsen som: \(low \leq x \leq high\).
- y-posisjonen m? ogs? v?re st?rre enn "low" og mindre enn "high". Vi kan ogs? skrive det om p? formen: \(low \leq y \leq high\).
- z-posisjonen til partikkelen m? v?re mindre eller lik 0. Som kan skrives som \(z \leq 0\)
Den opplever et ellastisk st?t med "veggen" og fortsetter videre. MEN, f?r den f?r oppleve st?tet lagrer vi partikkelen sin kontaktinformasjon og hastighet i z-retning uten samtykke. Deretter forteller vi partikkelen at den opplever et ellastisk st?t. Dette gj?r vi for hver partikkel som oppfyller alle kriteriene for hullet og finner dermed alle som "forlater" boksen p? et gitt tidsintervall. Finne ut en m?te ? sjekke alle kriteriene samtidig p?, var vrient. Det f?rste som slo oss var ? bruke "numpy.where", men den tar bare to argumenter! Vi har jo tre... Etter litt om og men, mye kaffe, litt sm?godt og s?vn. Kom vi over en annen metode fra samme pakke kalt "numpy.logical_and". Den klarer b?de flere argumenter OG returnerer kun noe som heter "booleanske" verdier. I korte trekk er det "True" eller "False". Slik som en datamaskin opererer vet du, 0 og 1! Dette gjorde at argumentene v?re kunne bli evaluert mye raskere og finere enn med "numpy.where". Hvis alle kriteriene er oppfylt, er partikkelen godkjent og telt som en av de som har forlatt boksen. Slik som vist i figur 4.