finesse.components.rigid_body module

Rigid body holding multiple elements sharing the same mechanical DOFs.

class finesse.components.rigid_body.RigidBody(*args, **kwargs)[source]

Bases: Connector

Groups elements into a rigid body so they share one set of mechanical nodes.

A drive on any member’s mech ports moves all of them, and the forces they each generate sum into one equation. The elements added with add_rigid_component() are collected by name in rigid_components.

All components share one sign convention, i.e. the sign of z, pitch, and yaw is the same for all components. Any subsequent optical connections should thus be made between the front of one component and the back of another.

The body has its own static state, phi, xbeta and ybeta. add_rigid_component() makes a component’s phi, xbeta and ybeta relative to the body’s, keeping the value the component had as its offset from the body. For example, a mirror created with phi=5 ends up at body.phi.ref + 5. It also locks them, so the body is moved through its own parameters and dofs, never through a component’s.

Note that this is a building block for future composite components that is currently only accessible via the Python API.

Parameters

namestr

Name of the rigid body.

phifloat, optional

Tuning of the body (in degrees); defaults to 0.0.

xbeta, ybetafloat, optional

Misalignment of the body in yaw and pitch in units of radians; default to 0.0.

Examples

Components must be added to the body before they are added to the model. The rigid body itself may already be in a model:

body = model.add(fc.RigidBody("ITM"))
hr = body.add_rigid_component(fc.Mirror("ITM_hr", T=0.014, L=0, Rc=1938))
ar = body.add_rigid_component(fc.Mirror("ITM_ar", T=1 - 10e-6, L=10e-6))
model.add(hr)
model.add(ar)
# if an optical connection should be made, do it front to back
model.connect(ar.p1, hr.p2)
model.add(fc.FreeMass("ITM_sus", body.mech, mass=40))

Then, for example, a frequency response calculated like:

F_Hz = np.geomspace(1, 1e3, 100)
sol = model.run(fa.FrequencyResponse(F_Hz, [body.mech.F_z], [body.mech.z]))

returns a transfer function moving both the HR and AR surfaces together and where forces on either produces forces on the entire rigid body and thus on the other. A microscopic tuning is set by model.ITM.phi which moves both model.ITM_hr.phi and model.ITM_ar.phi together and not by setting either the HR or AR surfaces directly.

add_rigid_component(element: Connector) → Connector[source]

Make element part of this rigid body by having its mech port use the nodes of mech, and add it to rigid_components.

The static state behind element’s dofs, e.g. a mirror’s phi, xbeta and ybeta, becomes relative to the body’s, keeping its current value as its offset from the body unless it already refers to the body’s. It is then locked, so element only moves with the body.

Must be called before element is added to a model.

Parameters

elementConnector

Element to add to this rigid body.

Returns

Connector

element, so that the call can be passed straight to model.add.

Raises

FinesseException

If element is not a Connector, if this rigid body already has a rigid component with element’s name, if element’s static state is locked, or if its nodes cannot be shared, see Connector._use_signal_nodes_from().

property phi

phi : float, optional Tuning of the body (in degrees); defaults to 0.0.

property xbeta

Yaw misalignment

property ybeta

Pitch misalignment