Esempio n. 1
0
velocity_init =  -.1      # initial velocity
epsilon = 0.5#1e-1
theta = 1/2.0 + epsilon              # theta for MoreauJeanOSI integrator
#theta = 1.0
E = 210e9 # young Modulus
S = 0.000314 #  Beam Section 1 cm  for the diameter
#S=0.1
L = 1.0 # length of the  beam
l = L/nDof # length of an element
rho = 7800.0  # specific mass
#rho=1.0
g = 9.81 # Gravity
g=0.0


M= SimpleMatrix(nDof,nDof,SPARSE,nDof)
K= SimpleMatrix(nDof,nDof,SPARSE,nDof)
K.setValue(0,0, 1.*E*S/l)
K.setValue(0,1,-1.*E*S/l)
M.setValue(0,0, 1/3.*rho*S*l)
M.setValue(0,1, 1/6.*rho*S*l)

for i in range(1,nDof-1):
    K.setValue(i,i,2.*E*S/l)
    K.setValue(i,i-1,-1.*E*S/l)
    K.setValue(i,i+1,-1.*E*S/l)
    M.setValue(i,i,2/3.*rho*S*l)
    M.setValue(i,i-1,1/6.*rho*S*l)
    M.setValue(i,i+1,1/6.*rho*S*l)

Esempio n. 2
0
    # diode R1 current
    dataPlot[k, 3] = y[0]
    # diode R1 voltage
    dataPlot[k, 4] = -lambda_[0]
    # diode F2 voltage
    dataPlot[k, 5] = -lambda_[1]
    # diode F1 current
    dataPlot[k, 6] = lambda_[2]
    k += 1
    aTS.nextStep()

# comparison with reference file
from siconos.kernel import SimpleMatrix, getMatrix
from numpy.linalg import norm

ref = getMatrix(SimpleMatrix("DiodeBridge.ref"))

error = norm(dataPlot[:, 0:6] - ref[:, 0:6])
print("error = ", error)

#assert (error < 1e-09)
withRef = True
if (withPlot):
    #
    # plots
    #
    subplot(411)
    title('inductor voltage')
    plot(dataPlot[0:k - 1, 0], dataPlot[0:k - 1, 1])
    if (withRef):
        plot(ref[0:k - 1, 0], ref[0:k - 1, 1])
Esempio n. 3
0
    dataPlot[k, 0] = s.nextTime()
    dataPlot[k, 1] = q[0]
    dataPlot[k, 2] = v[0]
    dataPlot[k, 3] = p[0]
    dataPlot[k, 4] = lambda_[0]

    k += 1
    s.nextStep()

#
# comparison with the reference file
#
from siconos.kernel import SimpleMatrix, getMatrix
from numpy.linalg import norm

ref = getMatrix(SimpleMatrix("result.ref"))

if (norm(dataPlot - ref) > 1e-12):
    print("Warning. The result is rather different from the reference file.")


#
# plots
#
import matplotlib,os
havedisplay = "DISPLAY" in os.environ
if not havedisplay:
    matplotlib.use('Agg')

