Exporting to VTK output

Recently I’ve been considering some eddy current type problems involving thin skin depths, which I’ve been modelling as a conducting object of interest embedded in a larger non-conducting region.

To visualise the skin depth, I’ve been trying to output VTK files at different frequencies and, in order to reduce the size of the files, I’ve been trying to export files only showing elements in a specific subdomain. E.g. mesh.Material(‘cube’). My understanding is that I can specify elements when I export the vtk file using ‘drawelems’, however, when I do so it removes signficantly more elements than I expect.

I’ve attached the relevent part of my code. Is there something I’m doing wrong here? I would have expected it to show all the elements inside the cube. Any help would be appreciated.


print(' creating vtk output', end='\r')
ThetaE1 = GridFunction(fes2)
ThetaE2 = GridFunction(fes2)
ThetaE3 = GridFunction(fes2)
ThetaE1.vec.FV().NumPy()[:] = Output[0]
ThetaE2.vec.FV().NumPy()[:] = Output[1]
ThetaE3.vec.FV().NumPy()[:] = Output[2]

E1Mag = CoefficientFunction(
    sqrt(InnerProduct(ThetaE1.real, ThetaE1.real) + InnerProduct(ThetaE1.imag, ThetaE1.imag)))
E2Mag = CoefficientFunction(
    sqrt(InnerProduct(ThetaE2.real, ThetaE2.real) + InnerProduct(ThetaE2.imag, ThetaE2.imag)))
E3Mag = CoefficientFunction(
    sqrt(InnerProduct(ThetaE3.real, ThetaE3.real) + InnerProduct(ThetaE3.imag, ThetaE3.imag)))
Sols =
Sols.append((ThetaE1 * 1j * Omega * sigma).real)
Sols.append((ThetaE1 * 1j * Omega * sigma).imag)
Sols.append((ThetaE2 * 1j * Omega * sigma).real)
Sols.append((ThetaE2 * 1j * Omega * sigma).imag)
Sols.append((ThetaE3 * 1j * Omega * sigma).real)
Sols.append((ThetaE3 * 1j * Omega * sigma).imag)
Sols.append(E1Mag * Omega * sigma)
Sols.append(E2Mag * Omega * sigma)
Sols.append(E3Mag * Omega * sigma)

vtk = VTKOutput(ma=mesh, coefs=Sols,
                names=["Object", "E1real", "E1imag", "E2real", "E2imag", "E3real", "E3imag", "E1Mag",
                       "E2Mag", "E3Mag"], filename='test_file', subdivision=0, legacy=True)

ele_to_draw = mesh.Materials('cube').Mask()
vtk.Do( drawelems=ele_to_draw)

Hi James,

The drawelems=… expects a BitArray w.r.t. the mesh elements, not the domains. You are rather prescribing the relevant domain indices. Indeed, drawing only certain materials would be a nice feature, but we haven’t implemented this as of now, sorry.


Ok, thanks for the quick reply Christoph.