Forelesningsnotat til Ovito for bruk i FYS4460
Dette er skrevet for Ovito versjon 3.0.0. I skrivende stund er den fortsatt under utvikling, men den er enkelt tilgjengelig under Development version p? ovito.org (klikk p? Download)
Ovito GUI
- Laste inn trajectory-fil
- Husk
File contains time series
- Husk
- Color coding
- Histogram
- Compute property for ? lage hastighetsmagnitude
- Se p? denne fordelingen med endret histogram
- Mange modifiers kan lagre data
- Eksportere filer til andre formater
Modifier pipeline – et viktig konsept i Ovito!
Modifiers i Ovito inng?r i en s?kalt modifier pipeline. Der vil hver modifier utf?re operasjoner etter tur. En modifier som kommer etter en annen kan bruke informasjonen som den forrige modifieren regnet ut. For eksempel kan vi lage en ComputePropertyModifier
(slik som vi nettop gjorde), og deretter la en ColorCodingModifier
bruke verdiene som ComputePropertyModifier
genererte, slik at vi kan fargelegge partiklene etter magnituden p? hastigheten. Merk at i GUI, s? st?r det ikke modifier p? navnet til modifiers. Derfor vil ComputePropertyModifier
dukke opp som Compute Property
. Vi velger allikevel ? bruke navnene med modifier p?, fordi det er slik de er navngitt i Python-API'et til Ovito.
Lammps-script som genererer data vi kan se p? i Ovito
units lj
dimension 3
boundary p p p
atom_style atomic
lattice fcc 0.01
region simbox block 0 10 0 10 0 10
create_box 1 simbox
create_atoms 1 box
mass 1 1.0
velocity all create 2.5 87287
pair_style lj/cut 3.0
pair_coeff 1 1 1.0 1.0 3.0
fix 1 all nve
dump 1 all custom 100 dump.lammpstrj id type x y z vx vy vz
thermo 100
run 10000
Ovitos p? kommandolinjen
F?rst trenger vi ? laste inn en trajectory fil. Import og kode er:
# analyse.py
from ovito.io import import_file
filename = "dump.lammpstrj"
pipeline = import_file(filename, multiple_frames=True)
Deretter ?nsker vi ? gj?re ting. Fra importen har vi f?tt et pipeline-objekt. Dette er et nyttig objekt. For ? kunne se i GUI at vi har gjort ting riktig kan vi legge til pipeline-objektet til scenen som skal rendres: pipeline.add_to_scene()
. Da kan vi kj?re scriptet med ovitos -g analyse.py
, og Ovito vil ?pne seg og vise den analysen vi har satt opp med scriptet (Forel?pig er den ganske tom).
Gj?re noe interessant med Ovito p? kommandolinje
La oss f?rst sette opp det samme som det vi gjorde i GUI bare med script i stedet. Dette kan v?re en nyttig m?te ? jobbe p? bare for ? slippe ? trykke rundt hele tiden. Vi ?nsker ? legge p? en ComputePropertyModifier
og en HistogramModifier
for ? beregne om hastighetsfordelingen i systemet n?rmer seg en Maxwell–Boltzmann-distribusjon. N?r man skal bruke nye modifiers er det nyttig ? se i dokumentasjonenm under ovito.modifiers
.
myComputePropertyModifier = \
ComputePropertyModifier(
output_property="Velocity Magnitude",
expressions=["sqrt( Velocity.X^2+Velocity.Y^2+Velocity.Z^2)"]
)
pipeline.modifiers.append(myComputePropertyModifier)
myHistogramModifier = HistogramModifier(
property="Velocity Magnitude",
bin_count=100,
fix_xrange=True,
xrange_end=10)
pipeline.modifiers.append(myHistogramModifier)
La oss f?rst kj?re dette med ovitos -g analyse.py
for ? sjekke at modifier-pipelinen er satt opp riktig. Om det er riktig skal vi se modifierene stablet opp? hverandre p? h?yre meny i GUI'et. Om vi trykker p? Histogram (Modifier) i h?yre-menyen skal vi dessuten kunne se histogrammet over hastighetsmagnitudene.
Om dette fungerer kan vi g? videre til ? se p? hvordan vi beregner hvordan en st?rrelse varierer gjennom en simulering. La oss for eksempel se p? oppgave a) i prosjekt 1:
Utvikling av hastighetsfordelingen i tid
Vi kan styre hvilket tidssteg i input-filen ovito ser p? med ovito.dataset.anim
:
from ovito import dataset
frame = 10
dataset.anim.current_frame = frame
pipeline.compute()
Etter denne operasjonen vil pipeline
inneholde verdier i modifier-pipeline beregnet for frame 10 i lammps-dumpfilen.
Om vi ?nsker ? se p? hvordan hastighetsfordelingen endrer seg gjennom simuleringen kan vi l?kke over tidsstegene, kj?re compute()
, og hente ut hisogrammet i de aktuelle tidsstegene.
for frame in range(dataset.anim.first_frame, dataset.anim.last_frame, 10):
pipeline.compute(frame)
histogram = myHistogramModifier.histogram[:,1]
plt.plot(histogram, label=str(frame))
plt.show()
N? har vi histogrammet tilgjengelig over tid. Inne i denne l?kken kan vi for eksempel beregne Σihi(t)hi(tn)/Σihi(tn)hi(tn) som et m?l p? hvor godt termalistert systemet er etter en tid t. tn er sluttiden for simuleringen.
Hente partikkelposisjoner
La oss sjekke at vi klarer ? hente ut partikkelposisjonene. Det kan jo hende vi ?nsker ? bruke dem til noe som Ovito ikke har innebygget.
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
data = pipeline.compute(10)
positions = data.particle_properties['Position']
ax.scatter(positions[:,0], positions[:,1], positions[:,2])
plt.show()
N?r man kj?rer pipeline.compute(<tiddsteg>)
f?r man tilgang p? et objekt som inneholder dataene til tidssteget man beregnet for. Dette inneholder b?de beregninger som er gjort i modifiers, og selve r?dataene.