# Rotating motion of floating objects with non-uniform density

Taking inspiration from the front image of the website, I wondered how rigid floating objects with non-uniform density are handled by GPUSPH. Note that at this stage I am NOT interested in a Project Chrono extension.

In particular I would want to model a floating body with a known eccentricity of the centre of mass and known principal moments of inertia. If this object has to be modelled as a set of particles – I imagine --, the mass of these particles should not be the same in order to represent the non-uniform density distribution that gives rise to those eccentricity and moments of inertia.

Furthermore, this floating body will be liable to tumbling and rolling away if put onto a vigorous wave field. Therefore, its position in the global reference system might vary greatly due to considerable rotations. While the principal axes of inertia will follow the object’s motion, the moments of inertia with respect to the global system will vary accordingly.

Which logic procedure, say pseudocode, does GPUSPH implement to model this situation, again prior to thinking of Project Chrono? Thanks a lot for considering this question.

Hello @sph_tudelft_nl

first of all, sorry for the late reply, we’ve been kind of busy with the release of GPUSPH v5 first and the SPHERIC International Workshop next. Now on to the actual answer, starting with some terminology.

GPUSPH differentiates rigid bodies in three categories:

• moving bodies: these are rigid bodies that move; the motion may be prescribed by the user in an arbitrary manner (as it is typically done for pistons, paddles, gates, etc), or it can be derived by some other mean (e.g. via the integration with Chrono);
• compute-forces bodies: these are bodies for which we compute the total force (and torque) that the fluid exerts on the body; this can be used on its own just to compute e.g. the impact of a wave on a pilon even though the pilon itself is never moved;
• “floating” objects: these are moving bodies whose motion is computed (via Chrono, but again it could be any other means) from the forces (and torques) exerted by the fluid on it (so they are both compute-forces and moving).

To keep track of the motion of floating objects we use a local reference frame for the body, with origin in the center of mass of the body, and oriented according to the principal axes of inertia; the rotation of the local system wrt to the global reference system is tracked by the object’s Euler parameters.

Objects (regardless of their nature) are not “fully” discretized. Instead, their discretization follows the standard boundary model discretization (e.g. single-layer boundary for LJ or MK, multiple layers for DYN, etc). These boundary particles are only used to compute the forces (and torques) that the fluid exerts on the object. The resulting forces and torques are then passed to Chrono (after an optional modification that the test case can request, e.g. to model mooring); Chrono computes the object position update (including new center of mass velocity, angular velocity around the center of mass etc), and we reflect these changes on the body’s particles position and velocity during integration. Note that since the body particles are only used to track the boundary and for force feedback, their mass is not related to the actual mass distribution inside the body, but it’s a uniform mass computed from the (average) body density and the chosen particle spacing.

Non-uniform bodies are supported by allowing the user to override the default center of mass position and principal moments of inertia. Note that this does not affect the distribution or mass of the particles used to model the body in GPUSPH, since they are only used to enforce boundary conditions and track the force the fluid exerts on the object.