import matplotlib.pyplot as plt
plt.subplot(411)
Esempio n. 4
0
def test_bouncing_ball1():

    from siconos.kernel import LagrangianLinearTIDS, NewtonImpactNSL, \
        LagrangianLinearTIR, Interaction, Model, MoreauJeanOSI, TimeDiscretisation, LCP, TimeStepping

    from numpy import array, eye, empty

    t0 = 0       # start time
    T = 10       # end time
    h = 0.005    # time step
    r = 0.1      # ball radius
    g = 9.81     # gravity
    m = 1        # ball mass
    e = 0.9      # restitution coeficient
    theta = 0.5  # theta scheme

    #
    # dynamical system
    #
    x = array([1, 0, 0])  # initial position
    v = array([0, 0, 0])  # initial velocity
    mass = eye(3)         # mass matrix
    mass[2, 2] = 3./5 * r * r

    # the dynamical system
    ball = LagrangianLinearTIDS(x, v, mass)

    # set external forces
    weight = array([-m * g, 0, 0])
    ball.setFExtPtr(weight)

    #
    # Interactions
    #

    # ball-floor
    H = array([[1, 0, 0]])

    nslaw = NewtonImpactNSL(e)
    relation = LagrangianLinearTIR(H)
    inter = Interaction(1, nslaw, relation)

    #
    # Model
    #
    bouncingBall = Model(t0, T)

    # add the dynamical system to the non smooth dynamical system
    bouncingBall.nonSmoothDynamicalSystem().insertDynamicalSystem(ball)

    # link the interaction and the dynamical system
    bouncingBall.nonSmoothDynamicalSystem().link(inter, ball)

    #
    # Simulation
    #

    # (1) OneStepIntegrators
    OSI = MoreauJeanOSI(theta)
    OSI.insertDynamicalSystem(ball)

    # (2) Time discretisation --
    t = TimeDiscretisation(t0, h)

    # (3) one step non smooth problem
    osnspb = LCP()

    # (4) Simulation setup with (1) (2) (3)
    s = TimeStepping(t)
    s.insertIntegrator(OSI)
    s.insertNonSmoothProblem(osnspb)

    # end of model definition

    #
    # computation
    #

    # simulation initialization
    bouncingBall.initialize(s)

    #
    # save and load data from xml and .dat
    #
    try:
        from siconos.io import save
        save(bouncingBall, "bouncingBall.xml")
        save(bouncingBall, "bouncingBall.bin")

    except:
        print("Warning : could not import save from siconos.io")

    # the number of time steps
    N = (T-t0)/h+1

    # Get the values to be plotted
    # ->saved in a matrix dataPlot

    dataPlot = empty((N, 5))

    #
    # numpy pointers on dense Siconos vectors
    #
    q = ball.q()
    v = ball.velocity()
    p = ball.p(1)
    lambda_ = inter.lambda_(1)

    #
    # initial data
    #
    dataPlot[0, 0] = t0
    dataPlot[0, 1] = q[0]
    dataPlot[0, 2] = v[0]
    dataPlot[0, 3] = p[0]
    dataPlot[0, 4] = lambda_[0]

    k = 1

    # time loop
    while(s.hasNextEvent()):
        s.computeOneStep()

        dataPlot[k, 0] = s.nextTime()
        dataPlot[k, 1] = q[0]
        dataPlot[k, 2] = v[0]
        dataPlot[k, 3] = p[0]
        dataPlot[k, 4] = lambda_[0]

        k += 1
        #print(s.nextTime())
        s.nextStep()

    #
    # comparison with the reference file
    #
    from siconos.kernel import SimpleMatrix, getMatrix
    from numpy.linalg import norm

    ref = getMatrix(SimpleMatrix(os.path.join(working_dir, "data/result.ref")))

    assert (norm(dataPlot - ref) < 1e-12)
            index1 = sk.interactions(simulation.indexSet(1))
            if (len(index1) == 4):
                dataPlot[k, 3] = norm(index1[0].lambda_(1)) + \
                norm(index1[1].lambda_(1)) + norm(index1[2].lambda_(1)) + \
                norm(index1[3].lambda_(1))

    k += 1
    simulation.nextStep()

#
# comparison with the reference file
#
from siconos.kernel import SimpleMatrix, getMatrix
from numpy.linalg import norm

ref = getMatrix(SimpleMatrix("result_dynamic.ref"))

print("norm(dataPlot - ref) = {0}".format(norm(dataPlot - ref)))
if (norm(dataPlot - ref) > 1e-11):
    print("Warning. The result is rather different from the reference file.")

#
# plots
#

if do_plot:
    subplot(511)
    title('position')
    plot(dataPlot[0:k, 0], dataPlot[0:k, 1])
    y = ylim()
    plot(ref[0:k, 0], ref[0:k, 1])
Esempio n. 6
0
    TimeDiscretisation, LCP, TimeStepping

from siconos.kernel import SimpleMatrix, getMatrix, SPARSE  #, SPARSE_COORDINATE

print(' -- create mass and stiffness matrix in Siconos -- ')

n_dof = mass_mat_np.shape[0]

print('n_dof=', n_dof)

# M= SimpleMatrix(n_dof,n_dof,SPARSE_COORDINATE,n_dof)
# K= SimpleMatrix(n_dof,n_dof,SPARSE_COORDINATE,n_dof)
#M= SimpleMatrix(n_dof,n_dof,SPARSE,n_dof)
#K= SimpleMatrix(n_dof,n_dof,SPARSE,n_dof)

