Post-processing with Matplotlib

In this example we show how to use matplotlib as a pre and post-treatment tool to easily plot meshes and solutions. River example is used as a basis for this tutorial. For advanced visualizations it is strongly advised to use a post-treatment software like paraview or mayavi.

import matplotlib.pyplot as plt
import matplotlib.tri as mtri
import numpy as np
import freshkiss3d as fk

Quick case set up:

simutime = fk.SimuTime(final_time=1500., time_iteration_max=100000)

triangular_mesh = fk.TriangularMesh.from_msh_file('../simulations/inputs/river.msh')

NL = 8
layer = fk.Layer(NL, triangular_mesh, topography=0.)

primitives = fk.Primitive(triangular_mesh, layer, height=1.0)

flowrate = fk.TimeDependentFlowRate(times=[0.0, 1000.0, 10000],
                                    flowrates=[0.0, 10.0, 10.0])

fluvial_flowrates = [fk.FluvialFlowRate(ref=2,
                                  time_dependent_flowrate=flowrate,
                                  x_flux_direction=1.0,
                                  y_flux_direction=0.0)]

slides = [fk.Slide(ref=1)]
fluvial_heights = [fk.FluvialHeight(ref=3, height=1.)]

Plot boundary conditions on mesh:

To check boundary labels:

colors = {0:'blue', 1:'red', 2:'green', 3:'purple'}

fig = plt.figure()
ax = fig.add_subplot(111)
ax.triplot(triangular_mesh.triangulation.x,
           triangular_mesh.triangulation.y,
           triangular_mesh.triangulation.trivtx)

# Plot edges.
for B in range(triangular_mesh.boundary_edges.size):
    i0 = triangular_mesh.boundary_edges.vertices[B, 0]
    i1 = triangular_mesh.boundary_edges.vertices[B, 1]
    x0,y0 = triangular_mesh.triangulation.x[i0], triangular_mesh.triangulation.y[i0]
    x1,y1 = triangular_mesh.triangulation.x[i1], triangular_mesh.triangulation.y[i1]
    ax.plot([x0, x1], [y0, y1], color=colors[triangular_mesh.boundary_edges.label[B]], linewidth=2.)
    offset = 0.04
    x_edge = 0.5*( x0 + x1) + offset
    y_edge = 0.5*( y0 + y1) + offset
    ax.text(x_edge, y_edge, triangular_mesh.boundary_edges.label[B],
            color= colors[triangular_mesh.boundary_edges.label[B]],fontsize=10)

plt.grid()
plt.axis('scaled')
plt.show()
example plots

Problem solving:

river = fk.Problem(simutime, triangular_mesh, layer, primitives,
                   slides=slides,
                   fluvial_flowrates=fluvial_flowrates,
                   fluvial_heights=fluvial_heights)

river.solve()
===================================================================
|                          INITIALIZATION                         |
===================================================================
Problem size: Nodes=655, Layers=8, Triangles=1154,
Iter =        0 ; Dt = 0.0000s ; Time =     0.00s ; ETA =     0.00s
===================================================================
|                            TIME LOOP                            |
===================================================================
Iter =       34 ; Dt = 0.9194s ; Time =    31.26s ; ETA =     4.38s
Iter =       67 ; Dt = 0.9194s ; Time =    61.60s ; ETA =     4.30s
Iter =      100 ; Dt = 0.9193s ; Time =    91.94s ; ETA =     4.30s
Iter =      134 ; Dt = 0.9193s ; Time =   123.19s ; ETA =     4.18s
Iter =      167 ; Dt = 0.9192s ; Time =   153.53s ; ETA =     4.02s
Iter =      200 ; Dt = 0.9192s ; Time =   183.86s ; ETA =     3.96s
Iter =      234 ; Dt = 0.9191s ; Time =   215.11s ; ETA =     3.82s
Iter =      267 ; Dt = 0.9191s ; Time =   245.45s ; ETA =     3.81s
Iter =      300 ; Dt = 0.9191s ; Time =   275.78s ; ETA =     3.74s
Iter =      334 ; Dt = 0.9190s ; Time =   307.02s ; ETA =     3.66s
Iter =      367 ; Dt = 0.9190s ; Time =   337.35s ; ETA =     3.49s
Iter =      400 ; Dt = 0.9189s ; Time =   367.67s ; ETA =     3.48s
Iter =      433 ; Dt = 0.9189s ; Time =   398.00s ; ETA =     3.35s
Iter =      467 ; Dt = 0.9188s ; Time =   429.24s ; ETA =     3.24s
Iter =      500 ; Dt = 0.9188s ; Time =   459.56s ; ETA =     3.11s
Iter =      533 ; Dt = 0.9188s ; Time =   489.88s ; ETA =     3.10s
Iter =      567 ; Dt = 0.9187s ; Time =   521.12s ; ETA =     2.97s
Iter =      600 ; Dt = 0.9187s ; Time =   551.43s ; ETA =     2.88s
Iter =      633 ; Dt = 0.9186s ; Time =   581.75s ; ETA =     2.81s
Iter =      667 ; Dt = 0.9186s ; Time =   612.98s ; ETA =     2.70s
Iter =      700 ; Dt = 0.9185s ; Time =   643.29s ; ETA =     2.67s
Iter =      733 ; Dt = 0.9185s ; Time =   673.60s ; ETA =     2.58s
Iter =      767 ; Dt = 0.9184s ; Time =   704.83s ; ETA =     2.43s
Iter =      800 ; Dt = 0.9184s ; Time =   735.14s ; ETA =     2.39s
Iter =      833 ; Dt = 0.9184s ; Time =   765.45s ; ETA =     2.30s
Iter =      867 ; Dt = 0.9183s ; Time =   796.67s ; ETA =     2.11s
Iter =      900 ; Dt = 0.9183s ; Time =   826.97s ; ETA =     2.09s
Iter =      933 ; Dt = 0.9182s ; Time =   857.27s ; ETA =     1.95s
Iter =      967 ; Dt = 0.9182s ; Time =   888.49s ; ETA =     1.83s
Iter =     1000 ; Dt = 0.9181s ; Time =   918.79s ; ETA =     1.78s
Iter =     1033 ; Dt = 0.9181s ; Time =   949.09s ; ETA =     1.67s
Iter =     1067 ; Dt = 0.9180s ; Time =   980.30s ; ETA =     1.58s
Iter =     1100 ; Dt = 0.9180s ; Time =  1010.60s ; ETA =     1.49s
Iter =     1133 ; Dt = 0.9180s ; Time =  1040.89s ; ETA =     1.41s
Iter =     1167 ; Dt = 0.9180s ; Time =  1072.11s ; ETA =     1.33s
Iter =     1200 ; Dt = 0.9180s ; Time =  1102.40s ; ETA =     1.21s
Iter =     1233 ; Dt = 0.9180s ; Time =  1132.69s ; ETA =     1.12s
Iter =     1267 ; Dt = 0.9180s ; Time =  1163.91s ; ETA =     1.04s
Iter =     1300 ; Dt = 0.9180s ; Time =  1194.20s ; ETA =     0.97s
Iter =     1333 ; Dt = 0.9180s ; Time =  1224.50s ; ETA =     0.84s
Iter =     1367 ; Dt = 0.9180s ; Time =  1255.71s ; ETA =     0.76s
Iter =     1400 ; Dt = 0.9180s ; Time =  1286.01s ; ETA =     0.66s
Iter =     1434 ; Dt = 0.9180s ; Time =  1317.22s ; ETA =     0.57s
Iter =     1467 ; Dt = 0.9181s ; Time =  1347.51s ; ETA =     0.47s
Iter =     1500 ; Dt = 0.9181s ; Time =  1377.81s ; ETA =     0.38s
Iter =     1534 ; Dt = 0.9181s ; Time =  1409.02s ; ETA =     0.28s
Iter =     1567 ; Dt = 0.9181s ; Time =  1439.32s ; ETA =     0.19s
Iter =     1600 ; Dt = 0.9177s ; Time =  1469.61s ; ETA =     0.09s
Iter =     1634 ; Dt = 0.1105s ; Time =  1500.00s ; ETA =     0.00s
===================================================================
|                               END                               |
===================================================================
Problem.solve() completed in 4.604763746261597s (wall time)

