def Torus(show_plot=False): """Custom mesh for torus """ raise NotImplementedError("Not fully implemented yet") # MAKE TORUS WORK from copy import deepcopy from numpy.linalg import norm mesh = Mesh() mesh.Circle(element_type="quad", ncirc=2, nrad=2) tmesh = deepcopy(mesh) arc = GeometricArc(start=(10, 10, 8), end=(10, 10, -8)) # arc.GeometricArc() nlong = 10 points = mesh.Extrude(path=arc, nlong=nlong) # mesh.SimplePlot() # print points # elem_nodes = tmesh.elements[0,:] # p1 = tmesh.points[elem_nodes[0],:] # p2 = tmesh.points[elem_nodes[1],:] # p3 = tmesh.points[elem_nodes[2],:] # p4 = tmesh.points[elem_nodes[3],:] # E1 = np.append(p2 - p1, 0.0) # E2 = np.append(p4 - p1, 0.0) # E3 = np.array([0,0,1.]) # E1 /= norm(E1) # E2 /= norm(E2) # # print E1,E2,E3 # elem_nodes = mesh.elements[0,:] # p1 = mesh.points[elem_nodes[0],:] # p2 = mesh.points[elem_nodes[1],:] # p3 = mesh.points[elem_nodes[2],:] # p4 = mesh.points[elem_nodes[3],:] # p5 = mesh.points[elem_nodes[4],:] # e1 = p2 - p1 # e2 = p4 - p1 # e3 = p5 - p1 # e1 /= norm(e1) # e2 /= norm(e2) # e3 /= norm(e3) # # print e1,e2,e3 # # TRANSFORMATION MATRIX # Q = np.array([ # [np.einsum('i,i',e1,E1), np.einsum('i,i',e1,E2), np.einsum('i,i',e1,E3)], # [np.einsum('i,i',e2,E1), np.einsum('i,i',e2,E2), np.einsum('i,i',e2,E3)], # [np.einsum('i,i',e3,E1), np.einsum('i,i',e3,E2), np.einsum('i,i',e3,E3)] # ]) # mesh.points = np.dot(mesh.points,Q.T) # points = np.dot(points,Q) # E1 = np.array([1,0,0.]) E3 = np.array([0., 0., 1.]) nnode_2D = tmesh.points.shape[0] for i in range(nlong + 1): # e1 = points[i,:][None,:]/norm(points[i,:]) # Q = np.dot(E1[:,None],e1) # vpoints = np.dot(points,Q) e3 = points[i + 1, :] - points[i, :] e3 /= norm(e3) Q = np.dot(e3[:, None], E3[None, :]) # print Q # print np.dot(Q,points[i,:][:,None]) vpoints = np.dot(points, Q) # print current_points mesh.points[nnode_2D * i:nnode_2D * (i + 1), :2] = tmesh.points + points[i, :2] mesh.points[nnode_2D * i:nnode_2D * (i + 1), 2] = vpoints[i, 2] # print Q # print tmesh.points # mesh = Mesh.HexahedralProjection() if show_plot: mesh.SimplePlot() return mesh
def HarvesterPatch(ndisc=20, nradial=4, show_plot=False): """Creates a custom mesh for an energy harvester patch. [Not to be modified] ndisc: [int] number of discretisation in c ndradial: [int] number of discretisation in radial directions for different components of harevester """ center = np.array([30.6979, 20.5]) p1 = np.array([30., 20.]) p2 = np.array([30., 21.]) p1line = p1 - center p2line = p2 - center radius = np.linalg.norm(p1line) pp = np.array([center[0], center[1] + radius]) y_line = pp - center start_angle = -np.pi / 2. - np.arccos( np.linalg.norm(y_line * p1line) / np.linalg.norm(y_line) / np.linalg.norm(p1line)) end_angle = np.pi / 2. + np.arccos( np.linalg.norm(y_line * p1line) / np.linalg.norm(y_line) / np.linalg.norm(p1line)) points = np.array([p1, p2, center]) # nradial = 4 mesh = Mesh() mesh.Arc(element_type="quad", radius=radius, start_angle=start_angle, end_angle=end_angle, nrad=nradial, ncirc=ndisc, center=(center[0], center[1]), refinement=True) mesh1 = Mesh() mesh1.Triangle(element_type="quad", npoints=nradial, c1=totuple(center), c2=totuple(p1), c3=totuple(p2)) mesh += mesh1 mesh_patch = Mesh() mesh_patch.HollowArc(ncirc=ndisc, nrad=nradial, center=(-7.818181, 44.22727272), start_angle=np.arctan(44.22727272 / -7.818181), end_angle=np.arctan(-24.22727272 / 37.818181), element_type="quad", inner_radius=43.9129782, outer_radius=44.9129782) mesh3 = Mesh() mesh3.Triangle(element_type="quad", npoints=nradial, c2=totuple(p1), c3=totuple(p2), c1=(mesh_patch.points[0, 0], mesh_patch.points[0, 1])) mesh += mesh3 mesh += mesh_patch mesh.Extrude(nlong=ndisc, length=40) if show_plot: mesh.SimplePlot() return mesh