M = SimpleMatrix(n_dof, n_dof)
K = SimpleMatrix(n_dof, n_dof)

#input()
#nnz=0
# for i in range(n_dof):

#     idx = np.where(stiffness_mat_np[i,:]>=1e-14)
#     for j in idx[0]:
#         K.setValue(i,j,stiffness_mat_np[i,j])

#     idx = np.where(mass_mat_np[i,:]>=1e-14)
#     nnz = nnz + len(idx[0])
#     for j in idx[0]:
#         M.setValue(i,j,mass_mat_np[i,j])
# nnz=0
# Run simulation
sim.run()

# Get data
dataPlot = sim.data()

# Save to disk
savetxt('SMCExampleImplicitOT2-noCplugin-py.dat', dataPlot)
# Plot interesting data
subplot(411)
title('x1')
plot(dataPlot[:, 0], dataPlot[:, 1])
grid()
subplot(412)
title('x2')
plot(dataPlot[:, 0], dataPlot[:, 2])
grid()
subplot(413)
title('u')
plot(dataPlot[:, 0], dataPlot[:, 3])
grid()
savefig('ismcOT2-noCplugin.png')

# compare with the reference
ref = getMatrix(SimpleMatrix("SMCExampleImplicitOT2-py.ref"))
print("%e" % norm(dataPlot - ref))
if (norm(dataPlot - ref) > 1e-12):
    print(dataPlot - ref)
    print("Warning. The result is rather different from the reference file.")
Esempio n. 8
0
    # diode R1 current
    dataPlot[k, 3] = lambda_[0]
    # diode R1 voltage
    dataPlot[k, 4] = -y[0]
    # diode F2 voltage
    dataPlot[k, 5] = -lambda_[1]
    # diode F1 current
    dataPlot[k, 6] = lambda_[2]
    k += 1
    aTS.nextStep()

# comparison with reference file
from siconos.kernel import SimpleMatrix, getMatrix
from numpy.linalg import norm

ref = getMatrix(SimpleMatrix("DiodeBridgeCapFilter.ref"))

error = norm(dataPlot[:, 0:4] - ref[:, 0:4])
print("error = ", error)

assert (error < 1e-09)
withRef = False
if (withPlot):
    #
    # plots
    #
    subplot(411)
    title('inductor voltage')
    plot(dataPlot[0:k - 1, 0], dataPlot[0:k - 1, 1])
    if (withRef):
        plot(ref[0:k - 1, 0], ref[0:k - 1, 1])
Esempio n. 9
0
while s.hasNextEvent():
    s.computeOneStep()

    dataPlot[k, 0] = s.nextTime()
    dataPlot[k, 1] = q[0]
    dataPlot[k, 2] = v[0]
    dataPlot[k, 3] = p[0]
    dataPlot[k, 4] = lambda_[0]

    k += 1
    s.nextStep()

#
# comparison with the reference file
#
ref = getMatrix(SimpleMatrix("BouncingBallTS.ref"))

if (norm(dataPlot - ref) > 1e-12):
    print("Warning. The result is rather different from the reference file.")
    print(norm(dataPlot - ref))

#
# plots
#
havedisplay = "DISPLAY" in os.environ
if not havedisplay:
    matplotlib.use('Agg')

