I think that you have a few errors in your code:
STRAIN**2
is probably an elementwise square. What you actually want is the matrix product that matches the signature (n,k),(k,m)→(n,m), which matmul should providenp.linalg.eigvals
does not order the eigenvalues, but you want lambda_2 to correspond to the second largest eigenvalue.
I wrote a filter that should give you the proper result, but I haven’t validated it:
import numpy as np
from vtk.numpy_interface import algorithms as algs
# Compute the lambda_2 Vortex criterion, see pp.76-77 in
# J. Jeong and F. Hussain, “On the identification of a vortex,”
# Journal of Fluid Mechanics, vol. 285, pp. 69–94, 1995, doi: 10.1017/S0022112095000462.
vvector = inputs[0].PointData['velocity']
vstrain = strain(vvector)
vskew = gradient(vvector) - vstrain
aaa = matmul(vstrain, vstrain) + matmul(vskew, vskew)
# since aaa is symmetric, it only has real eigenvalues
lambdas = eigenvalue(aaa)
lambdas = real(lambdas)
lambda2 = sort(lambdas)[:,1]
output.PointData.append(lambda2, 'lambda2')