示例#1
0
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
示例#2
0
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
示例#3
0
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