Source code for desicos.abaqus.imperfections.dimple

from __future__ import absolute_import

import numpy as np

from .imperfection import Imperfection

[docs]class Dimple(Imperfection): """Dimple imperfection References ---------- Wullschleger, L. and Meyer-Piening, H.-R.. Buckling of geometrically imperfect cylindrical shells - definition of a buckling load. International Journal of Non-Linear Mechanics 37 (2002) 645-657. """ def __init__(self, thetadeg, pt, a, b, wb): super(Dimple, self).__init__() self.thetadeg = thetadeg self.pt = pt self.a = a self.b = b self.wb = wb # plotting options self.xaxis = 'wb' self.xaxis_label = 'Imperfection amplitude, mm' def rebuild(self): cc = self.impconf.conecyl pt = self.pt r, z = cc.r_z_from_pt(pt) self.x, self.y, self.z = self.get_xyz() cl = np.rad2deg(self.a/2./r) self.r, z = cc.r_z_from_pt(self.pt) cl_side = np.sin(np.deg2rad(cl))*self.r self.zlow = self.z - cl_side self.rlow, z = cc.r_z_from_pt(self.zlow/cc.H) self.zup = self.z + cl_side self.rup, z = cc.r_z_from_pt(self.zup/cc.H) self.thetadeg1 = self.thetadeg - cl self.thetadeg2 = self.thetadeg + cl self.thetadeg = self.thetadeg % 360. self.thetadeg1 = self.thetadeg1 % 360. self.thetadeg2 = self.thetadeg2 % 360. self.thetadegs = [self.thetadeg1, self.thetadeg, self.thetadeg2] self.pts = [self.zlow/cc.H, self.z/cc.H, self.zup/cc.H] self.name = ('dimple_pt_%03d_theta_%03d' % (int(self.pt*100), int(self.thetadeg))) def calc_amplitude(self): return self.wb
[docs] def create(self): """Realizes the dimple imperfection in the finite element model The nodes corresponding to this imperfection are translated. .. note:: Must be called from Abaqus. """ from __main__ import mdb cc = self.impconf.conecyl mod = mdb.models[cc.model_name] part_shell = mod.parts['Shell'] a = self.a b = self.b wb = self.wb dim = 1.5*max(self.a, self.b) xMin = self.x - dim xMax = self.x + dim yMin = self.y - dim yMax = self.y + dim zMin = self.z - dim zMax = self.z + dim box_nodes = part_shell.nodes.getByBoundingBox(xMin,yMin,zMin, xMax,yMax,zMax) box_nodes = np.array(box_nodes, dtype=object) def calc_dr_dz(x, y, z): zeta = (z-self.z) + b/2. dist = np.sqrt((x-self.x)**2 + (y-self.y)**2) pt = z / cc.H r,z = cc.r_z_from_pt(pt) alpha = 2*np.arcsin(dist / (2.*r)) arc = alpha*r drR = -wb/2.*np.cos(np.pi*arc/a)*(1-np.cos(2*np.pi*zeta/b)) dr = drR*np.cos(cc.alpharad) dz = drR*np.sin(cc.alpharad) check = (zeta < 0.) | (zeta > b) dr[check] = 0 dz[check] = 0 check = (arc < 0.) | (arc > a/2.) dr[check] = 0 dz[check] = 0 return dr, dz local_csys = part_shell.features['part_cyl_csys'] local_csys = part_shell.datums[local_csys.id] xs, ys, zs = np.array([node.coordinates for node in box_nodes]).T drs, dzs = calc_dr_dz(x=xs, y=ys, z=zs) check = drs!=0 box_nodes = box_nodes[check] drs = drs[check] dzs = dzs[check] for node, dr, dz in zip(box_nodes, drs, dzs): part_shell.editNode(localCsys = local_csys, nodes = (node,), offset1 = dr, offset3 = dz)
# Reference: # Wullschleger, L. and Meyer-Piening, H.-R.. Buckling of geometrically # imperfect cylindrical shells - definition of a buckling load. International # Journal of Non-Linear Mechanics 37 (2002) 645-657.