Basic plots of velocity components:

First velocity components are plotted on the middle layer (see LAYER_IDX).

x = np.asarray(triangular_mesh.triangulation.x)
y = np.asarray(triangular_mesh.triangulation.y)
trivtx = np.asarray(triangular_mesh.triangulation.trivtx)
triang = mtri.Triangulation(x, y, trivtx)

LAYER_IDX = int(NL/2)

plt.rcParams["figure.figsize"] = [16, 6]
fig = plt.figure()

# Subplot 1: x velocity
ax1 = fig.add_subplot(121)
ax1.triplot(x, y, trivtx, color='k', lw=0.5)
im1 = ax1.tricontourf(x, y, trivtx, river.primitives.U[:, LAYER_IDX], 30)
fig.colorbar(im1, ax=ax1)
ax1.set_title("Velocity x component on layer {}".format(LAYER_IDX))

# Subplot 2: y velocity
ax2 = fig.add_subplot(122)
ax2.triplot(x, y, trivtx, color='k', lw=0.5)
im2 = ax2.tricontourf(x, y, trivtx, river.primitives.V[:, LAYER_IDX], 30)
fig.colorbar(im2, ax=ax2)
ax2.set_title("Velocity y component on layer {}".format(LAYER_IDX))

plt.show()
Velocity x component on layer 4, Velocity y component on layer 4

Quivers plot:

plt.rcParams["figure.figsize"] = [6, 6]
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.quiver(triang.x, triang.y, river.primitives.U[:, LAYER_IDX],
                               river.primitives.V[:, LAYER_IDX])
ax1.set_title("Quivers on layer {}".format(LAYER_IDX))

plt.show()
Quivers on layer 4

Streamlines plot:

plt.rcParams["figure.figsize"] = [8, 6]
fig = plt.figure()
ax1 = fig.add_subplot(111)
xi, yi = np.meshgrid(np.linspace(0, 2000, 500),
                     np.linspace(0, 2000, 500))
U_interp = mtri.LinearTriInterpolator(triang,river.primitives.U[:, LAYER_IDX])
V_interp = mtri.LinearTriInterpolator(triang,river.primitives.V[:, LAYER_IDX])
U_i = U_interp(xi, yi)
V_i = V_interp(xi, yi)
speed=np.sqrt(U_i**2+V_i**2)
ax1.set_xlim(0, 2000)
ax1.set_ylim(0, 2000)
strm = ax1.streamplot(xi, yi, U_i, V_i, density=(2, 2), color=speed, linewidth=2*speed/speed.max())
fig.colorbar(strm.lines)
ax1.set_title("Velocity & Streamlines on layer {}".format(LAYER_IDX))

plt.show()
Velocity & Streamlines on layer 4

Total running time of the script: ( 0 minutes 6.740 seconds)

Gallery generated by Sphinx-Gallery