![]() |
The Open FUSION Toolkit 1.0.0-beta7
An open-source framework for fusion and plasma science and engineering
|
In this example we demonstrate how to run a time-domain simulation for a simple ThinCurr model of a cylinder.
To load the ThinCurr python module we need to tell python where to the module is located. This can be done either through the PYTHONPATH environment variable or within a script using sys.path.append() as below, where we look for the environement variable OFT_ROOTPATH to provide the path to where the OpenFUSIONToolkit is installed (/Applications/OFT for binaries on macOS).
We now create a OFT_env instance for execution using two threads and a ThinCurr instance that utilizes that execution environment.
Once created, we setup the model from an existing HDF5 and XML mesh definition using setup_model(). For this model we have defined current jumpers using additional nodesets, which must be identified using the jumper_start argument (see ThinCurr Python Example: Time-domain simulation of a cylinder with jumpers for more information).
Finally, we initialize I/O for this model using setup_io() to enable output of plotting files for 3D visualization in VisIt, Paraview, or using pyvista below.
#----------------------------------------------
Open FUSION Toolkit Initialized
Development branch: v1_beta7
Revision id: 7aff680
Parallelization Info:
# of MPI tasks = 1
# of NUMA nodes = 1
# of OpenMP threads = 2
Fortran input file = /var/folders/52/n5qxh27n4w19qxzqygz2btbw0000gn/T/oft_59835/oftpyin
XML input file = none
Integer Precisions = 4 8
Float Precisions = 4 8 16
Complex Precisions = 4 8
LA backend = native
#----------------------------------------------
Creating thin-wall model
No V(t) driver coils found
Loading I(t) driver coils
Masked 0 coils from sensors
Building holes
Loading region resistivity:
1 1.2570E-05
Setup complete:
# of points = 782
# of edges = 2222
# of cells = 1440
# of holes = 1
# of closures = 0
# of Vcoils = 0
# of Icoils = 1
To visualize the results we define two circular flux loops at R=0.9 m, just inside the cylinder. While every sensor in ThinCurr is a flux loop, helper classes for defining specific types of common sensors (eg. circular loop or Mirnovs) are available in OpenFUSIONToolkit.ThinCurr.sensor, which also contains the save_sensors() function for saving this information to a ThinCurr-compatible file format.
After defining the sensors we use compute_Msensor() to setup the sensors and compute mutual matrices between the sensors and the model (Msensor) and the sensors and Icoils (Msc).
Loading sensor information
Loading flux loops from file: floops.loc
# of floops =
␂
Setting up jumpers
Building element->sensor inductance matrix
Time = 0s
Building coil->sensor inductance matrix
Time = 0s
With the model setup, we can now compute the self-inductance and resistivity matrices. A numpy version of the self-inductance matrix will be stored at tw_plate.Lmat. By default the resistivity matrix is not moved to python as it is sparse and converting to dense representation would require an increase in memory. These matrices correspond to the \(\textrm{L}\) and \(\textrm{R}\) matrices for the physical system
\(\textrm{L} \frac{\partial I}{\partial t} + \textrm{R} I = V\)
Building coil<->element inductance matrices Time = 0s Building element<->element self inductance matrix Time = 1s Building resistivity matrix
With the model fully defined we can now use run_td() to perform a time-domain simulation. In this case we simulate 80 ms using a timestep of 0.2 ms (400 steps). We also specify using a direct solver for the time-advance (direct=True) and set the current in the single I-coil defined in the XML input file as a function of time (coil_currs), where the first column specifies time points in ascending order and the remaining columns specify coil currents at each time point.
Starting time-domain simulation
timestep time sol_norm nits solver time
Starting factorization
Inverting real matrix
Time = 1.1778000000000000E-002
10 2.000000E-03 1.4851E-03 1 0.00
20 4.000000E-03 2.7763E-03 1 0.00
30 6.000000E-03 3.8671E-03 1 0.00
40 8.000000E-03 4.7872E-03 1 0.00
50 1.000000E-02 5.5626E-03 1 0.00
60 1.200000E-02 6.2153E-03 1 0.00
70 1.400000E-02 6.7644E-03 1 0.00
80 1.600000E-02 7.2261E-03 1 0.00
90 1.800000E-02 7.6142E-03 1 0.00
100 2.000000E-02 7.8995E-03 1 0.00
110 2.200000E-02 6.6986E-03 1 0.00
120 2.400000E-02 5.6442E-03 1 0.00
130 2.600000E-02 4.7515E-03 1 0.00
140 2.800000E-02 3.9972E-03 1 0.00
150 3.000000E-02 3.3610E-03 1 0.00
160 3.200000E-02 2.8249E-03 1 0.00
170 3.400000E-02 2.3737E-03 1 0.00
180 3.600000E-02 1.9942E-03 1 0.00
190 3.800000E-02 1.6750E-03 1 0.00
200 4.000000E-02 1.4068E-03 1 0.00
210 4.200000E-02 1.1814E-03 1 0.00
220 4.400000E-02 9.9209E-04 1 0.00
230 4.600000E-02 8.3304E-04 1 0.00
240 4.800000E-02 6.9947E-04 1 0.00
250 5.000000E-02 5.8730E-04 1 0.00
260 5.200000E-02 4.9310E-04 1 0.00
270 5.400000E-02 4.1401E-04 1 0.00
280 5.600000E-02 3.4759E-04 1 0.00
290 5.800000E-02 2.9183E-04 1 0.00
300 6.000000E-02 2.4501E-04 1 0.00
310 6.200000E-02 2.0570E-04 1 0.00
320 6.400000E-02 1.7270E-04 1 0.00
330 6.600000E-02 1.4499E-04 1 0.00
340 6.800000E-02 1.2173E-04 1 0.00
350 7.000000E-02 1.0220E-04 1 0.00
360 7.200000E-02 8.5798E-05 1 0.00
370 7.400000E-02 7.2031E-05 1 0.00
380 7.600000E-02 6.0473E-05 1 0.00
390 7.800000E-02 5.0770E-05 1 0.00
400 8.000000E-02 4.2624E-05 1 0.00
We can now plot the signals from the two flux loops defined above as a function of time. During the time-domain run this information is stored in OFT's binary history file format, which can be read using the histfile class. This class stores the resulting signals in a Python dict-like representation.
OFT History file: floops.hist
Number of fields = 3
Number of entries = 401
Fields:
time: Simulation time [s] (d1)
Floop_1: No description (d1)
Floop_2: No description (d1)
After completing the simulation we can generate plot files using plot_td(). Plot files are saved at a fixed timestep interval, specified by the nplot argument to run_td() with a default value of 10.
Once all fields have been saved for plotting build_XDMF() to generate the XDMF descriptor files for plotting with VisIt of Paraview. This method also returns a XDMF_plot_file object, which can be used to read and interact with plot data in Python (see below).
Post-processing time-domain simulation
Creating output files: oft_xdmf.XXXX.h5
Removing old Xdmf files
Removed 43 files
Found Group: thincurr
Found Mesh: icoils
# of blocks: 1
Found Mesh: smesh
# of blocks: 1
For demonstration purposes we now plot the the solution at the end of the driven phase using pyvista. We now use the plot_data object to generate a 3D plot of the current at t=2.E-2. For more information on the basic steps in this block see ThinCurr Python Example: Compute eigenstates in a plate