import oommfc as oc
import discretisedfield as df
%matplotlib inline

"""
Explanation: Tutorial 0 - First JOOMMF notebook
The goal of this tutorial is for all participants to familiarise themselves with running JOOMMF simulations in Jupyter notebook. The only thing you need to know for this tutorial is how to execute individual cells: this is done by pressing Shift + Return.
Simple JOOMMF simulation
End of explanation
"""


system = oc.System(name="first_notebook")

"""
Explanation: We create a very simple system object and provide:

Hamiltonian,
dynamics, and
magnetisation configuration.
End of explanation
"""


L = 100e-9  # cubic sample edge length (m)
d = 5e-9  # discretisation cell size (m)
mesh = oc.Mesh(p1=(0, 0, 0), p2=(L, L, L), cell=(d, d, d))

"""
Explanation: We define the mesh by providing two points between which the domain spans as well as the size of the discretisation cell:
End of explanation
"""


A = 1e-12  # exchange energy constant (J/m)
H = (5e6, 0, 0)  # external magnetic field in x-direction (A/m)
system.hamiltonian = oc.Exchange(A=A) + oc.Demag() + oc.Zeeman(H=H)

"""
Explanation: Our Hamiltonian should only contain exchange, demagnetisation, and Zeeman energy terms. We will apply the external magnetic field in the $x$ direction for the purpose of this demonstration:
End of explanation
"""


alpha = 0.2  # Gilbert damping
system.dynamics = oc.Precession(gamma=oc.gamma0) + oc.Damping(alpha=alpha)

"""
Explanation: The dynamics of the system is governed by the LLG equation containing precession and damping terms:
End of explanation
"""


Ms = 8e6  # saturation magnetisation (A/m)
system.m = df.Field(mesh, value=(0, 1, 0), norm=Ms)

"""
Explanation: We initialise the system in positive $y$ direction, i.e. (0, 1, 0), which is different from the equlibrium state we expect for the external Zeeman field applied in $x$ direction:
End of explanation
"""


mesh

system.hamiltonian

system.dynamics

"""
Explanation: We can check the characteristics of the system we defined by asking objects to represent themselves:
End of explanation
"""


fig = system.m.plot_slice("z", 50e-9, xsize=6)

"""
Explanation: We can also visualise the current magnetisation field:
End of explanation
"""


md = oc.MinDriver()
md.drive(system)

"""
Explanation: After the system object is created, we can minimise its energy (relax it) using the Minimisation Driver (MinDriver).
End of explanation
"""


fig = system.m.plot_slice("z", 50e-9, xsize=6)

system.m.average

"""
Explanation: The system is now relaxed, and we can plot its slice and compute its average magnetisation.
End of explanation
"""


