# | |_| | (_) | | | | | | (_| | | | | | # |____/ \___/|_| |_| |_|\__,_|_|_| |_| # Domain # All geometrical options go here (but not mesh options) domain = Domain.PiecewiseLinearComplexDomain() # ----- SHAPES ----- # # TANK tank = st.Tank3D(domain, tank_dim) # CAISSON radius = 0.1 caisson = st.Cuboid(domain, dim=[2*radius, 2*radius, 2*radius], coords=(tank_dim[0]/2., tank_dim[1]/2., water_level+radius/10.), barycenter=(tank_dim[0]/2., tank_dim[1]/2., water_level+radius/10.)) caisson.setHoles([caisson.barycenter]) caisson.holes_ind = np.array([0]) # let gmsh know that the caisson is IN the tank tank.setChildShape(caisson, 0) # ____ _ ____ _ _ _ _ # | __ ) ___ _ _ _ __ __| | __ _ _ __ _ _ / ___|___ _ __ __| (_) |_(_) ___ _ __ ___ # | _ \ / _ \| | | | '_ \ / _` |/ _` | '__| | | | | / _ \| '_ \ / _` | | __| |/ _ \| '_ \/ __| # | |_) | (_) | |_| | | | | (_| | (_| | | | |_| | |__| (_) | | | | (_| | | |_| | (_) | | | \__ \ # |____/ \___/ \__,_|_| |_|\__,_|\__,_|_| \__, |\____\___/|_| |_|\__,_|_|\__|_|\___/|_| |_|___/ # |___/ # Boundary Conditions
nu_1 = 1.500e-5 sigma_01 = 0.0 g = [0., 0., -9.81] he = 2.5 water_level = 2.5 # GEOMETRY domain = Domain.PiecewiseLinearComplexDomain() nd = 3 tank_dim = [5., 5., 5.] tank = st.Tank3D(domain, dim=tank_dim) rect = st.Cuboid(domain, dim=[1., 1., 1.], coords=[ old_div(tank_dim[0], 2.), old_div(tank_dim[1], 2.), old_div(tank_dim[2], 2.) ]) rect.setHoles(holes=np.array([rect.coords])) domain.MeshOptions.he = he # BOUNDARY CONDITIONS tank.BC['x+'].setNoSlip() tank.BC['x-'].setNoSlip() tank.BC['y-'].setNoSlip() tank.BC['y+'].setNoSlip() tank.BC['z-'].setNoSlip() tank.BC['z+'].setAtmosphere()
# ----- SHAPES ----- # front = back = tank_sponge[0] right = left = tank_sponge[1] fbt = rlt = False if front and back: fbt = True if right and left: rlt = True tank = st.Tank3D(domain, tank_dim) tank.setSponge(front=front, back=back, right=right, left=left) tank.setAbsorptionZones(front=fbt, back=fbt, right=rlt, left=rlt) caisson3D = st.Cuboid(domain, dim=dim, coords=coords) caisson3D.setRigidBody() caisson3D.setBarycenter(barycenter) caisson3D.setConstraints(free_x=free_x, free_r=free_r) # mass is not real mass ---> inerta tensor provided and scaled by mass mass = 15 caisson3D.setMass(mass) caisson3D.It = np.array([[Ixx, 0., 0.], [0., Iyy, 0.], [0., 0., Izz] ]) / caisson3D.mass caisson3D.rotate(rotation_angle, rotation_axis) caisson3D.setRecordValues(pos=True, rot=True, F=True, M=True) # ----- BOUNDARY CONDITIONS ----- # for bc in caisson3D.BC_list: bc.setNoSlip()
def testGetInertia(self): from proteus import Domain from proteus import SpatialTools as st from proteus.mprans import SpatialTools as mst from proteus.mprans import BodyDynamics as bd # 2d case domain2D = Domain.PlanarStraightLineGraphDomain() pos = np.array([1.0, 1.0, 0.0]) dim = (0.3, 0.385) caisson = mst.Rectangle(domain=domain2D, dim=dim, coords=[pos[0], pos[1]]) caisson2D = bd.RigidBody(shape=caisson) mst.assembleDomain(domain2D) c2d = caisson2D c2d.nd = 2 Ix = (old_div((dim[0]**2),12.)) Iy = (old_div((dim[1]**2),12.)) It = Ix + Iy mass = 50.0 I1 = It*mass c2d.mass = mass c2d.It = It I2 = c2d.getInertia() npt.assert_equal(I1, I2) # 3d case pos, dim, caisson = [], [], [] domain3D = Domain.PiecewiseLinearComplexDomain() pos = np.array([0.0, 0.0, 0.0]) dim = (0.3, 0.385, 0.4) angle = radians(10.) Ix = (old_div((dim[0]**2),12.)) Iy = (old_div((dim[1]**2),12.)) Iz = (old_div((dim[2]**2),12.)) It = np.array([ [Iz + Iy, 0.0, 0.0], [0.0, Ix + Iz, 0.0], [0.0, 0.0, Ix + Iy] ]) mass = 50.0 # rotational axis and versors ax, ay, az = axis = np.array([1., 1., 1.]) mod = np.sqrt((ax**2)+(ay**2)+(az**2)) axis_ver = (old_div(axis,mod)) # shape caisson = mst.Cuboid(domain=domain3D, dim=dim, coords=[pos[0], pos[1], pos[2]]) caisson.rotate(rot=angle, axis=axis) coords_system = caisson.coords_system caisson3D = bd.RigidBody(shape=caisson) mst.assembleDomain(domain3D) # rotational operator for inertia calculation on an arbitrary axis rotx, roty, rotz = np.dot(axis_ver, np.linalg.inv(coords_system)) rot = np.array([ [(rotx**2), rotx*roty, rotx*rotz], [roty*rotx, (roty**2), roty*rotz], [rotz*rotx, rotz*roty, (rotz**2)] ]) #inertia = np.einsum('ij,ij->', mass*It, rot) inertia = np.sum(mass*It*rot) # testing from BodyDynamics c3d = caisson3D c3d.nd = 3 c3d.mass = mass c3d.It = It c3d.coords_system = coords_system I = c3d.getInertia(vec=axis) npt.assert_equal(I, inertia)
nu_0 = 1.004e-6 rho_1 = 1.205 nu_1 = 1.500e-5 sigma_01 = 0.0 g = [0., 0., -9.81] he = 1. water_level = 2.5 # GEOMETRY domain = Domain.PiecewiseLinearComplexDomain() tank_dim = [5., 5., 5.] tank = st.Tank3D(domain, dim=tank_dim) rect = st.Cuboid(domain, dim=[1., 1., 1.], coords=[tank_dim[0] / 2., tank_dim[1] / 2., tank_dim[2] / 2.]) rect.setHoles(holes=np.array([rect.coords])) domain.MeshOptions.he = he # BOUNDARY CONDITIONS tank.BC['x+'].setNoSlip() tank.BC['x-'].setNoSlip() tank.BC['y-'].setNoSlip() tank.BC['y+'].setNoSlip() tank.BC['z-'].setNoSlip() tank.BC['z+'].setAtmosphere() rect.BC['x+'].setNoSlip()