Exemple #1
0
# | |_| | (_) | | | | | | (_| | | | | |
# |____/ \___/|_| |_| |_|\__,_|_|_| |_|
# 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
Exemple #2
0
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()
Exemple #4
0
    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)
Exemple #5
0
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()