import numpy as nm
from sfepy.base.base import assert_
from sfepy.terms.extmods import terms
[docs]
def eval_real(vec, conn, geo, mode, shape, bf=None):
"""
Evaluate basic derived quantities of a real variable given its DOF
vector, connectivity and reference mapping.
"""
n_el, n_qp, dim, n_en, n_comp = shape
dtype = nm.float64
if mode == 'val':
function = terms.dq_state_in_qp
out = nm.empty((n_el, n_qp, n_comp, 1), dtype=dtype)
if bf is not None:
function(out, vec, bf, conn)
else:
function(out, vec, geo.bf, conn)
elif mode == 'grad':
function = terms.dq_grad
out = nm.empty((n_el, n_qp, dim, n_comp), dtype=dtype)
function(out, vec, geo.cmap, conn)
elif mode == 'div':
assert_(n_comp == dim)
function = terms.dq_div_vector
out = nm.empty((n_el, n_qp, 1, 1), dtype=dtype)
function(out, vec, geo.cmap, conn)
elif mode == 'cauchy_strain':
assert_(n_comp == dim)
function = terms.dq_cauchy_strain
sym = (dim + 1) * dim // 2
out = nm.empty((n_el, n_qp, sym, 1), dtype=dtype)
function(out, vec, geo.cmap, conn)
else:
raise ValueError('unsupported variable evaluation mode! (%s)'
% mode)
return out
[docs]
def eval_complex(vec, conn, geo, mode, shape, bf=None):
"""
Evaluate basic derived quantities of a complex variable given its DOF
vector, connectivity and reference mapping.
"""
n_el, n_qp, dim, n_en, n_comp = shape
if mode == 'val':
function = terms.dq_state_in_qp
rout = nm.empty((n_el, n_qp, n_comp, 1), dtype=nm.float64)
iout = nm.empty((n_el, n_qp, n_comp, 1), dtype=nm.float64)
if bf is not None:
function(rout, vec.real.copy(), bf, conn)
function(iout, vec.imag.copy(), bf, conn)
else:
function(rout, vec.real.copy(), geo.bf, conn)
function(iout, vec.imag.copy(), geo.bf, conn)
out = rout + 1j * iout
elif mode == 'grad':
function = terms.dq_grad
rout = nm.empty((n_el, n_qp, dim, n_comp), dtype=nm.float64)
iout = nm.empty((n_el, n_qp, dim, n_comp), dtype=nm.float64)
function(rout, vec.real.copy(), geo.cmap, conn)
function(iout, vec.imag.copy(), geo.cmap, conn)
out = rout + 1j * iout
elif mode == 'div':
assert_(n_comp == dim)
function = terms.dq_div_vector
rout = nm.empty((n_el, n_qp, 1, 1), dtype=nm.float64)
iout = nm.empty((n_el, n_qp, 1, 1), dtype=nm.float64)
function(rout, vec.real.copy(), geo.cmap, conn)
function(iout, vec.imag.copy(), geo.cmap, conn)
out = rout + 1j * iout
elif mode == 'cauchy_strain':
assert_(n_comp == dim)
function = terms.dq_cauchy_strain
sym = (dim + 1) * dim // 2
rout = nm.empty((n_el, n_qp, sym, 1), dtype=nm.float64)
iout = nm.empty((n_el, n_qp, sym, 1), dtype=nm.float64)
function(rout, vec.real.copy(), geo.cmap, conn)
function(iout, vec.imag.copy(), geo.cmap, conn)
out = rout + 1j * iout
else:
raise ValueError('unsupported variable evaluation mode! (%s)'
% mode)
return out