plt.subplot(411)
plt.title('position')
plt.plot(dataPlot[:, 0], dataPlot[:, 1])
Esempio n. 10
0
def test_diode_bridge():
    """Build diode bridge model"""
    # dynamical system
    bridge_ds = FirstOrderLinearDS(init_state, A)
    # interaction
    diode_bridge_relation = FirstOrderLinearTIR(C, B)
    diode_bridge_relation.setDPtr(D)

    nslaw = ComplementarityConditionNSL(4)
    bridge_interaction = Interaction(4, nslaw, diode_bridge_relation, 1)

    # Model
    diode_bridge = Model(t0, total_time, model_title)

    #  add the dynamical system in the non smooth dynamical system
    diode_bridge.nonSmoothDynamicalSystem().insertDynamicalSystem(bridge_ds)

    #   link the interaction and the dynamical system
    diode_bridge.nonSmoothDynamicalSystem().link(bridge_interaction, bridge_ds)

    # Simulation

    # (1) OneStepIntegrators
    theta = 0.5
    integrator = EulerMoreauOSI(theta)
    integrator.insertDynamicalSystem(bridge_ds)

    # (2) Time discretisation
    time_discretisation = TimeDiscretisation(t0, time_step)

    # (3) Non smooth problem
    non_smooth_problem = LCP()

    # (4) Simulation setup with (1) (2) (3)
    bridge_simulation = TimeStepping(time_discretisation, integrator,
                                     non_smooth_problem)

    # simulation initialization
    diode_bridge.initialize(bridge_simulation)
    k = 0
    h = bridge_simulation.timeStep()
    # Number of time steps
    N = (total_time - t0) / h

    # Get the values to be plotted
    # ->saved in a matrix dataPlot
    data_plot = empty([N, 8])

    x = bridge_ds.x()
    print("Initial state : ", x)
    y = bridge_interaction.y(0)
    print("First y : ", y)
    lambda_ = bridge_interaction.lambda_(0)

    # For the initial time step:
    # time
    data_plot[k, 0] = t0

    #  inductor voltage
    data_plot[k, 1] = x[0]

    # inductor current
    data_plot[k, 2] = x[1]

    # diode R1 current
    data_plot[k, 3] = y[0]

    # diode R1 voltage
    data_plot[k, 4] = -lambda_[0]

    # diode F2 voltage
    data_plot[k, 5] = -lambda_[1]

    # diode F1 current
    data_plot[k, 6] = lambda_[2]

    # resistor current
    data_plot[k, 7] = y[0] + lambda_[2]

    k += 1
    while k < N:
        bridge_simulation.computeOneStep()
        #non_smooth_problem.display()
        data_plot[k, 0] = bridge_simulation.nextTime()
        #  inductor voltage
        data_plot[k, 1] = x[0]
        # inductor current
        data_plot[k, 2] = x[1]
        # diode R1 current
        data_plot[k, 3] = y[0]
        # diode R1 voltage
        data_plot[k, 4] = -lambda_[0]
        # diode F2 voltage
        data_plot[k, 5] = -lambda_[1]
        # diode F1 current
        data_plot[k, 6] = lambda_[2]
        # resistor current
        data_plot[k, 7] = y[0] + lambda_[2]
        k += 1
        bridge_simulation.nextStep()

    #
    # comparison with the reference file
    #
    ref = getMatrix(
        SimpleMatrix(os.path.join(working_dir, "data/diode_bridge.ref")))
    assert norm(data_plot - ref) < 1e-12
    return ref, data_plot
Esempio n. 11
0
    #  inductor voltage
    dataPlot[k, 1] = x[0]
    # inductor current
    dataPlot[k, 2] = x[1]
    # diode  voltage
    dataPlot[k, 3] = -y[0]
    # diode  current
    dataPlot[k, 4] = lambda_[0]
    k += 1
    aTS.nextStep()

# comparison with reference file
from siconos.kernel import SimpleMatrix, getMatrix
from numpy.linalg import norm

ref = getMatrix(SimpleMatrix("CircuitRLCD.ref"))

assert (norm(dataPlot - ref) < 1e-10)

if (withPlot):
    #
    # plots
    #
    subplot(411)
    title('inductor voltage')
    plot(dataPlot[0:k - 1, 0], dataPlot[0:k - 1, 1])
    grid()
    subplot(412)
    title('inductor current')
    plot(dataPlot[0:k - 1, 0], dataPlot[0:k - 1, 2])
    grid()
    dataPlot[k, 10] = q[3]
    dataPlot[k, 11] = q[4]
    dataPlot[k, 12] = q[5]
    dataPlot[k, 13] = q[6]
    dataPlot[k, 14] = v[1]
    dataPlot[k, 15] = v[2]
    k = k + 1
    s.nextStep()

savetxt("result-py.dat", dataPlot)
#
# comparison with the reference file
#
from siconos.kernel import SimpleMatrix, getMatrix

ref = getMatrix(SimpleMatrix("resultNETS.ref"))
err = linalg.norm(dataPlot - ref)
print("error w.r.t reference file =", err)

if (err > 1e-12):
    print("Warning. The result is rather different from the reference file.")

#
# plots
#
from matplotlib.pyplot import subplot, title, plot, grid, show

subplot(411)
title('position')
plot(dataPlot[:, 0], dataPlot[:, 1])
grid()