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_planes 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 get_fargs(self, force_pars, normal, anchor, bounds, virtual, state, mode=None, term_mode=None, diff_var=None, **kwargs): sg, _ = self.get_mapping(virtual) assert_((force_pars >= 0.0).all(), 'force parameters must be non-negative!') if self.cp is None: self.cp = ContactPlane(anchor, normal, bounds) ig = self.char_fun.ig qps = self.get_physical_qps() qp_coors = qps.values[ig] u_qp = self.get(state, 'val').reshape(qp_coors.shape) # Deformed QP coordinates. coors = u_qp + qp_coors force = nm.zeros(coors.shape[0], dtype=nm.float64) # Active points in contact change with displacements! ii = self.cp.mask_points(coors) k = force_pars[..., 0] f0 = force_pars[..., 1] k.shape = f0.shape = force.shape ir = f0 >= 1e-14 eps = nm.where(ir, -2.0 * f0 / k, 0.0) a = nm.zeros_like(eps) a[ir] = k[ir]**2 / (4.0 * f0[ir]) if diff_var is None: if ii.any(): d = self.cp.get_distance(coors[ii]) # Force in the plane normal direction. force[ii] = self.smooth_f(d, k[ii], f0[ii], a[ii], eps[ii], 0) fmode = 0 else: if ii.any(): d = self.cp.get_distance(coors[ii]) # Force in the plane normal direction derivative. force[ii] = self.smooth_f(d, k[ii], f0[ii], a[ii], eps[ii], 1) fmode = 1 force.shape = qps.shape[ig][:2] + (1, 1) return force, self.cp.normal, sg, fmode