def test_partition_of_unity(self): from sfepy.linalg import combine from sfepy.discrete import Integral, PolySpace ok = True orders = {'2_3' : 5, '2_4' : 5, '3_4' : 5, '3_8' : 5} bases = ( [ii for ii in combine([['2_4', '3_8'], ['lagrange', 'serendipity', 'bernstein']] )] + [ii for ii in combine([['2_3', '3_4'], ['lagrange', 'bernstein']])] ) for geom, poly_space_base in bases: max_order = orders[geom] for order in range(max_order + 1): if (poly_space_base == 'serendipity') and not (0 < order < 4): continue self.report('geometry: %s, base: %s, order: %d' % (geom, poly_space_base, order)) integral = Integral('i', order=2 * order) coors, _ = integral.get_qp(geom) ps = PolySpace.any_from_args('ps', self.gels[geom], order, base=poly_space_base) vals = ps.eval_base(coors) _ok = nm.allclose(vals.sum(axis=-1), 1, atol=1e-14, rtol=0.0) self.report('partition of unity:', _ok) ok = ok and _ok return ok
def main(): import os import numpy as nm import matplotlib.pyplot as plt from sfepy.fem import MeshIO import sfepy.linalg as la from sfepy.mechanics.contact_bodies import ContactSphere, plot_points conf_dir = os.path.dirname(__file__) io = MeshIO.any_from_filename(filename_mesh, prefix_dir=conf_dir) bb = io.read_bounding_box() outline = [vv for vv in la.combine(zip(*bb))] ax = plot_points(None, nm.array(outline), 'r*') csc = materials['cs'][0] cs = ContactSphere(csc['.c'], csc['.r']) pps = (bb[1] - bb[0]) * nm.random.rand(5000, 3) + bb[0] mask = cs.mask_points(pps, 0.0) ax = plot_points(ax, cs.centre[None, :], 'b*', ms=30) ax = plot_points(ax, pps[mask], 'kv') ax = plot_points(ax, pps[~mask], 'r.') plt.show()
def main(): import os import numpy as nm import matplotlib.pyplot as plt from sfepy.fem import MeshIO import sfepy.linalg as la from sfepy.mechanics.contact_bodies import (ContactPlane, plot_polygon, plot_points) conf_dir = os.path.dirname(__file__) io = MeshIO.any_from_filename(filename_mesh, prefix_dir=conf_dir) bb = io.read_bounding_box() outline = [vv for vv in la.combine(zip(*bb))] ax = plot_points(None, nm.array(outline), 'r*') for name in ['cp%d' % ii for ii in range(4)]: cpc = materials[name][0] cp = ContactPlane(cpc['.a'], cpc['.n'], cpc['.bs']) v1, v2 = la.get_perpendiculars(cp.normal) ax = plot_polygon(ax, cp.bounds) ax = plot_polygon( ax, nm.r_[cp.anchor[None, :], cp.anchor[None, :] + cp.normal[None, :]]) ax = plot_polygon(ax, nm.r_[cp.anchor[None, :], cp.anchor[None, :] + v1]) ax = plot_polygon(ax, nm.r_[cp.anchor[None, :], cp.anchor[None, :] + v2]) plt.show()
def main(): import os import numpy as nm import matplotlib.pyplot as plt from sfepy.discrete.fem import MeshIO import sfepy.linalg as la from sfepy.mechanics.contact_bodies import (ContactPlane, plot_polygon, plot_points) conf_dir = os.path.dirname(__file__) io = MeshIO.any_from_filename(filename_mesh, prefix_dir=conf_dir) bb = io.read_bounding_box() outline = [vv for vv in la.combine(zip(*bb))] ax = plot_points(None, nm.array(outline), 'r*') for name in ['cp%d' % ii for ii in range(4)]: cpc = materials[name][0] cp = ContactPlane(cpc['.a'], cpc['.n'], cpc['.bs']) v1, v2 = la.get_perpendiculars(cp.normal) ax = plot_polygon(ax, cp.bounds) ax = plot_polygon(ax, nm.r_[cp.anchor[None, :], cp.anchor[None, :] + cp.normal[None, :]]) ax = plot_polygon(ax, nm.r_[cp.anchor[None, :], cp.anchor[None, :] + v1]) ax = plot_polygon(ax, nm.r_[cp.anchor[None, :], cp.anchor[None, :] + v2]) plt.show()
def test_hessians(self): """ Test the second partial derivatives of basis functions using finite differences. """ from sfepy.linalg import combine from sfepy.discrete import Integral, PolySpace ok = True orders = {'2_3': 3, '2_4': 3, '3_4': 4, '3_8': 3} bases = ([ ii for ii in combine([['2_3', '2_4', '3_4', '3_8'], ['lagrange']]) ]) for geom, poly_space_base in bases: self.report('geometry: %s, base: %s' % (geom, poly_space_base)) order = orders[geom] integral = Integral('i', order=order) coors, _ = integral.get_qp(geom) ps = PolySpace.any_from_args('ps', self.gels[geom], order, base=poly_space_base) dim = coors.shape[1] h1 = nm.zeros((coors.shape[0], dim, dim, ps.n_nod), nm.float64) eps = 1e-8 for ir in range(dim): cc = coors.copy() cc[:, ir] -= eps aux0 = ps.eval_base(cc, diff=1) cc[:, ir] += 2 * eps aux1 = ps.eval_base(cc, diff=1) h1[:, :, ir, :] = 0.5 * (aux1 - aux0) / eps h2 = ps.eval_base(coors, diff=2) _ok = nm.allclose(h1, h2, rtol=0, atol=50 * eps) self.report('hessians: error: %.2e ok: %s' % (nm.abs(h1 - h2).max(), _ok)) ok = ok and _ok return ok
def test_hessians(self): """ Test the second partial derivatives of basis functions using finite differences. """ from sfepy.linalg import combine from sfepy.discrete import Integral from sfepy.discrete.fem.poly_spaces import PolySpace ok = True orders = {'2_3' : 3, '2_4' : 3, '3_4' : 4, '3_8' : 3} bases = ([ii for ii in combine([['2_3', '2_4', '3_4', '3_8'], ['lagrange']])]) for geom, poly_space_base in bases: self.report('geometry: %s, base: %s' % (geom, poly_space_base)) order = orders[geom] integral = Integral('i', order=order) coors, _ = integral.get_qp(geom) ps = PolySpace.any_from_args('ps', self.gels[geom], order, base=poly_space_base) dim = coors.shape[1] h1 = nm.zeros((coors.shape[0], dim, dim, ps.n_nod), nm.float64) eps = 1e-8 for ir in range(dim): cc = coors.copy() cc[:, ir] -= eps aux0 = ps.eval_base(cc, diff=1) cc[:, ir] += 2 * eps aux1 = ps.eval_base(cc, diff=1) h1[:, :, ir, :] = 0.5 * (aux1 - aux0) / eps h2 = ps.eval_base(coors, diff=2) _ok = nm.allclose(h1, h2, rtol=0, atol=50*eps) self.report('hessians: error: %.2e ok: %s' % (nm.abs(h1 - h2).max(), _ok)) ok = ok and _ok return ok
def _define_nodes(self): geometry = self.geometry order = self.order n_v, dim = geometry.n_vertex, geometry.dim n_nod, n_per_edge, n_per_face, n_bubble = self._get_counts() nodes = nm.zeros((n_nod, dim), nm.int32) nts = nm.zeros((n_nod, 2), nm.int32) # Vertex nodes. nts[0:n_v, 0] = 0 nts[0:n_v, 1] = nm.arange(n_v, dtype=nm.int32) nodes[0:n_v] = nm.array(vertex_maps[dim], dtype=nm.int32) ii = n_v # Edge nodes. if (dim > 1) and (n_per_edge > 0): ik = nm.arange(2, order + 1, dtype=nm.int32) zo = nm.zeros((n_per_edge, 2), dtype=nm.int32) zo[:, 1] = 1 for ie, edge in enumerate(geometry.edges): n1, n2 = nodes[edge] ifix = nm.where(n1 == n2)[0] irun = nm.where(n1 != n2)[0][0] ic = n1[ifix] nodes[ii:ii + n_per_edge, ifix] = zo[:, ic] nodes[ii:ii + n_per_edge, irun] = ik nts[ii:ii + n_per_edge] = [[1, ie]] ii += n_per_edge # 3D face nodes. face_axes = [] sfnodes = None if (dim == 3) and (n_per_face > 0): n_face = len(geometry.faces) sfnodes = nm.zeros((n_per_face * n_face, dim), nm.int32) ii0 = ii ik = nm.arange(2, order + 1, dtype=nm.int32) zo = nm.zeros((n_per_face, 2), dtype=nm.int32) zo[:, 1] = 1 for ifa, face in enumerate(geometry.faces): ns = nodes[face] diff = nm.diff(ns, axis=0) asum = nm.abs(diff).sum(axis=0) ifix = nm.where(asum == 0)[0][0] ic = ns[0, ifix] irun1 = nm.where(asum == 2)[0][0] irun2 = nm.where(asum == 1)[0][0] iy, ix = nm.meshgrid(ik, ik) nodes[ii:ii + n_per_face, ifix] = zo[:, ic] nodes[ii:ii + n_per_face, irun1] = ix.ravel() nodes[ii:ii + n_per_face, irun2] = iy.ravel() nts[ii:ii + n_per_face] = [[2, ifa]] ij = ii - ii0 sfnodes[ij:ij + n_per_face, ifix] = zo[:, ic] sfnodes[ij:ij + n_per_face, irun1] = iy.ravel() sfnodes[ij:ij + n_per_face, irun2] = ix.ravel() face_axes.append([irun1, irun2]) ii += n_per_face face_axes = nm.array(face_axes) # Bubble nodes. if n_bubble > 0: ik = nm.arange(2, order + 1, dtype=nm.int32) nodes[ii:] = nm.array([aux for aux in combine([ik] * dim)]) nts[ii:ii + n_bubble] = [[3, 0]] ii += n_bubble assert_(ii == n_nod) # Coordinates of the "nodes". All nodes on a facet have the same # coordinates - the centre of the facet. c_min, c_max = self.bbox[:, 0] node_coors = nm.zeros(nodes.shape, dtype=nm.float64) node_coors[:n_v] = nodes[:n_v] if (dim > 1) and (n_per_edge > 0): ie = nm.where(nts[:, 0] == 1)[0] node_coors[ie] = node_coors[geometry.edges[nts[ie, 1]]].mean(1) if (dim == 3) and (n_per_face > 0): ifa = nm.where(nts[:, 0] == 2)[0] node_coors[ifa] = node_coors[geometry.faces[nts[ifa, 1]]].mean(1) if n_bubble > 0: ib = nm.where(nts[:, 0] == 3)[0] node_coors[ib] = node_coors[geometry.conn].mean(0) return nodes, nts, node_coors, face_axes, sfnodes
def _gen_common_data(order, gels, report): import sfepy from sfepy.base.base import Struct from sfepy.linalg import combine from sfepy.fem import Mesh, Domain, Field, FieldVariable, Integral from sfepy.fem.global_interp import get_ref_coors integral = Integral('i', order=order) for geom, poly_space_base in combine([['2_4', '3_8'], ['lagrange', 'lobatto']]): report('geometry: %s, base: %s' % (geom, poly_space_base)) mesh0 = Mesh.from_file('meshes/elements/%s_2.mesh' % geom, prefix_dir=sfepy.data_dir) gel = gels[geom] perms = gel.get_conn_permutations() qps, qp_weights = integral.get_qp(gel.surface_facet.name) zz = nm.zeros_like(qps[:, :1]) qps = nm.hstack(([qps] + [zz])) rot = rots[geom] if rot is not None: pass shift = shifts[geom] rcoors = nm.ascontiguousarray(qps + shift[:1, :] - shift[1:, :]) ccoors = nm.ascontiguousarray(qps + shift[:1, :] + shift[1:, :]) for ir, pr in enumerate(perms): for ic, pc in enumerate(perms): report('ir: %d, ic: %d' % (ir, ic)) mesh = mesh0.copy() conn = mesh.conns[0] conn[0, :] = conn[0, pr] conn[1, :] = conn[1, pc] cache = Struct(mesh=mesh) domain = Domain('domain', mesh) omega = domain.create_region('Omega', 'all') region = domain.create_region('Facet', rsels[geom]) field = Field.from_args('f', nm.float64, shape=1, region=omega, approx_order=order, poly_space_base=poly_space_base) var = FieldVariable('u', 'unknown', field, 1) report('# dofs: %d' % var.n_dof) vec = nm.empty(var.n_dof, dtype=var.dtype) ap = field.aps[0] ps = ap.interp.poly_spaces['v'] dofs = field.get_dofs_in_region_group(region, 0, merge=False) edofs, fdofs = nm.unique(dofs[1]), nm.unique(dofs[2]) rrc, rcells, rstatus = get_ref_coors(field, rcoors, cache=cache) crc, ccells, cstatus = get_ref_coors(field, ccoors, cache=cache) yield (geom, poly_space_base, qp_weights, mesh, ir, ic, ap, ps, rrc, crc, vec, edofs, fdofs)
def _gen_common_data(orders, gels, report): import sfepy from sfepy.base.base import Struct from sfepy.linalg import combine from sfepy.fem import Mesh, Domain, Field, FieldVariable, Integral from sfepy.fem.global_interp import get_ref_coors bases = ([ii for ii in combine([['2_4', '3_8'], ['lagrange', 'lobatto']])] + [ii for ii in combine([['2_3', '3_4'], ['lagrange']])]) for geom, poly_space_base in bases: report('geometry: %s, base: %s' % (geom, poly_space_base)) order = orders[geom] integral = Integral('i', order=order) aux = '' if geom in ['2_4', '3_8'] else 'z' mesh0 = Mesh.from_file('meshes/elements/%s_2%s.mesh' % (geom, aux), prefix_dir=sfepy.data_dir) gel = gels[geom] perms = gel.get_conn_permutations() qps, qp_weights = integral.get_qp(gel.surface_facet.name) zz = nm.zeros_like(qps[:, :1]) qps = nm.hstack(([qps] + [zz])) shift = shifts[geom] rcoors = nm.ascontiguousarray(qps + shift[:1, :] - shift[1:, :]) ccoors = nm.ascontiguousarray(qps + shift[:1, :] + shift[1:, :]) for ir, pr in enumerate(perms): for ic, pc in enumerate(perms): report('ir: %d, ic: %d' % (ir, ic)) report('pr: %s, pc: %s' % (pr, pc)) mesh = mesh0.copy() conn = mesh.conns[0] conn[0, :] = conn[0, pr] conn[1, :] = conn[1, pc] cache = Struct(mesh=mesh) domain = Domain('domain', mesh) omega = domain.create_region('Omega', 'all') region = domain.create_region('Facet', rsels[geom], 'facet') field = Field.from_args('f', nm.float64, shape=1, region=omega, approx_order=order, poly_space_base=poly_space_base) var = FieldVariable('u', 'unknown', field, 1) report('# dofs: %d' % var.n_dof) vec = nm.empty(var.n_dof, dtype=var.dtype) ap = field.aps[0] ps = ap.interp.poly_spaces['v'] dofs = field.get_dofs_in_region_group(region, 0, merge=False) edofs, fdofs = nm.unique(dofs[1]), nm.unique(dofs[2]) rrc, rcells, rstatus = get_ref_coors(field, rcoors, cache=cache) crc, ccells, cstatus = get_ref_coors(field, ccoors, cache=cache) assert_((rstatus == 0).all() and (cstatus == 0).all()) yield (geom, poly_space_base, qp_weights, mesh, ir, ic, ap, ps, rrc, rcells[0, 1], crc, ccells[0, 1], vec, edofs, fdofs)
def _gen_common_data(orders, gels, report): import sfepy from sfepy.base.base import Struct from sfepy.linalg import combine from sfepy.discrete import FieldVariable, Integral from sfepy.discrete.fem import Mesh, FEDomain, Field from sfepy.discrete.common.global_interp import get_ref_coors bases = ([ii for ii in combine([['2_4', '3_8'], ['lagrange', 'lobatto']])] + [ii for ii in combine([['2_3', '3_4'], ['lagrange']])]) for geom, poly_space_base in bases: report('geometry: %s, base: %s' % (geom, poly_space_base)) order = orders[geom] integral = Integral('i', order=order) aux = '' if geom in ['2_4', '3_8'] else 'z' mesh0 = Mesh.from_file('meshes/elements/%s_2%s.mesh' % (geom, aux), prefix_dir=sfepy.data_dir) gel = gels[geom] perms = gel.get_conn_permutations() qps, qp_weights = integral.get_qp(gel.surface_facet.name) zz = nm.zeros_like(qps[:, :1]) qps = nm.hstack(([qps] + [zz])) shift = shifts[geom] rcoors = nm.ascontiguousarray(qps + shift[:1, :] - shift[1:, :]) ccoors = nm.ascontiguousarray(qps + shift[:1, :] + shift[1:, :]) for ir, pr in enumerate(perms): for ic, pc in enumerate(perms): report('ir: %d, ic: %d' % (ir, ic)) report('pr: %s, pc: %s' % (pr, pc)) mesh = mesh0.copy() conn = mesh.get_conn(gel.name) conn[0, :] = conn[0, pr] conn[1, :] = conn[1, pc] cache = Struct(mesh=mesh) domain = FEDomain('domain', mesh) omega = domain.create_region('Omega', 'all') region = domain.create_region('Facet', rsels[geom], 'facet') field = Field.from_args('f', nm.float64, shape=1, region=omega, approx_order=order, poly_space_base=poly_space_base) var = FieldVariable('u', 'unknown', field) report('# dofs: %d' % var.n_dof) vec = nm.empty(var.n_dof, dtype=var.dtype) ps = field.poly_space dofs = field.get_dofs_in_region(region, merge=False) edofs, fdofs = nm.unique(dofs[1]), nm.unique(dofs[2]) rrc, rcells, rstatus = get_ref_coors(field, rcoors, cache=cache) crc, ccells, cstatus = get_ref_coors(field, ccoors, cache=cache) assert_((rstatus == 0).all() and (cstatus == 0).all()) yield (geom, poly_space_base, qp_weights, mesh, ir, ic, field, ps, rrc, rcells[0], crc, ccells[0], vec, edofs, fdofs)
def _define_nodes(self): geometry = self.geometry order = self.order n_v, dim = geometry.n_vertex, geometry.dim n_nod = (order + 1) ** dim nodes = nm.zeros((n_nod, dim), nm.int32) nts = nm.zeros((n_nod, 2), nm.int32) n_per_edge = (order - 1) n_per_face = (order - 1) ** (dim - 1) n_bubble = (order - 1) ** dim # Vertex nodes. nts[0:n_v, 0] = 0 nts[0:n_v, 1] = nm.arange(n_v, dtype=nm.int32) nodes[0:n_v] = nm.array(vertex_maps[dim], dtype=nm.int32) ii = n_v # Edge nodes. if (dim > 1) and (n_per_edge > 0): ik = nm.arange(2, order + 1, dtype=nm.int32) zo = nm.zeros((n_per_edge, 2), dtype=nm.int32) zo[:, 1] = 1 for ie, edge in enumerate(geometry.edges): n1, n2 = nodes[edge] ifix = nm.where(n1 == n2)[0] irun = nm.where(n1 != n2)[0][0] ic = n1[ifix] nodes[ii:ii + n_per_edge, ifix] = zo[:, ic] nodes[ii:ii + n_per_edge, irun] = ik nts[ii:ii + n_per_edge] = [[1, ie]] ii += n_per_edge # 3D face nodes. if (dim == 3) and (n_per_face > 0): ik = nm.arange(2, order + 1, dtype=nm.int32) zo = nm.zeros((n_per_face, 2), dtype=nm.int32) zo[:, 1] = 1 for ifa, face in enumerate(geometry.faces): ns = nodes[face] diff = nm.diff(ns, axis=0) asum = nm.abs(diff).sum(axis=0) ifix = nm.where(asum == 0)[0][0] ic = ns[0, ifix] irun1 = nm.where(asum == 2)[0][0] irun2 = nm.where(asum == 1)[0][0] iy, ix = nm.meshgrid(ik, ik) nodes[ii:ii + n_per_face, ifix] = zo[:, ic] nodes[ii:ii + n_per_face, irun1] = ix.ravel() nodes[ii:ii + n_per_face, irun2] = iy.ravel() nts[ii:ii + n_per_face] = [[2, ifa]] print '**', ie, face print ns print ifix, irun1, irun2 ii += n_per_face # Bubble nodes. if n_bubble > 0: ik = nm.arange(2, order + 1, dtype=nm.int32) nodes[ii:] = nm.array([aux for aux in combine([ik] * dim)]) nts[ii:ii + n_bubble] = [[3, 0]] ii += n_bubble assert_(ii == n_nod) nm.set_printoptions(threshold=10000) # Coordinates of the "nodes". All nodes on a facet have the same # coordinates - the centre of the facet. c_min, c_max = self.bbox[:, 0] node_coors = nm.zeros(nodes.shape, dtype=nm.float64) node_coors[:n_v] = nodes[:n_v] if (dim > 1) and (n_per_edge > 0): ie = nm.where(nts[:, 0] == 1)[0] node_coors[ie] = node_coors[geometry.edges[nts[ie, 1]]].mean(1) if (dim == 3) and (n_per_face > 0): ifa = nm.where(nts[:, 0] == 2)[0] node_coors[ifa] = node_coors[geometry.faces[nts[ifa, 1]]].mean(1) if n_bubble > 0: ib = nm.where(nts[:, 0] == 3)[0] node_coors[ib] = node_coors[geometry.conn].mean(0) ## print nm.concatenate((nts, nodes, node_coors), 1) return nodes, nts, node_coors
def _gen_common_data(orders, gels, report): import sfepy from sfepy.base.base import Struct from sfepy.linalg import combine from sfepy.discrete import FieldVariable, Integral from sfepy.discrete.fem import Mesh, FEDomain, Field from sfepy.discrete.common.global_interp import get_ref_coors bases = ([ii for ii in combine([['2_4', '3_8'], ['lagrange', 'serendipity', 'bernstein', 'lobatto']])] + [ii for ii in combine([['2_3', '3_4'], ['lagrange', 'bernstein']])]) for geom, poly_space_base in bases: order = orders[geom] if (geom == '3_8') and (poly_space_base == 'serendipity'): order = 2 report('geometry: %s, base: %s, order: %d' % (geom, poly_space_base, order)) integral = Integral('i', order=order) aux = '' if geom in ['2_4', '3_8'] else 'z' mesh0 = Mesh.from_file('meshes/elements/%s_2%s.mesh' % (geom, aux), prefix_dir=sfepy.data_dir) if (geom == '3_8'): meshes = _permute_quad_face(mesh0) else: meshes = [mesh0] gel = gels[geom] perms = gel.get_conn_permutations() qps, qp_weights = integral.get_qp(gel.surface_facet.name) zz = nm.zeros_like(qps[:, :1]) qps = nm.hstack(([qps] + [zz])) shift = shifts[geom] rcoors = nm.ascontiguousarray(qps + shift[:1, :] - shift[1:, :]) ccoors = nm.ascontiguousarray(qps + shift[:1, :] + shift[1:, :]) all_oris = _get_possible_oris(geom) oris = set() for (ir, pr), (ic, pc), (im, mesh0) in product( enumerate(perms), enumerate(perms), enumerate(meshes), ): report('im: %d, ir: %d, ic: %d' % (im, ir, ic)) report('pr: %s, pc: %s' % (pr, pc)) mesh = mesh0.copy() conn = mesh.cmesh.get_conn(mesh0.cmesh.tdim, 0).indices conn = conn.reshape((mesh0.n_el, -1)) conn[0, :] = conn[0, pr] conn[1, :] = conn[1, pc] conn2 = mesh.get_conn(gel.name) assert_((conn == conn2).all()) cache = Struct(mesh=mesh) domain = FEDomain('domain', mesh) omega = domain.create_region('Omega', 'all') region = domain.create_region('Facet', rsels[geom], 'facet') field = Field.from_args('f', nm.float64, shape=1, region=omega, approx_order=order, poly_space_base=poly_space_base) fis = region.get_facet_indices() conn = mesh.cmesh.get_conn_as_graph(region.dim, region.dim - 1) _oris = mesh.cmesh.facet_oris[conn.indptr[fis[:, 0]] + fis[:, 1]] oris |= set(_oris) if oris == all_oris: break var = FieldVariable('u', 'unknown', field) report('# dofs: %d' % var.n_dof) vec = nm.empty(var.n_dof, dtype=var.dtype) ps = field.poly_space dofs = field.get_dofs_in_region(region, merge=False) edofs, fdofs = nm.unique(dofs[1]), nm.unique(dofs[2]) rrc, rcells, rstatus = get_ref_coors(field, rcoors, cache=cache) crc, ccells, cstatus = get_ref_coors(field, ccoors, cache=cache) assert_((rstatus == 0).all() and (cstatus == 0).all()) yield (geom, poly_space_base, qp_weights, mesh, im, ir, ic, field, ps, rrc, rcells[0], crc, ccells[0], vec, edofs, fdofs)