def mplot_function(function: df.Function, vmin=None, vmax=None, shading="gouraud", colourbar=False, colourbar_label=None) -> Tuple[plt.Figure, Any]: """Plot a function. The kind of plot depends on the function.""" mesh = function.function_space().mesh() if mesh.geometry().dim() != 2: raise AttributeError("Mesh must be 2D") fig, ax = plt.subplots(1) tpc = None # DG0 cellwise function if function.vector().size() == mesh.num_cells(): colour_array = function.vector().array() tpc = ax.tripcolor(mesh2triang(mesh), colour_array, vmin=vmin, vmax=vmax) # Scalar function, interpolated to vertices elif function.value_rank() == 0: colour_array = function.compute_vertex_values(mesh) tpc = ax.tripcolor(mesh2triang(mesh), colour_array, shading=shading, vmin=vmin, vmax=vmax) # Vector function, interpolated to vertices elif function.value_rank() == 1: vertex_values = function.compute_vertex_values(mesh) if len(vertex_values != 2 * mesh.num_vertices()): raise AttributeError("Vector field must be 2D") X = mesh.coordinates()[:, 0] Y = mesh.coordinates()[:, 1] U = vertex_values[:mesh.num_vertices()] V = vertex_values[mesh.num_vertices():] tpc = ax.quiver(X, Y, U, V) if colourbar and tpc is not None: cb = fig.colorbar(tpc) if colourbar_label is not None: cb.set_label(colourbar_label) return fig, ax
def plot_bulk_electrostriction(E, direction, q_b, materials, mesh, power_opt): """ plots bulk electrostriction in 2D for the whole simulation space the solution is first projected into Lagrange basis """ from dolfin import (VectorElement, FunctionSpace, TrialFunction, Function, TestFunction, split, dot, inner, lhs, rhs, solve, plot) import matplotlib.pyplot as plt # bulk electrostriction V = VectorElement("Lagrange", mesh.ufl_cell(), 1, dim = 3) VComplex = FunctionSpace( mesh, V*V) u = TrialFunction(VComplex) (ur, ui) = split(u) v = TestFunction(VComplex) (vr, vi) = split(v) f_bulk = Function(VComplex) if not isinstance(materials, collections.Iterable): (fr_bulk, fi_bulk) = bulk_electrostriction(E, materials.em.e_r, materials.em.p, direction, q_b) F = dot(vr,fr_bulk)*materials.domain + dot(vi,fi_bulk)*materials.domain F -= inner(vr,ur)*materials.domain + inner(vi,ui)*materials.domain else: for idx, material in enumerate(materials): if idx == 0: (fr_bulk, fi_bulk) = bulk_electrostriction(E, material.em.e_r, material.em.p, direction, q_b) F = dot(vr,fr_bulk)*material.domain + dot(vi,fi_bulk)*material.domain F -= inner(vr,ur)*material.domain + inner(vi,ui)*material.domain else: (fr_bulk, fi_bulk) = bulk_electrostriction(E, material.em.e_r, material.em.p, direction, q_b) F += dot(vr,fr_bulk)*material.domain + dot(vi,fi_bulk)*material.domain F -= inner(vr,ur)*material.domain + inner(vi,ui)*material.domain scaling = 1.0/(power_opt*1e3)*1e12 ##pN/(um^2mW) a = lhs(F) L = rhs(F) solve(a==L, f_bulk) w0 = f_bulk.compute_vertex_values(mesh) nv = mesh.num_vertices() w0 = [w0[i * nv: (i + 1) * nv] for i in range(3)] U = w0[0]*scaling V = w0[1]*scaling #W = w0[2] XY = mesh.coordinates() X = XY[:,0] Y = XY[:,1] #Z = np.zeros(nv) # make a pretty plot fig = plt.figure() ax = fig.gca() Q1 = ax.quiver(X,Y, U,V, scale=4000, scale_units='inches') plt.quiverkey(Q1, 0.4, 0.9, 1000.0, r'$ 1000 \frac{pN}{\mu m^3 mW} Re(f_{x,y})$', labelpos='E', coordinates='figure', fontproperties={'size': 24}) plt.xlabel('x [$\mu$m]', fontsize=24, rotation = 0) plt.ylabel('y [$\mu$m]', fontsize=24) plt.tick_params(labelsize=24) plt.show() return fig
from src.model import Model from pylab import zeros, linspace, sqrt from dolfin import project, as_vector, Function, File nx = 20 ny = 20 nz = 6 model = Model() model.generate_uniform_mesh(nx,ny,nz,0,1,0,1,deform=False,generate_pbcs=True) Q = model.Q U_opt = project(as_vector([Function(Q),Function(Q),Function(Q)])) b_opt = Function(Q) n = len(b_opt.compute_vertex_values()) rcParams['text.usetex']=True rcParams['font.size'] = 12 rcParams['font.family'] = 'serif' Us = zeros((50,n)) betas = zeros((50,n)) fig,axs = subplots(2,1,sharex=True) fig.set_size_inches(8,4) bed_indices = model.mesh.coordinates()[:,2]==0 surface_indices = model.mesh.coordinates()[:,2]==1 prof_indices = model.mesh.coordinates()[:,1]==0.25