1#include "RigidWaterCoupling.h"
5#include "Primitive/Primitive3D.h"
9 template<typename TDataType>
10 RigidWaterCoupling<TDataType>::RigidWaterCoupling()
15 template<typename TDataType>
16 RigidWaterCoupling<TDataType>::~RigidWaterCoupling()
20 template<typename TDataType>
21 void RigidWaterCoupling<TDataType>::resetStates()
25 template<typename Coord, typename Triangle>
26 __global__ void C_ComputeForceAndTorque(
29 DArray<Coord> vertices,
30 DArray<Triangle> indices,
31 DArray2D<Real> heights,
38 int tId = threadIdx.x + blockIdx.x * blockDim.x;
39 if (tId >= indices.size()) return;
41 Triangle index_i = indices[tId];
43 Coord v0 = vertices[index_i[0]];
44 Coord v1 = vertices[index_i[1]];
45 Coord v2 = vertices[index_i[2]];
47 Triangle3D triangle(v0, v1, v2);
50 Coord normal_i = (v2 - v0).cross(v1 - v0);
53 Coord triangle_center = (v0 + v1 + v2) / Real(3);
56 Real sea_level = bilinear(heights, (triangle_center.x - origin.x) / spacing, (triangle_center.z - origin.z) / spacing);
57 Real h = triangle_center.y < sea_level ? (sea_level - triangle_center.y) : Real(0);
59 Real pressure = rho * gravity.norm() * h;
61 Coord force_i = pressure * triangle.area() * normal_i;
62 Coord torque_i = -force_i.cross(triangle_center - barycenter);
65 torque[tId] = torque_i;
68 template<typename TDataType>
69 void RigidWaterCoupling<TDataType>::updateStates()
71 Real dt = this->stateTimeStep()->getData();
73 auto vessels = this->getVessels();
74 auto ocean = this->getOcean();
76 auto patch = ocean->getOceanPatch();
78 for (auto mesh : vessels)
80 auto& triangles = mesh->stateEnvelope()->getData();
82 Real mass = mesh->stateMass()->getData();
83 Coord barycenter = mesh->stateBarycenter()->getData();
84 Coord velocity = mesh->stateVelocity()->getData();
85 Coord angular_velocity = mesh->stateAngularVelocity()->getData();
86 Matrix inertia = mesh->stateInertia()->getData();
88 Coord gravity = mesh->varGravity()->getData();
90 auto& vertices = triangles.getPoints();
91 auto& indices = triangles.getTriangles();
93 uint num = indices.size();
95 if (mForce.size() != num) {
100 auto heights = patch->stateHeightField()->getDataPtr();
101 auto& displacements = heights->calculateHeightField();
102 Coord origin = heights->getOrigin();
103 Real h = heights->getGridSpacing();
106 C_ComputeForceAndTorque,
118 Coord F_total = mReduce.accumulate(mForce.begin(), mForce.size());
119 Coord T_total = mReduce.accumulate(mTorque.begin(), mTorque.size());
121 velocity += dt * F_total / mass;
122 angular_velocity += dt * inertia.inverse() * T_total;
124 velocity *= this->varDamping()->getValue();
125 angular_velocity *= this->varRotationalDamping()->getValue();
127 mesh->stateVelocity()->setValue(velocity);
128 mesh->stateAngularVelocity()->setValue(angular_velocity);
132 DEFINE_CLASS(RigidWaterCoupling);