def eval_non_local_interaction(problem, region_name, var_name, integral_name, f1, f2, kernel_function, pbar=None): """ Single element group only! """ var = problem.get_variables()[var_name] region = problem.domain.regions[region_name] integral = problem.integrals[integral_name] qps = get_physical_qps(region, integral) igs = qps.values.keys() ig = igs[0] qp = qps.values[ig] n_el, n_qp = f1.shape[:2] vg, _ = var.get_mapping(ig, region, integral, 'volume') # Weighted jacobian. det = vg.det shape = (n_el * n_qp, 1, 1) val1 = f1 * det val2 = f2 * det val1.shape = shape val2.shape = shape coef = nm.zeros(shape, dtype=val1.dtype) if pbar is not None: pbar.init(qp.shape[0]) pbar.update(0) for ii, coor in enumerate(qp): ## tt = time.clock() kernel = kernel_function(coor, qp) kernel.shape = val2.shape ## print'aa', time.clock() - tt ## tt = time.clock() coef[ii] = (kernel * val2).sum() ## print 'bb', time.clock() - tt if pbar is not None: pbar.update(ii) val = (val1 * coef).sum() if pbar is not None: print return val
def get_physical_qps(self): """ Get physical quadrature points corresponding to the term region and integral. """ from sfepy.fem.mappings import get_physical_qps, PhysicalQPs if self.integration == 'point': phys_qps = PhysicalQPs(self.region.igs) elif self.integration == 'plate': phys_qps = get_physical_qps(self.region, self.integral, map_kind='v') else: phys_qps = get_physical_qps(self.region, self.integral) return phys_qps
def get_physical_qps(self): """ Get physical quadrature points corresponding to the term region and integral. """ from sfepy.fem.mappings import get_physical_qps phys_qps = get_physical_qps(self.region, self.integral) return phys_qps
def test_invariance_qp(self): from sfepy import data_dir from sfepy.fem import (Mesh, Domain, H1NodalVolumeField, Variables, Integral) from sfepy.terms import Term from sfepy.fem.mappings import get_physical_qps mesh = Mesh('source mesh', data_dir + '/meshes/3d/block.mesh') bbox = mesh.get_bounding_box() dd = bbox[1, :] - bbox[0, :] data = nm.sin(4.0 * nm.pi * mesh.coors[:,0:1] / dd[0]) \ * nm.cos(4.0 * nm.pi * mesh.coors[:,1:2] / dd[1]) variables = { 'u': ('unknown field', 'scalar_tp', 0), 'v': ('test field', 'scalar_tp', 'u'), } domain = Domain('domain', mesh) omega = domain.create_region('Omega', 'all') field = H1NodalVolumeField('scalar_tp', nm.float64, 1, omega, approx_order=1) ff = {field.name: field} vv = Variables.from_conf(transform_variables(variables), ff) u = vv['u'] u.set_from_mesh_vertices(data) integral = Integral('i', order=2) term = Term.new('ev_volume_integrate(u)', integral, omega, u=u) term.setup() val1, _ = term.evaluate(mode='qp') val1 = val1.ravel() qps = get_physical_qps(omega, integral) coors = qps.get_merged_values() val2 = u.evaluate_at(coors).ravel() self.report('max. difference:', nm.abs(val1 - val2).max()) ok = nm.allclose(val1, val2, rtol=0.0, atol=1e-12) self.report('invariance in qp: %s' % ok) return ok
def test_invariance_qp(self): from sfepy import data_dir from sfepy.fem import (Mesh, Domain, H1NodalVolumeField, Variables, Integral) from sfepy.terms import Term from sfepy.fem.mappings import get_physical_qps mesh = Mesh('source mesh', data_dir + '/meshes/3d/block.mesh') bbox = mesh.get_bounding_box() dd = bbox[1,:] - bbox[0,:] data = nm.sin(4.0 * nm.pi * mesh.coors[:,0:1] / dd[0]) \ * nm.cos(4.0 * nm.pi * mesh.coors[:,1:2] / dd[1]) variables = { 'u' : ('unknown field', 'scalar_tp', 0), 'v' : ('test field', 'scalar_tp', 'u'), } domain = Domain('domain', mesh) omega = domain.create_region('Omega', 'all') field = H1NodalVolumeField('scalar_tp', nm.float64, 1, omega, approx_order=1) ff = {field.name : field} vv = Variables.from_conf(transform_variables(variables), ff) u = vv['u'] u.set_from_mesh_vertices(data) integral = Integral('i', order=2) term = Term.new('ev_volume_integrate(u)', integral, omega, u=u) term.setup() val1, _ = term.evaluate(mode='qp') val1 = val1.ravel() qps = get_physical_qps(omega, integral) coors = qps.get_merged_values() val2 = u.evaluate_at(coors).ravel() self.report('max. difference:', nm.abs(val1 - val2).max()) ok = nm.allclose(val1, val2, rtol=0.0, atol=1e-12) self.report('invariance in qp: %s' % ok) return ok