    

 ## On this page

  

 

 # rocky\_api\_functions

 Last update: 17.07.2025 

<a id="l00001" name="l00001"></a> 1\#pragma once

<a id="l00002" name="l00002"></a> 2 

<a id="l00003" name="l00003"></a> 3// Includes =======================================================================================

<a id="l00004" name="l00004"></a> 4\#include "dll\_export.h"

<a id="l00005" name="l00005"></a> 5 

<a id="l00006" name="l00006"></a> 6\#include "rocky\_boundary\_api.hpp"

<a id="l00007" name="l00007"></a> 7 

<a id="l00008" name="l00008"></a> 8// Forward declarations ===========================================================================

<a id="l00009" name="l00009"></a> 9class [IRockyPluginData](classIRockyPluginData.xhtml);

<a id="l00010" name="l00010"></a> 10struct [IRockyModel](structIRockyModel.xhtml);

<a id="l00011" name="l00011"></a> 11struct [IRockyDeviceModel](structIRockyDeviceModel.xhtml);

<a id="l00012" name="l00012"></a> 12struct [IRockyContact](structIRockyContact.xhtml);

<a id="l00013" name="l00013"></a> 13struct [IRockyParticle](structIRockyParticle.xhtml);

<a id="l00014" name="l00014"></a> 14struct [IRockyParticleHost](structIRockyParticleHost.xhtml);

<a id="l00015" name="l00015"></a> 15struct [IRockyBreakableParticle](structIRockyBreakableParticle.xhtml);

<a id="l00016" name="l00016"></a> 16struct [IRockyJoint](structIRockyJoint.xhtml);

<a id="l00017" name="l00017"></a> 17 

<a id="l00018" name="l00018"></a> 18class [IRockyTimestepData](classIRockyTimestepData.xhtml);

<a id="l00019" name="l00019"></a> 19class [IRockyAdhesiveDistanceData](classIRockyAdhesiveDistanceData.xhtml);

<a id="l00020" name="l00020"></a> 20struct IRockyTimeCurveData;

<a id="l00021" name="l00021"></a> 21struct [IRockyAdhesionOutputData](structIRockyAdhesionOutputData.xhtml);

<a id="l00022" name="l00022"></a> 22struct IRockyJointOutputData;

<a id="l00023" name="l00023"></a> 23struct [IRockyGeometriesMotionData](structIRockyGeometriesMotionData.xhtml);

<a id="l00024" name="l00024"></a> 24struct [IRockyOutputPropertyCollection](structIRockyOutputPropertyCollection.xhtml);

<a id="l00025" name="l00025"></a> 25 

<a id="l00026" name="l00026"></a> 26// Functions Prototypes ===========================================================================

<a id="l00027" name="l00027"></a> 27\#ifdef \_\_linux\_\_

<a id="l00028" name="l00028"></a> 28\#define \_\_stdcall

<a id="l00029" name="l00029"></a> 29\#endif

<a id="l00030" name="l00030"></a> 30 

<a id="l00031" name="l00031"></a> 31typedef void(__stdcall *configure_f_type)([IRockyPluginData](classIRockyPluginData.xhtml) &amp;_input, void *&amp;data);

<a id="l00032" name="l00032"></a> 32 

<a id="l00033" name="l00033"></a> 33// Setup/Tear Down

<a id="l00034" name="l00034"></a> 34typedef void(__stdcall *initialize_f_type)([IRockyModel](structIRockyModel.xhtml) &amp;model, void *data);

<a id="l00035" name="l00035"></a> 35 

<a id="l00036" name="l00036"></a> 36typedef void(__stdcall *tear_down_f_type)(const [IRockyModel](structIRockyModel.xhtml) &amp;model, void *data);

<a id="l00037" name="l00037"></a> 37 

<a id="l00038" name="l00038"></a> 38typedef void(__stdcall *setup_f_type)([IRockyModel](structIRockyModel.xhtml) &amp;model, void *data);

<a id="l00039" name="l00039"></a> 39 

<a id="l00040" name="l00040"></a> 40typedef double(__stdcall *compute_timestep_f_type)(const [IRockyTimestepData](classIRockyTimestepData.xhtml) &amp;timestep_data, void *data);

<a id="l00041" name="l00041"></a> 41 

<a id="l00042" name="l00042"></a> 42typedef double(__stdcall *compute_adhesive_distances_f_type)([IRockyAdhesiveDistanceData](classIRockyAdhesiveDistanceData.xhtml) &amp;adhesive_distance_data, void *data);

<a id="l00043" name="l00043"></a> 43 

<a id="l00044" name="l00044"></a> 44typedef void(__stdcall *non_dimensionalize_f_type)([IRockyModel](structIRockyModel.xhtml) &amp;model, void *data);

<a id="l00045" name="l00045"></a> 45 

<a id="l00046" name="l00046"></a> 46typedef void(__stdcall *initialize_cuda_f_type)(const [IRockyModel](structIRockyModel.xhtml) &amp;model, void *host_data, int device_id, void *&amp;device_data);

<a id="l00047" name="l00047"></a> 47 

<a id="l00048" name="l00048"></a> 48typedef void(__stdcall *tear_down_cuda_f_type)(const [IRockyModel](structIRockyModel.xhtml) &amp;model, int device_id, void *device_data);

<a id="l00049" name="l00049"></a> 49 

<a id="l00050" name="l00050"></a> 50typedef void(__stdcall *sync_cuda_data_f_type)(const [IRockyModel](structIRockyModel.xhtml) &amp;model, void *host_data, int device_id, void *device_data);

<a id="l00051" name="l00051"></a> 51 

<a id="l00052" name="l00052"></a> 52typedef void(__stdcall* initialize_particle_f_type)(const [IRockyModel](structIRockyModel.xhtml)&amp; model, [IRockyParticleHost](structIRockyParticleHost.xhtml)&amp; particle, void* data);

<a id="l00053" name="l00053"></a> 53 

<a id="l00054" name="l00054"></a> 54typedef void(__stdcall* initialize_triangle_f_type)(const [IRockyModel](structIRockyModel.xhtml)&amp; model, [IRockyGeometryTriangleHost](structIRockyGeometryTriangleHost.xhtml)&amp; triangle, void* data);

<a id="l00055" name="l00055"></a> 55 

<a id="l00056" name="l00056"></a> 56typedef void(__stdcall *initialize_breakage_f_type)(const [IRockyBreakableParticle](structIRockyBreakableParticle.xhtml)&amp; breakable_particle, void* data);

<a id="l00057" name="l00057"></a> 57 

<a id="l00058" name="l00058"></a> 58typedef void(__stdcall* setup_output_properties_f_type)(const [IRockyModel](structIRockyModel.xhtml)&amp; model, [IRockyOutputPropertyCollection](structIRockyOutputPropertyCollection.xhtml)&amp; output_property_collection, void* data);

<a id="l00059" name="l00059"></a> 59 

<a id="l00060" name="l00060"></a> 60typedef bool(__stdcall *is_valid_f_type)(const [IRockyModel](structIRockyModel.xhtml) &amp;model, void *data);

<a id="l00061" name="l00061"></a> 61 

<a id="l00062" name="l00062"></a> 62 

<a id="l00063" name="l00063"></a> 63// Output

<a id="l00064" name="l00064"></a> 64typedef void(__stdcall *output_f_type)(const [IRockyModel](structIRockyModel.xhtml) &amp;model, void *data);

<a id="l00065" name="l00065"></a> 65 

<a id="l00066" name="l00066"></a> 66typedef double(__stdcall* output_particles_f_type)(const [IRockyModel](structIRockyModel.xhtml)&amp; model, const [IRockyParticleHost](structIRockyParticleHost.xhtml)&amp; particle, int property_id, void* data);

<a id="l00067" name="l00067"></a> 67 

<a id="l00068" name="l00068"></a> 68typedef double(__stdcall* output_triangles_f_type)(const [IRockyModel](structIRockyModel.xhtml)&amp; model, const [IRockyGeometryTriangleHost](structIRockyGeometryTriangleHost.xhtml)&amp; triangle, int property_id, void* data);

<a id="l00069" name="l00069"></a> 69 

<a id="l00070" name="l00070"></a> 70// Contacts

<a id="l00071" name="l00071"></a> 71typedef void(__stdcall *contacts_f_type)([IRockyDeviceModel](structIRockyDeviceModel.xhtml) &amp;model, [IRockyContact](structIRockyContact.xhtml) &amp;contact, void *data);

<a id="l00072" name="l00072"></a> 72 

<a id="l00073" name="l00073"></a> 73typedef void(__stdcall* cuda_contacts_kernel_f_type)([IRockyModel](structIRockyModel.xhtml)&amp; model, void** plugin_devices_data);

<a id="l00074" name="l00074"></a> 74 

<a id="l00075" name="l00075"></a> 75typedef void(__stdcall *triangle_wear_f_type)([IRockyContact](structIRockyContact.xhtml)&amp; contact, double&amp; wear_volume, void* data);

<a id="l00076" name="l00076"></a> 76 

<a id="l00077" name="l00077"></a> 77typedef void(__stdcall* cuda_triangle_wear_kernel_f_type)([IRockyModel](structIRockyModel.xhtml)&amp; model, void* data);

<a id="l00078" name="l00078"></a> 78 

<a id="l00079" name="l00079"></a> 79// Adhesion

<a id="l00080" name="l00080"></a> 80 

<a id="l00081" name="l00081"></a> 81typedef void(__stdcall* adhesion_forces_f_type)([IRockyContact](structIRockyContact.xhtml)&amp; contact, [IRockyAdhesionOutputData](structIRockyAdhesionOutputData.xhtml)&amp; output_data, void* data);

<a id="l00082" name="l00082"></a> 82 

<a id="l00083" name="l00083"></a> 83typedef void(__stdcall* cuda_adhesion_forces_kernel_f_type)([IRockyModel](structIRockyModel.xhtml)&amp; model, void** plugin_devices_data);

<a id="l00084" name="l00084"></a> 84 

<a id="l00085" name="l00085"></a> 85// Particles

<a id="l00086" name="l00086"></a> 86typedef void(__stdcall *particles_f_type)([IRockyDeviceModel](structIRockyDeviceModel.xhtml) &amp;model, [IRockyParticle](structIRockyParticle.xhtml) &amp;particle, void *data);

<a id="l00087" name="l00087"></a> 87 

<a id="l00088" name="l00088"></a> 88typedef void(__stdcall *cuda_particles_kernel_f_type)([IRockyModel](structIRockyModel.xhtml) &amp;model, void **plugin_devices_data);

<a id="l00089" name="l00089"></a> 89 

<a id="l00090" name="l00090"></a> 90// Triangles

<a id="l00091" name="l00091"></a> 91typedef void(__stdcall* triangles_f_type)([IRockyDeviceModel](structIRockyDeviceModel.xhtml)&amp; model, [IRockyBoundaryTriangle](structIRockyGeometryTriangle.xhtml)&amp; triangle, void* data);

<a id="l00092" name="l00092"></a> 92 

<a id="l00093" name="l00093"></a> 93typedef void(__stdcall* cuda_triangles_kernel_f_type)([IRockyModel](structIRockyModel.xhtml)&amp; model, void** plugin_devices_data);

<a id="l00094" name="l00094"></a> 94 

<a id="l00095" name="l00095"></a> 95// Instantaneous breakage

<a id="l00096" name="l00096"></a> 96typedef void(__stdcall* instantaneous_breakage_f_type)([IRockyParticle](structIRockyParticle.xhtml)&amp; particle, bool&amp; broken, void* data);

<a id="l00097" name="l00097"></a> 97 

<a id="l00098" name="l00098"></a> 98typedef void(__stdcall* cuda_instantaneous_breakage_kernel_f_type)([IRockyModel](structIRockyModel.xhtml)&amp; model, void** plugin_devices_data);

<a id="l00099" name="l00099"></a> 99 

<a id="l00100" name="l00100"></a> 100typedef void(__stdcall* fragments_distribution_f_type)([IRockyBreakableParticle](structIRockyBreakableParticle.xhtml)&amp; particle, std::vector&lt;double&gt;&amp; distribution, void* data);

<a id="l00101" name="l00101"></a> 101 

<a id="l00102" name="l00102"></a> 102// Joints

<a id="l00103" name="l00103"></a> 103typedef void(__stdcall *joints_f_type)([IRockyDeviceModel](structIRockyDeviceModel.xhtml) &amp;model, [IRockyJoint](structIRockyJoint.xhtml) &amp;joint, void *data);

<a id="l00104" name="l00104"></a> 104 

<a id="l00105" name="l00105"></a> 105typedef void(__stdcall *cuda_joints_kernel_f_type)([IRockyModel](structIRockyModel.xhtml) &amp;model, void **plugin_devices_data);

<a id="l00106" name="l00106"></a> 106 

<a id="l00107" name="l00107"></a> 107typedef void(__stdcall *joint_forces_f_type)([IRockyJoint](structIRockyJoint.xhtml) &amp;joint, IRockyJointOutputData&amp; output_data, void *data);

<a id="l00108" name="l00108"></a> 108 

<a id="l00109" name="l00109"></a> 109typedef void(__stdcall *cuda_joint_forces_kernel_f_type)([IRockyModel](structIRockyModel.xhtml) &amp;model, void **plugin_devices_data);

<a id="l00110" name="l00110"></a> 110 

<a id="l00111" name="l00111"></a> 111// Joint breakage

<a id="l00112" name="l00112"></a> 112typedef void(__stdcall* joint_breakage_f_type)([IRockyJoint](structIRockyJoint.xhtml) &amp;joint, bool &amp;broken, void *data);

<a id="l00113" name="l00113"></a> 113 

<a id="l00114" name="l00114"></a> 114typedef void(__stdcall* cuda_joint_breakage_kernel_f_type)([IRockyModel](structIRockyModel.xhtml) &amp;model, void **plugin_devices_data);

<a id="l00115" name="l00115"></a> 115 

<a id="l00116" name="l00116"></a> 116// Geometry motion

<a id="l00117" name="l00117"></a> 117typedef void(__stdcall *geometries_motion_f_type)([IRockyModel](structIRockyModel.xhtml) &amp;model, [IRockyGeometriesMotionData](structIRockyGeometriesMotionData.xhtml) &amp;motion, void *data);

<a id="l00118" name="l00118"></a> 118 

<a id="l00119" name="l00119"></a> 119// Extra macros for Frictional Contact Forces ------------------------------------------------------

<a id="l00120" name="l00120"></a> 120\#include "rocky\_api\_contact\_functions.h"

<a id="l00121" name="l00121"></a> 121 

<a id="l00122" name="l00122"></a> 122// Special Functor that wraps a function pointer

<a id="l00123" name="l00123"></a> 123template &lt;typename Function&gt;

<a id="l00124" name="l00124"></a> 124struct Function2Functor

<a id="l00125" name="l00125"></a> 125{

<a id="l00126" name="l00126"></a> 126 template &lt;typename... Args&gt;

<a id="l00127" name="l00127"></a> 127 void operator()(Args&amp;... args)

<a id="l00128" name="l00128"></a> 128 {

<a id="l00129" name="l00129"></a> 129 (*this-&gt;function)(args...);

<a id="l00130" name="l00130"></a> 130 }

<a id="l00131" name="l00131"></a> 131 Function function;

<a id="l00132" name="l00132"></a> 132};

<a id="l00133" name="l00133"></a> 133 

<a id="l00134" name="l00134"></a> 134// UDF =============================================================================================

<a id="l00135" name="l00135"></a> 135\#define ROCKY\_PLUGIN(plugin\_name, plugin\_version) \\

<a id="l00136" name="l00136"></a> 136 ROCKY\_PLUGIN\_INFO(plugin\_name, plugin\_version) extern "C" {

<a id="l00137" name="l00137"></a> 137 

<a id="l00138" name="l00138"></a> 138\#define ROCKY\_PLUGIN\_END \\

<a id="l00139" name="l00139"></a> 139 ROCKY\_PLUGIN\_FINISH\_CONTACT\_MODEL\_FUNCTIONS\_SETUP() }

<a id="l00140" name="l00140"></a> 140 

<a id="l00141" name="l00141"></a> 141// Initialization ---------------------------------------------------------------------------------

<a id="l00142" name="l00142"></a> 142\#define ROCKY\_PLUGIN\_CONFIGURE(input\_data, data) \\

<a id="l00143" name="l00143"></a> 143 ROCKYAPI\_EXPORT void configure(const IRockyPluginData &amp;input\_data, void \*&amp;data)

<a id="l00144" name="l00144"></a> 144 

<a id="l00145" name="l00145"></a> 145\#define ROCKY\_PLUGIN\_NON\_DIMENSIONALIZE(model, data) \\

<a id="l00146" name="l00146"></a> 146 extern "C" ROCKYAPI\_EXPORT void non\_dimensionalize(IRockyModel &amp;model, void \*data)

<a id="l00147" name="l00147"></a> 147 

<a id="l00148" name="l00148"></a> 148\#define ROCKY\_PLUGIN\_INITIALIZE(model, data) \\

<a id="l00149" name="l00149"></a> 149 extern "C" ROCKYAPI\_EXPORT void initialize(IRockyModel &amp;model, void \*data)

<a id="l00150" name="l00150"></a> 150 

<a id="l00151" name="l00151"></a> 151\#define ROCKY\_PLUGIN\_TEAR\_DOWN(model, data) \\

<a id="l00152" name="l00152"></a> 152 extern "C" ROCKYAPI\_EXPORT void finish(const IRockyModel &amp;model, void \*data)

<a id="l00153" name="l00153"></a> 153 

<a id="l00154" name="l00154"></a> 154\#define ROCKY\_PLUGIN\_SETUP(model, data) \\

<a id="l00155" name="l00155"></a> 155 extern "C" ROCKYAPI\_EXPORT void setup(IRockyModel &amp;model, void \*data)

<a id="l00156" name="l00156"></a> 156 

<a id="l00157" name="l00157"></a> 157\#define ROCKY\_PLUGIN\_COMPUTE\_TIMESTEP(timestep\_data, data) \\

<a id="l00158" name="l00158"></a> 158 extern "C" ROCKYAPI\_EXPORT double compute\_timestep(const IRockyTimestepData &amp;timestep\_data, void \*data)

<a id="l00159" name="l00159"></a> 159 

<a id="l00160" name="l00160"></a> 160\#define ROCKY\_PLUGIN\_IS\_VALID(model, data) \\

<a id="l00161" name="l00161"></a> 161 extern "C" ROCKYAPI\_EXPORT bool is\_valid(const IRockyModel &amp;model, void \*data)

<a id="l00162" name="l00162"></a> 162 

<a id="l00163" name="l00163"></a> 163\#ifdef \_MSC\_VER

<a id="l00164" name="l00164"></a> 164 #define \_STR(x) #x

<a id="l00165" name="l00165"></a> 165 #define STR(x) \_STR(x)

<a id="l00166" name="l00166"></a> 166 #define DO\_PRAGMA\_(x) \_\_pragma (message(\_\_FILE\_\_ "(" STR(\_\_LINE\_\_) ") warning: " x))

<a id="l00167" name="l00167"></a> 167 #define DEPRECATED\_WARNING(message) DO\_PRAGMA\_(message)

<a id="l00168" name="l00168"></a> 168\#else

<a id="l00169" name="l00169"></a> 169 #define DO\_PRAGMA\_(x) \_Pragma (#x)

<a id="l00170" name="l00170"></a> 170 #define DEPRECATED\_WARNING(message) DO\_PRAGMA\_(GCC warning #message)

<a id="l00171" name="l00171"></a> 171\#endif

<a id="l00172" name="l00172"></a> 172 

<a id="l00173" name="l00173"></a> 173\#define ROCKY\_PLUGIN\_COMPUTE\_ADHESIVE\_DISTANCES(adhesive\_distance\_data, data) \\

<a id="l00174" name="l00174"></a> 174 extern "C" ROCKYAPI\_EXPORT \\

<a id="l00175" name="l00175"></a> 175 DEPRECATED\_WARNING("'ROCKY\_PLUGIN\_COMPUTE\_ADHESIVE\_DISTANCES' hook is deprecated. Now you can set adhesive distances in ROCKY\_PLUGIN\_INITIALIZE or ROCKY\_PLUGIN\_BEGIN\_ITERATION") \\

<a id="l00176" name="l00176"></a> 176 void compute\_adhesive\_distances(IRockyAdhesiveDistanceData &amp;adhesive\_distance\_data, void \*data)

<a id="l00177" name="l00177"></a> 177 

<a id="l00178" name="l00178"></a> 178\#define ROCKY\_PLUGIN\_INITIALIZE\_CUDA(model, host\_data, device\_id, device\_data) \\

<a id="l00179" name="l00179"></a> 179 extern "C" ROCKYAPI\_EXPORT void initialize\_cuda( \\

<a id="l00180" name="l00180"></a> 180 const IRockyModel &amp;model, void \*host\_data, int device\_id, void \*&amp;device\_data)

<a id="l00181" name="l00181"></a> 181 

<a id="l00182" name="l00182"></a> 182\#define ROCKY\_PLUGIN\_TEAR\_DOWN\_CUDA(model, device\_id, device\_data) \\

<a id="l00183" name="l00183"></a> 183 extern "C" ROCKYAPI\_EXPORT void finish\_cuda(const IRockyModel &amp;model, int device\_id, void \*device\_data)

<a id="l00184" name="l00184"></a> 184 

<a id="l00185" name="l00185"></a> 185\#define ROCKY\_PLUGIN\_INITIALIZE\_PARTICLE(model, particle, data) \\

<a id="l00186" name="l00186"></a> 186 extern "C" ROCKYAPI\_EXPORT void initialize\_particle( \\

<a id="l00187" name="l00187"></a> 187 IRockyModel&amp; model, IRockyParticleHost&amp; particle, void\* data)

<a id="l00188" name="l00188"></a> 188 

<a id="l00189" name="l00189"></a> 189\#define ROCKY\_PLUGIN\_INITIALIZE\_TRIANGLE(model, triangle, data) \\

<a id="l00190" name="l00190"></a> 190 extern "C" ROCKYAPI\_EXPORT void initialize\_triangle( \\

<a id="l00191" name="l00191"></a> 191 IRockyModel&amp; model, IRockyGeometryTriangleHost&amp; triangle, void\* data)

<a id="l00192" name="l00192"></a> 192 

<a id="l00193" name="l00193"></a> 193\#define ROCKY\_PLUGIN\_INITIALIZE\_INSTANTANEOUS\_BREAKAGE(breakable\_particle, data)\\

<a id="l00194" name="l00194"></a> 194 extern "C" ROCKYAPI\_EXPORT void initialize\_breakage( \\

<a id="l00195" name="l00195"></a> 195 IRockyBreakableParticle&amp; breakable\_particle, void\* data)

<a id="l00196" name="l00196"></a> 196 

<a id="l00197" name="l00197"></a> 197\#define ROCKY\_PLUGIN\_INITIALIZE\_FRAGMENTS\_SIZE\_DISTRIBUTION(breakable\_particle, data) \\

<a id="l00198" name="l00198"></a> 198 extern "C" ROCKYAPI\_EXPORT void initialize\_size\_distribution( \\

<a id="l00199" name="l00199"></a> 199 IRockyBreakableParticle&amp; breakable\_particle, void\* data)

<a id="l00200" name="l00200"></a> 200 

<a id="l00201" name="l00201"></a> 201\#define ROCKY\_PLUGIN\_SETUP\_OUTPUT\_PROPERTIES(model, output\_property\_collection, data) \\

<a id="l00202" name="l00202"></a> 202 extern "C" ROCKYAPI\_EXPORT void setup\_output\_properties( \\

<a id="l00203" name="l00203"></a> 203 const IRockyModel&amp; model, IRockyOutputPropertyCollection&amp; output\_property\_collection, void\* data)

<a id="l00204" name="l00204"></a> 204 

<a id="l00205" name="l00205"></a> 205// Iteration ---------------------------------------------------------------------------------------

<a id="l00206" name="l00206"></a> 206\#define ROCKY\_PLUGIN\_BEGIN\_ITERATION\_CUDA(model, host\_data, device\_id, device\_data) \\

<a id="l00207" name="l00207"></a> 207 extern "C" ROCKYAPI\_EXPORT void begin\_iteration\_cuda( \\

<a id="l00208" name="l00208"></a> 208 const IRockyModel &amp;model, void \*host\_data, int device\_id, void \*&amp;device\_data)

<a id="l00209" name="l00209"></a> 209 

<a id="l00210" name="l00210"></a> 210\#define ROCKY\_PLUGIN\_BEGIN\_ITERATION(model, data) \\

<a id="l00211" name="l00211"></a> 211 extern "C" ROCKYAPI\_EXPORT void begin\_iteration(IRockyModel &amp;model, void \*data)

<a id="l00212" name="l00212"></a> 212 

<a id="l00213" name="l00213"></a> 213\#define ROCKY\_PLUGIN\_END\_ITERATION\_CUDA(model, host\_data, device\_id, device\_data) \\

<a id="l00214" name="l00214"></a> 214 extern "C" ROCKYAPI\_EXPORT void end\_iteration\_cuda( \\

<a id="l00215" name="l00215"></a> 215 const IRockyModel &amp;model, void \*host\_data, int device\_id, void \*&amp;device\_data)

<a id="l00216" name="l00216"></a> 216 

<a id="l00217" name="l00217"></a> 217\#define ROCKY\_PLUGIN\_END\_ITERATION(model, data) \\

<a id="l00218" name="l00218"></a> 218 extern "C" ROCKYAPI\_EXPORT void end\_iteration(IRockyModel &amp;model, void \*data)

<a id="l00219" name="l00219"></a> 219 

<a id="l00220" name="l00220"></a> 220// Output ------------------------------------------------------------------------------------------

<a id="l00221" name="l00221"></a> 221\#define ROCKY\_PLUGIN\_PRE\_OUTPUT\_CUDA\_SYNC\_DATA(model, host\_data, device\_id, device\_data) \\

<a id="l00222" name="l00222"></a> 222 extern "C" ROCKYAPI\_EXPORT void pre\_output\_cuda\_sync\_data( \\

<a id="l00223" name="l00223"></a> 223 const IRockyModel&amp; model, void\* host\_data, int device\_id, void\* device\_data)

<a id="l00224" name="l00224"></a> 224 

<a id="l00225" name="l00225"></a> 225\#define ROCKY\_PLUGIN\_PRE\_OUTPUT(model, data) \\

<a id="l00226" name="l00226"></a> 226 extern "C" ROCKYAPI\_EXPORT void pre\_output(const IRockyModel&amp; model, void\* data)

<a id="l00227" name="l00227"></a> 227 

<a id="l00228" name="l00228"></a> 228\#define ROCKY\_PLUGIN\_PRE\_OUTPUT\_ON\_CONTACTS(device\_model, contact, data) \\

<a id="l00229" name="l00229"></a> 229 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS void pre\_output\_on\_active\_contacts( \\

<a id="l00230" name="l00230"></a> 230 IRockyDeviceModel &amp;device\_model, IRockyContact &amp;contact, void \*data) {

<a id="l00231" name="l00231"></a> 231 

<a id="l00232" name="l00232"></a> 232\#ifndef ROCKY\_CUDA\_API

<a id="l00233" name="l00233"></a> 233\#define ROCKY\_PLUGIN\_PRE\_OUTPUT\_ON\_CONTACTS\_END() }

<a id="l00234" name="l00234"></a> 234\#endif

<a id="l00235" name="l00235"></a> 235 

<a id="l00236" name="l00236"></a> 236\#define ROCKY\_PLUGIN\_OUTPUT\_PARTICLE\_PROPERTY(model, particle, property\_id, data) \\

<a id="l00237" name="l00237"></a> 237 extern "C" ROCKYAPI\_EXPORT double output\_particle\_property( \\

<a id="l00238" name="l00238"></a> 238 const IRockyModel&amp; model, IRockyParticleHost&amp; particle, int property\_id, void\* data) 

<a id="l00239" name="l00239"></a> 239 

<a id="l00240" name="l00240"></a> 240\#define ROCKY\_PLUGIN\_OUTPUT\_TRIANGLE\_PROPERTY(model, triangle, property\_id, data) \\

<a id="l00241" name="l00241"></a> 241 extern "C" ROCKYAPI\_EXPORT double output\_triangle\_property( \\

<a id="l00242" name="l00242"></a> 242 const IRockyModel&amp; model, IRockyGeometryTriangleHost&amp; triangle, int property\_id, void\* data) 

<a id="l00243" name="l00243"></a> 243 

<a id="l00244" name="l00244"></a> 244\#define ROCKY\_PLUGIN\_POST\_OUTPUT(model, data) \\

<a id="l00245" name="l00245"></a> 245 extern "C" ROCKYAPI\_EXPORT void post\_output(const IRockyModel&amp; model, void\* data)

<a id="l00246" name="l00246"></a> 246 

<a id="l00247" name="l00247"></a> 247// Search ------------------------------------------------------------------------------------------

<a id="l00248" name="l00248"></a> 248\#define ROCKY\_PLUGIN\_PRE\_SEARCH\_ON\_PARTICLES(device\_model, particle, data) \\

<a id="l00249" name="l00249"></a> 249 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS void pre\_search\_on\_particles( \\

<a id="l00250" name="l00250"></a> 250 IRockyDeviceModel &amp;device\_model, IRockyParticle &amp;particle, void \*data) {

<a id="l00251" name="l00251"></a> 251 

<a id="l00252" name="l00252"></a> 252\#ifndef ROCKY\_CUDA\_API

<a id="l00253" name="l00253"></a> 253\#define ROCKY\_PLUGIN\_PRE\_SEARCH\_ON\_PARTICLES\_END() }

<a id="l00254" name="l00254"></a> 254\#endif

<a id="l00255" name="l00255"></a> 255 

<a id="l00256" name="l00256"></a> 256// Force -------------------------------------------------------------------------------------------

<a id="l00257" name="l00257"></a> 257\#define ROCKY\_PLUGIN\_PRE\_FORCE\_ON\_CONTACTS(device\_model, contact, data) \\

<a id="l00258" name="l00258"></a> 258 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS void pre\_force\_on\_contacts( \\

<a id="l00259" name="l00259"></a> 259 IRockyDeviceModel &amp;device\_model, IRockyContact &amp;contact, void \*data) {

<a id="l00260" name="l00260"></a> 260 

<a id="l00261" name="l00261"></a> 261\#ifndef ROCKY\_CUDA\_API

<a id="l00262" name="l00262"></a> 262\#define ROCKY\_PLUGIN\_PRE\_FORCE\_ON\_CONTACTS\_END() }

<a id="l00263" name="l00263"></a> 263\#endif

<a id="l00264" name="l00264"></a> 264 

<a id="l00265" name="l00265"></a> 265\#define ROCKY\_PLUGIN\_PRE\_FORCE\_ON\_PARTICLES(device\_model, particle, data) \\

<a id="l00266" name="l00266"></a> 266 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS void pre\_force\_on\_particles( \\

<a id="l00267" name="l00267"></a> 267 IRockyDeviceModel &amp;device\_model, IRockyParticle &amp;particle, void \*data) {

<a id="l00268" name="l00268"></a> 268 

<a id="l00269" name="l00269"></a> 269\#ifndef ROCKY\_CUDA\_API

<a id="l00270" name="l00270"></a> 270\#define ROCKY\_PLUGIN\_PRE\_FORCE\_ON\_PARTICLES\_END() }

<a id="l00271" name="l00271"></a> 271\#endif

<a id="l00272" name="l00272"></a> 272 

<a id="l00273" name="l00273"></a> 273\#define ROCKY\_PLUGIN\_PRE\_FORCE\_ON\_TRIANGLES(device\_model, triangle, data) \\

<a id="l00274" name="l00274"></a> 274 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS void pre\_force\_on\_triangles( \\

<a id="l00275" name="l00275"></a> 275 IRockyDeviceModel &amp;device\_model, IRockyBoundaryTriangle &amp;triangle, void \*data) {

<a id="l00276" name="l00276"></a> 276 

<a id="l00277" name="l00277"></a> 277\#ifndef ROCKY\_CUDA\_API

<a id="l00278" name="l00278"></a> 278\#define ROCKY\_PLUGIN\_PRE\_FORCE\_ON\_TRIANGLES\_END() }

<a id="l00279" name="l00279"></a> 279\#endif

<a id="l00280" name="l00280"></a> 280 

<a id="l00281" name="l00281"></a> 281\#define ROCKY\_PLUGIN\_PRE\_FORCE\_ON\_JOINTS(device\_model, joint, data) \\

<a id="l00282" name="l00282"></a> 282 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS void pre\_force\_on\_joints( \\

<a id="l00283" name="l00283"></a> 283 IRockyDeviceModel &amp;device\_model, IRockyJoint &amp;joint, void \*data) {

<a id="l00284" name="l00284"></a> 284 

<a id="l00285" name="l00285"></a> 285\#ifndef ROCKY\_CUDA\_API

<a id="l00286" name="l00286"></a> 286\#define ROCKY\_PLUGIN\_PRE\_FORCE\_ON\_JOINTS\_END() }

<a id="l00287" name="l00287"></a> 287\#endif

<a id="l00288" name="l00288"></a> 288 

<a id="l00289" name="l00289"></a> 289\#define ROCKY\_PLUGIN\_POST\_FORCE\_ON\_CONTACTS(device\_model, contact, data) \\

<a id="l00290" name="l00290"></a> 290 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS void post\_force\_on\_contacts( \\

<a id="l00291" name="l00291"></a> 291 IRockyDeviceModel &amp;device\_model, IRockyContact &amp;contact, void \*data) {

<a id="l00292" name="l00292"></a> 292 

<a id="l00293" name="l00293"></a> 293\#ifndef ROCKY\_CUDA\_API

<a id="l00294" name="l00294"></a> 294\#define ROCKY\_PLUGIN\_POST\_FORCE\_ON\_CONTACTS\_END() }

<a id="l00295" name="l00295"></a> 295\#endif

<a id="l00296" name="l00296"></a> 296 

<a id="l00297" name="l00297"></a> 297\#define ROCKY\_PLUGIN\_POST\_FORCE\_ON\_FINISHED\_CONTACTS(device\_model, contact, data) \\

<a id="l00298" name="l00298"></a> 298 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS void post\_force\_on\_finished\_contacts( \\

<a id="l00299" name="l00299"></a> 299 IRockyDeviceModel &amp;device\_model, IRockyContact &amp;contact, void \*data) {

<a id="l00300" name="l00300"></a> 300 

<a id="l00301" name="l00301"></a> 301\#ifndef ROCKY\_CUDA\_API

<a id="l00302" name="l00302"></a> 302\#define ROCKY\_PLUGIN\_POST\_FORCE\_ON\_FINISHED\_CONTACTS\_END() }

<a id="l00303" name="l00303"></a> 303\#endif

<a id="l00304" name="l00304"></a> 304 

<a id="l00305" name="l00305"></a> 305\#define ROCKY\_PLUGIN\_POST\_FORCE\_ON\_PARTICLES(device\_model, particle, data) \\

<a id="l00306" name="l00306"></a> 306 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS void post\_force\_on\_particles( \\

<a id="l00307" name="l00307"></a> 307 IRockyDeviceModel &amp;device\_model, IRockyParticle &amp;particle, void \*data) {

<a id="l00308" name="l00308"></a> 308 

<a id="l00309" name="l00309"></a> 309\#ifndef ROCKY\_CUDA\_API

<a id="l00310" name="l00310"></a> 310\#define ROCKY\_PLUGIN\_POST\_FORCE\_ON\_PARTICLES\_END() }

<a id="l00311" name="l00311"></a> 311\#endif

<a id="l00312" name="l00312"></a> 312 

<a id="l00313" name="l00313"></a> 313\#define ROCKY\_PLUGIN\_POST\_FORCE\_ON\_TRIANGLES(device\_model, triangle, data) \\

<a id="l00314" name="l00314"></a> 314 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS void post\_force\_on\_triangles( \\

<a id="l00315" name="l00315"></a> 315 IRockyDeviceModel &amp;device\_model, IRockyBoundaryTriangle &amp;triangle, void \*data) {

<a id="l00316" name="l00316"></a> 316 

<a id="l00317" name="l00317"></a> 317\#ifndef ROCKY\_CUDA\_API

<a id="l00318" name="l00318"></a> 318\#define ROCKY\_PLUGIN\_POST\_FORCE\_ON\_TRIANGLES\_END() }

<a id="l00319" name="l00319"></a> 319\#endif

<a id="l00320" name="l00320"></a> 320 

<a id="l00321" name="l00321"></a> 321\#define ROCKY\_PLUGIN\_POST\_FORCE\_ON\_JOINTS(device\_model, joint, data) \\

<a id="l00322" name="l00322"></a> 322 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS void post\_force\_on\_joints( \\

<a id="l00323" name="l00323"></a> 323 IRockyDeviceModel &amp;device\_model, IRockyJoint &amp;joint, void \*data) {

<a id="l00324" name="l00324"></a> 324 

<a id="l00325" name="l00325"></a> 325\#ifndef ROCKY\_CUDA\_API

<a id="l00326" name="l00326"></a> 326\#define ROCKY\_PLUGIN\_POST\_FORCE\_ON\_JOINTS\_END() }

<a id="l00327" name="l00327"></a> 327\#endif

<a id="l00328" name="l00328"></a> 328 

<a id="l00329" name="l00329"></a> 329// Move --------------------------------------------------------------------------------------------

<a id="l00330" name="l00330"></a> 330\#define ROCKY\_PLUGIN\_PRE\_MOVE\_PARTICLES(device\_model, particle, data) \\

<a id="l00331" name="l00331"></a> 331 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS void pre\_move\_particles( \\

<a id="l00332" name="l00332"></a> 332 IRockyDeviceModel &amp;device\_model, IRockyParticle &amp;particle, void \*data) {

<a id="l00333" name="l00333"></a> 333 

<a id="l00334" name="l00334"></a> 334\#ifndef ROCKY\_CUDA\_API

<a id="l00335" name="l00335"></a> 335\#define ROCKY\_PLUGIN\_PRE\_MOVE\_PARTICLES\_END() }

<a id="l00336" name="l00336"></a> 336\#endif

<a id="l00337" name="l00337"></a> 337 

<a id="l00338" name="l00338"></a> 338\#define ROCKY\_PLUGIN\_POST\_MOVE\_PARTICLES(device\_model, particle, data) \\

<a id="l00339" name="l00339"></a> 339 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS void post\_move\_particles( \\

<a id="l00340" name="l00340"></a> 340 IRockyDeviceModel &amp;device\_model, IRockyParticle &amp;particle, void \*data) {

<a id="l00341" name="l00341"></a> 341 

<a id="l00342" name="l00342"></a> 342\#ifndef ROCKY\_CUDA\_API

<a id="l00343" name="l00343"></a> 343\#define ROCKY\_PLUGIN\_POST\_MOVE\_PARTICLES\_END() }

<a id="l00344" name="l00344"></a> 344\#endif

<a id="l00345" name="l00345"></a> 345 

<a id="l00346" name="l00346"></a> 346\#define ROCKY\_PLUGIN\_PRE\_MOVE\_ON\_TRIANGLES(device\_model, triangle, data) \\

<a id="l00347" name="l00347"></a> 347 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS void pre\_move\_triangles( \\

<a id="l00348" name="l00348"></a> 348 IRockyDeviceModel &amp;device\_model, IRockyBoundaryTriangle &amp;triangle, void \*data) {

<a id="l00349" name="l00349"></a> 349 

<a id="l00350" name="l00350"></a> 350\#ifndef ROCKY\_CUDA\_API

<a id="l00351" name="l00351"></a> 351\#define ROCKY\_PLUGIN\_PRE\_MOVE\_ON\_TRIANGLES\_END() }

<a id="l00352" name="l00352"></a> 352\#endif

<a id="l00353" name="l00353"></a> 353 

<a id="l00354" name="l00354"></a> 354\#define ROCKY\_PLUGIN\_POST\_MOVE\_ON\_TRIANGLES(device\_model, triangle, data) \\

<a id="l00355" name="l00355"></a> 355 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS void post\_move\_triangles( \\

<a id="l00356" name="l00356"></a> 356 IRockyDeviceModel &amp;device\_model, IRockyBoundaryTriangle &amp;triangle, void \*data) {

<a id="l00357" name="l00357"></a> 357 

<a id="l00358" name="l00358"></a> 358\#ifndef ROCKY\_CUDA\_API

<a id="l00359" name="l00359"></a> 359\#define ROCKY\_PLUGIN\_POST\_MOVE\_ON\_TRIANGLES\_END() }

<a id="l00360" name="l00360"></a> 360\#endif

<a id="l00361" name="l00361"></a> 361 

<a id="l00362" name="l00362"></a> 362// Adhesive forces ---------------------------------------------------------------------------------------

<a id="l00363" name="l00363"></a> 363 

<a id="l00364" name="l00364"></a> 364\#define COMPUTE\_CONTACT\_ADHESIVE\_FORCES\_NAME compute\_contact\_adhesive\_forces

<a id="l00365" name="l00365"></a> 365 

<a id="l00366" name="l00366"></a> 366\#define ROCKY\_PLUGIN\_COMPUTE\_CONTACT\_ADHESIVE\_FORCES(contact, output, data) \\

<a id="l00367" name="l00367"></a> 367 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS void COMPUTE\_CONTACT\_ADHESIVE\_FORCES\_NAME( \\

<a id="l00368" name="l00368"></a> 368 IRockyContact&amp; contact, IRockyAdhesionOutputData&amp; output\_data, void\* data) {

<a id="l00369" name="l00369"></a> 369 

<a id="l00370" name="l00370"></a> 370\#ifndef ROCKY\_CUDA\_API

<a id="l00371" name="l00371"></a> 371\#define ROCKY\_PLUGIN\_COMPUTE\_CONTACT\_ADHESIVE\_FORCES\_END() }

<a id="l00372" name="l00372"></a> 372\#endif

<a id="l00373" name="l00373"></a> 373 

<a id="l00374" name="l00374"></a> 374// Joint forces ------------------------------------------------------------------------------------------

<a id="l00375" name="l00375"></a> 375 

<a id="l00376" name="l00376"></a> 376\#define COMPUTE\_JOINT\_FORCES\_NAME compute\_joint\_forces

<a id="l00377" name="l00377"></a> 377 

<a id="l00378" name="l00378"></a> 378\#define ROCKY\_PLUGIN\_COMPUTE\_JOINT\_FORCES(joint, output\_data, data) \\

<a id="l00379" name="l00379"></a> 379 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS \\

<a id="l00380" name="l00380"></a> 380 void COMPUTE\_JOINT\_FORCES\_NAME(IRockyJoint &amp;joint, IRockyJointOutputData&amp; output\_data, void \*data) {

<a id="l00381" name="l00381"></a> 381 

<a id="l00382" name="l00382"></a> 382\#ifndef ROCKY\_CUDA\_API

<a id="l00383" name="l00383"></a> 383\#define ROCKY\_PLUGIN\_COMPUTE\_JOINT\_FORCES\_END() }

<a id="l00384" name="l00384"></a> 384\#endif

<a id="l00385" name="l00385"></a> 385 

<a id="l00386" name="l00386"></a> 386// Joint breakage ----------------------------------------------------------------------------------

<a id="l00387" name="l00387"></a> 387 

<a id="l00388" name="l00388"></a> 388\#define COMPUTE\_JOINT\_BREAKAGE\_NAME compute\_joint\_breakage

<a id="l00389" name="l00389"></a> 389 

<a id="l00390" name="l00390"></a> 390\#define ROCKY\_PLUGIN\_COMPUTE\_JOINT\_BREAKAGE(joint, broken, data) \\

<a id="l00391" name="l00391"></a> 391 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS \\

<a id="l00392" name="l00392"></a> 392 void COMPUTE\_JOINT\_BREAKAGE\_NAME(IRockyJoint &amp;joint, bool &amp;broken, void \*data) {

<a id="l00393" name="l00393"></a> 393 

<a id="l00394" name="l00394"></a> 394\#ifndef ROCKY\_CUDA\_API

<a id="l00395" name="l00395"></a> 395\#define ROCKY\_PLUGIN\_COMPUTE\_JOINT\_BREAKAGE\_END() }

<a id="l00396" name="l00396"></a> 396\#endif

<a id="l00397" name="l00397"></a> 397 

<a id="l00398" name="l00398"></a> 398// Instantaneous breakage --------------------------------------------------------------------------

<a id="l00399" name="l00399"></a> 399 

<a id="l00400" name="l00400"></a> 400\#define COMPUTE\_INSTANTANEOUS\_BREAKAGE\_NAME compute\_instantaneous\_breakage

<a id="l00401" name="l00401"></a> 401 

<a id="l00402" name="l00402"></a> 402\#define ROCKY\_PLUGIN\_COMPUTE\_INSTANTANEOUS\_BREAKAGE(particle, broken, data) \\

<a id="l00403" name="l00403"></a> 403 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS \\

<a id="l00404" name="l00404"></a> 404 void COMPUTE\_INSTANTANEOUS\_BREAKAGE\_NAME(IRockyParticle &amp;particle, bool &amp;broken, void \*data) {

<a id="l00405" name="l00405"></a> 405 

<a id="l00406" name="l00406"></a> 406\#ifndef ROCKY\_CUDA\_API

<a id="l00407" name="l00407"></a> 407\#define ROCKY\_PLUGIN\_COMPUTE\_INSTANTANEOUS\_BREAKAGE\_END() }

<a id="l00408" name="l00408"></a> 408\#endif

<a id="l00409" name="l00409"></a> 409 

<a id="l00410" name="l00410"></a> 410// Fragments size distribution ---------------------------------------------------------------------

<a id="l00411" name="l00411"></a> 411 

<a id="l00412" name="l00412"></a> 412\#define COMPUTE\_SIZE\_DISTRIBUTION\_NAME compute\_fragments\_size\_distribution

<a id="l00413" name="l00413"></a> 413 

<a id="l00414" name="l00414"></a> 414\#define ROCKY\_PLUGIN\_COMPUTE\_FRAGMENTS\_SIZE\_DISTRIBUTION(breakable\_particle, distribution, data) \\

<a id="l00415" name="l00415"></a> 415 extern "C" ROCKYAPI\_EXPORT \\

<a id="l00416" name="l00416"></a> 416 void COMPUTE\_SIZE\_DISTRIBUTION\_NAME(IRockyBreakableParticle &amp;breakable\_particle, std::vector&lt;double&gt;&amp; distribution, void \*data) {

<a id="l00417" name="l00417"></a> 417 

<a id="l00418" name="l00418"></a> 418\#define ROCKY\_PLUGIN\_COMPUTE\_FRAGMENTS\_SIZE\_DISTRIBUTION\_END() }

<a id="l00419" name="l00419"></a> 419 

<a id="l00420" name="l00420"></a> 420// Boundaries wear ---------------------------------------------------------------------------------

<a id="l00421" name="l00421"></a> 421 

<a id="l00422" name="l00422"></a> 422\#define COMPUTE\_BOUNDARIES\_WEAR\_NAME compute\_boundaries\_wear

<a id="l00423" name="l00423"></a> 423 

<a id="l00424" name="l00424"></a> 424\#define ROCKY\_PLUGIN\_COMPUTE\_BOUNDARIES\_WEAR(triangle\_contact, wear\_volume, data) \\

<a id="l00425" name="l00425"></a> 425 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS \\

<a id="l00426" name="l00426"></a> 426 void COMPUTE\_BOUNDARIES\_WEAR\_NAME(IRockyContact &amp;triangle\_contact, double&amp; wear\_volume, void \*data) {

<a id="l00427" name="l00427"></a> 427 

<a id="l00428" name="l00428"></a> 428\#ifndef ROCKY\_CUDA\_API

<a id="l00429" name="l00429"></a> 429\#define ROCKY\_PLUGIN\_COMPUTE\_BOUNDARIES\_WEAR\_END() }

<a id="l00430" name="l00430"></a> 430\#endif

<a id="l00431" name="l00431"></a> 431 

<a id="l00432" name="l00432"></a> 432// Thermal -----------------------------------------------------------------------------------------

<a id="l00433" name="l00433"></a> 433\#define COMPUTE\_FRICTIONAL\_HEAT\_CONDUCTION\_NAME compute\_contact\_heat\_conduction

<a id="l00434" name="l00434"></a> 434 

<a id="l00435" name="l00435"></a> 435\#define ROCKY\_PLUGIN\_COMPUTE\_CONTACT\_HEAT\_CONDUCTION(model, contact, data) \\

<a id="l00436" name="l00436"></a> 436 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS \\

<a id="l00437" name="l00437"></a> 437 void COMPUTE\_FRICTIONAL\_HEAT\_CONDUCTION\_NAME( \\

<a id="l00438" name="l00438"></a> 438 IRockyDeviceModel &amp;model, IRockyContact &amp;contact, void \*data) {

<a id="l00439" name="l00439"></a> 439 

<a id="l00440" name="l00440"></a> 440\#ifndef ROCKY\_CUDA\_API

<a id="l00441" name="l00441"></a> 441\#define ROCKY\_PLUGIN\_COMPUTE\_CONTACT\_HEAT\_CONDUCTION\_END() }

<a id="l00442" name="l00442"></a> 442\#endif

<a id="l00443" name="l00443"></a> 443 

<a id="l00444" name="l00444"></a> 444\#define COMPUTE\_THERMAL\_INTEGRATION\_NAME compute\_thermal\_integration

<a id="l00445" name="l00445"></a> 445 

<a id="l00446" name="l00446"></a> 446\#define ROCKY\_PLUGIN\_COMPUTE\_THERMAL\_INTEGRATION(model, particle, data) \\

<a id="l00447" name="l00447"></a> 447 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS \\

<a id="l00448" name="l00448"></a> 448 void COMPUTE\_THERMAL\_INTEGRATION\_NAME( \\

<a id="l00449" name="l00449"></a> 449 IRockyDeviceModel &amp;model, IRockyParticle &amp;particle, void \*data) {

<a id="l00450" name="l00450"></a> 450 

<a id="l00451" name="l00451"></a> 451\#ifndef ROCKY\_CUDA\_API

<a id="l00452" name="l00452"></a> 452\#define ROCKY\_PLUGIN\_COMPUTE\_THERMAL\_INTEGRATION\_END() }

<a id="l00453" name="l00453"></a> 453\#endif

<a id="l00454" name="l00454"></a> 454 

<a id="l00455" name="l00455"></a> 455// Geometry motion ---------------------------------------------------------------------------------

<a id="l00456" name="l00456"></a> 456\#define ROCKY\_PLUGIN\_COMPUTE\_GEOMETRIES\_MOTION(model, motion, data) \\

<a id="l00457" name="l00457"></a> 457 extern "C" ROCKYAPI\_EXPORT void compute\_geometries\_motion(IRockyModel &amp;model, IRockyGeometriesMotionData &amp;motion, void \*data)

<a id="l00458" name="l00458"></a> 458 

<a id="l00459" name="l00459"></a> 459// CUDA ============================================================================================

<a id="l00460" name="l00460"></a> 460 

<a id="l00461" name="l00461"></a> 461\#ifdef ROCKY\_CUDA\_API

<a id="l00462" name="l00462"></a> 462 

<a id="l00463" name="l00463"></a> 463 // on particles

<a id="l00464" name="l00464"></a> 464 #define ROCKY\_PLUGIN\_PARTICLES\_CUDA\_KERNEL(func\_name) \\

<a id="l00465" name="l00465"></a> 465 struct f\_##func\_name##\_type \\

<a id="l00466" name="l00466"></a> 466 { \\

<a id="l00467" name="l00467"></a> 467 ROCKY\_FUNCTIONS void operator()( \\

<a id="l00468" name="l00468"></a> 468 IRockyDeviceModel&amp; device\_model\_api, IRockyParticle&amp; particle\_api, void\* udf\_data) \\

<a id="l00469" name="l00469"></a> 469 { \\

<a id="l00470" name="l00470"></a> 470 func\_name(device\_model\_api, particle\_api, udf\_data); \\

<a id="l00471" name="l00471"></a> 471 } \\

<a id="l00472" name="l00472"></a> 472 }; \\

<a id="l00473" name="l00473"></a> 473 extern "C" ROCKYAPI\_EXPORT void cuda\_##func\_name##\_kernel( \\

<a id="l00474" name="l00474"></a> 474 IRockyModel&amp; model, void\*\* plugin\_device\_data) \\

<a id="l00475" name="l00475"></a> 475 { \\

<a id="l00476" name="l00476"></a> 476 f\_##func\_name##\_type device\_functor {}; \\

<a id="l00477" name="l00477"></a> 477 rocky::cuda::dispatch\_particles\_kernel(model, device\_functor, plugin\_device\_data); \\

<a id="l00478" name="l00478"></a> 478 }

<a id="l00479" name="l00479"></a> 479 

<a id="l00480" name="l00480"></a> 480 // on triangles

<a id="l00481" name="l00481"></a> 481 #define ROCKY\_PLUGIN\_TRIANGLES\_CUDA\_KERNEL(func\_name) \\

<a id="l00482" name="l00482"></a> 482 struct f\_##func\_name##\_type \\

<a id="l00483" name="l00483"></a> 483 { \\

<a id="l00484" name="l00484"></a> 484 ROCKY\_FUNCTIONS void operator()( \\

<a id="l00485" name="l00485"></a> 485 IRockyDeviceModel&amp; device\_model\_api, \\

<a id="l00486" name="l00486"></a> 486 IRockyBoundaryTriangle&amp; triangle\_api, \\

<a id="l00487" name="l00487"></a> 487 void\* udf\_data) \\

<a id="l00488" name="l00488"></a> 488 { \\

<a id="l00489" name="l00489"></a> 489 func\_name(device\_model\_api, triangle\_api, udf\_data); \\

<a id="l00490" name="l00490"></a> 490 } \\

<a id="l00491" name="l00491"></a> 491 }; \\

<a id="l00492" name="l00492"></a> 492 extern "C" ROCKYAPI\_EXPORT void cuda\_##func\_name##\_kernel( \\

<a id="l00493" name="l00493"></a> 493 IRockyModel&amp; model, void\*\* plugin\_device\_data) \\

<a id="l00494" name="l00494"></a> 494 { \\

<a id="l00495" name="l00495"></a> 495 f\_##func\_name##\_type device\_functor {}; \\

<a id="l00496" name="l00496"></a> 496 rocky::cuda::dispatch\_triangles\_kernel(model, device\_functor, plugin\_device\_data); \\

<a id="l00497" name="l00497"></a> 497 }

<a id="l00498" name="l00498"></a> 498 

<a id="l00499" name="l00499"></a> 499 // on contacts

<a id="l00500" name="l00500"></a> 500 #define ROCKY\_PLUGIN\_CONTACTS\_CUDA\_KERNEL(func\_name, c\_type) \\

<a id="l00501" name="l00501"></a> 501 struct f\_##func\_name##\_type \\

<a id="l00502" name="l00502"></a> 502 { \\

<a id="l00503" name="l00503"></a> 503 ROCKY\_FUNCTIONS void operator()( \\

<a id="l00504" name="l00504"></a> 504 IRockyDeviceModel&amp; device\_model\_api, IRockyContact&amp; contact\_api, void\* udf\_data) \\

<a id="l00505" name="l00505"></a> 505 { \\

<a id="l00506" name="l00506"></a> 506 func\_name(device\_model\_api, contact\_api, udf\_data); \\

<a id="l00507" name="l00507"></a> 507 } \\

<a id="l00508" name="l00508"></a> 508 }; \\

<a id="l00509" name="l00509"></a> 509 extern "C" ROCKYAPI\_EXPORT void cuda\_##func\_name##\_kernel( \\

<a id="l00510" name="l00510"></a> 510 IRockyModel&amp; model, void\*\* plugin\_device\_data) \\

<a id="l00511" name="l00511"></a> 511 { \\

<a id="l00512" name="l00512"></a> 512 f\_##func\_name##\_type device\_functor {}; \\

<a id="l00513" name="l00513"></a> 513 rocky::cuda::dispatch\_##c\_type##\_contacts\_kernel( \\

<a id="l00514" name="l00514"></a> 514 model, device\_functor, device\_functor, plugin\_device\_data); \\

<a id="l00515" name="l00515"></a> 515 }

<a id="l00516" name="l00516"></a> 516 

<a id="l00517" name="l00517"></a> 517 // on joints

<a id="l00518" name="l00518"></a> 518 #define ROCKY\_PLUGIN\_JOINTS\_CUDA\_KERNEL(func\_name) \\

<a id="l00519" name="l00519"></a> 519 struct f\_##func\_name##\_type \\

<a id="l00520" name="l00520"></a> 520 { \\

<a id="l00521" name="l00521"></a> 521 ROCKY\_FUNCTIONS void operator()( \\

<a id="l00522" name="l00522"></a> 522 IRockyDeviceModel&amp; device\_model\_api, IRockyJoint&amp; joint\_api, void\* udf\_data) \\

<a id="l00523" name="l00523"></a> 523 { \\

<a id="l00524" name="l00524"></a> 524 func\_name(device\_model\_api, joint\_api, udf\_data); \\

<a id="l00525" name="l00525"></a> 525 } \\

<a id="l00526" name="l00526"></a> 526 }; \\

<a id="l00527" name="l00527"></a> 527 extern "C" ROCKYAPI\_EXPORT void cuda\_##func\_name##\_kernel( \\

<a id="l00528" name="l00528"></a> 528 IRockyModel&amp; model, void\*\* plugin\_device\_data) \\

<a id="l00529" name="l00529"></a> 529 { \\

<a id="l00530" name="l00530"></a> 530 f\_##func\_name##\_type device\_functor {}; \\

<a id="l00531" name="l00531"></a> 531 rocky::cuda::dispatch\_joints\_kernel(model, device\_functor, plugin\_device\_data); \\

<a id="l00532" name="l00532"></a> 532 }

<a id="l00533" name="l00533"></a> 533 

<a id="l00534" name="l00534"></a> 534 // Search --------------------------------------------------------------------------------------

<a id="l00535" name="l00535"></a> 535 #define ROCKY\_PLUGIN\_PRE\_SEARCH\_ON\_PARTICLES\_END() \\

<a id="l00536" name="l00536"></a> 536 } \\

<a id="l00537" name="l00537"></a> 537 ROCKY\_PLUGIN\_PARTICLES\_CUDA\_KERNEL(pre\_search\_on\_particles)

<a id="l00538" name="l00538"></a> 538 

<a id="l00539" name="l00539"></a> 539 // Force ---------------------------------------------------------------------------------------

<a id="l00540" name="l00540"></a> 540 #define ROCKY\_PLUGIN\_PRE\_FORCE\_ON\_CONTACTS\_END() \\

<a id="l00541" name="l00541"></a> 541 } \\

<a id="l00542" name="l00542"></a> 542 ROCKY\_PLUGIN\_CONTACTS\_CUDA\_KERNEL(pre\_force\_on\_contacts, frictional)

<a id="l00543" name="l00543"></a> 543 

<a id="l00544" name="l00544"></a> 544 #define ROCKY\_PLUGIN\_PRE\_FORCE\_ON\_PARTICLES\_END() \\

<a id="l00545" name="l00545"></a> 545 } \\

<a id="l00546" name="l00546"></a> 546 ROCKY\_PLUGIN\_PARTICLES\_CUDA\_KERNEL(pre\_force\_on\_particles)

<a id="l00547" name="l00547"></a> 547 

<a id="l00548" name="l00548"></a> 548 #define ROCKY\_PLUGIN\_PRE\_FORCE\_ON\_TRIANGLES\_END() \\

<a id="l00549" name="l00549"></a> 549 } \\

<a id="l00550" name="l00550"></a> 550 ROCKY\_PLUGIN\_TRIANGLES\_CUDA\_KERNEL(pre\_force\_on\_triangles)

<a id="l00551" name="l00551"></a> 551 

<a id="l00552" name="l00552"></a> 552 #define ROCKY\_PLUGIN\_PRE\_FORCE\_ON\_JOINTS\_END() \\

<a id="l00553" name="l00553"></a> 553 } \\

<a id="l00554" name="l00554"></a> 554 ROCKY\_PLUGIN\_JOINTS\_CUDA\_KERNEL(pre\_force\_on\_joints)

<a id="l00555" name="l00555"></a> 555 

<a id="l00556" name="l00556"></a> 556 #define ROCKY\_PLUGIN\_POST\_FORCE\_ON\_CONTACTS\_END() \\

<a id="l00557" name="l00557"></a> 557 } \\

<a id="l00558" name="l00558"></a> 558 ROCKY\_PLUGIN\_CONTACTS\_CUDA\_KERNEL(post\_force\_on\_contacts, frictional)

<a id="l00559" name="l00559"></a> 559 

<a id="l00560" name="l00560"></a> 560 #define ROCKY\_PLUGIN\_POST\_FORCE\_ON\_PARTICLES\_END() \\

<a id="l00561" name="l00561"></a> 561 } \\

<a id="l00562" name="l00562"></a> 562 ROCKY\_PLUGIN\_PARTICLES\_CUDA\_KERNEL(post\_force\_on\_particles)

<a id="l00563" name="l00563"></a> 563 

<a id="l00564" name="l00564"></a> 564 #define ROCKY\_PLUGIN\_POST\_FORCE\_ON\_TRIANGLES\_END() \\

<a id="l00565" name="l00565"></a> 565 } \\

<a id="l00566" name="l00566"></a> 566 ROCKY\_PLUGIN\_TRIANGLES\_CUDA\_KERNEL(post\_force\_on\_triangles)

<a id="l00567" name="l00567"></a> 567 

<a id="l00568" name="l00568"></a> 568 #define ROCKY\_PLUGIN\_POST\_FORCE\_ON\_JOINTS\_END() \\

<a id="l00569" name="l00569"></a> 569 } \\

<a id="l00570" name="l00570"></a> 570 ROCKY\_PLUGIN\_JOINTS\_CUDA\_KERNEL(post\_force\_on\_joints)

<a id="l00571" name="l00571"></a> 571 

<a id="l00572" name="l00572"></a> 572 #define ROCKY\_PLUGIN\_POST\_FORCE\_ON\_FINISHED\_CONTACTS\_END() \\

<a id="l00573" name="l00573"></a> 573 } \\

<a id="l00574" name="l00574"></a> 574 ROCKY\_PLUGIN\_CONTACTS\_CUDA\_KERNEL(post\_force\_on\_finished\_contacts, finished)

<a id="l00575" name="l00575"></a> 575 

<a id="l00576" name="l00576"></a> 576 #define ROCKY\_PLUGIN\_PRE\_OUTPUT\_ON\_CONTACTS\_END() \\

<a id="l00577" name="l00577"></a> 577 } \\

<a id="l00578" name="l00578"></a> 578 ROCKY\_PLUGIN\_CONTACTS\_CUDA\_KERNEL(pre\_output\_on\_active\_contacts, active)

<a id="l00579" name="l00579"></a> 579 

<a id="l00580" name="l00580"></a> 580 // Move ----------------------------------------------------------------------------------------

<a id="l00581" name="l00581"></a> 581 #define ROCKY\_PLUGIN\_PRE\_MOVE\_PARTICLES\_CUDA() \\

<a id="l00582" name="l00582"></a> 582 ROCKY\_PLUGIN\_PARTICLES\_CUDA\_KERNEL(pre\_move\_particles)

<a id="l00583" name="l00583"></a> 583 

<a id="l00584" name="l00584"></a> 584 #define ROCKY\_PLUGIN\_PRE\_MOVE\_PARTICLES\_END() \\

<a id="l00585" name="l00585"></a> 585 } \\

<a id="l00586" name="l00586"></a> 586 ROCKY\_PLUGIN\_PRE\_MOVE\_PARTICLES\_CUDA()

<a id="l00587" name="l00587"></a> 587 

<a id="l00588" name="l00588"></a> 588 #define ROCKY\_PLUGIN\_POST\_MOVE\_PARTICLES\_CUDA() \\

<a id="l00589" name="l00589"></a> 589 ROCKY\_PLUGIN\_PARTICLES\_CUDA\_KERNEL(post\_move\_particles)

<a id="l00590" name="l00590"></a> 590 

<a id="l00591" name="l00591"></a> 591 #define ROCKY\_PLUGIN\_POST\_MOVE\_PARTICLES\_END() \\

<a id="l00592" name="l00592"></a> 592 } \\

<a id="l00593" name="l00593"></a> 593 ROCKY\_PLUGIN\_POST\_MOVE\_PARTICLES\_CUDA()

<a id="l00594" name="l00594"></a> 594 

<a id="l00595" name="l00595"></a> 595 #define ROCKY\_PLUGIN\_PRE\_MOVE\_ON\_TRIANGLES\_CUDA() \\

<a id="l00596" name="l00596"></a> 596 ROCKY\_PLUGIN\_TRIANGLES\_CUDA\_KERNEL(pre\_move\_triangles)

<a id="l00597" name="l00597"></a> 597 

<a id="l00598" name="l00598"></a> 598 #define ROCKY\_PLUGIN\_PRE\_MOVE\_ON\_TRIANGLES\_END() \\

<a id="l00599" name="l00599"></a> 599 } \\

<a id="l00600" name="l00600"></a> 600 ROCKY\_PLUGIN\_PRE\_MOVE\_ON\_TRIANGLES\_CUDA()

<a id="l00601" name="l00601"></a> 601 

<a id="l00602" name="l00602"></a> 602 #define ROCKY\_PLUGIN\_POST\_MOVE\_ON\_TRIANGLES\_CUDA() \\

<a id="l00603" name="l00603"></a> 603 ROCKY\_PLUGIN\_TRIANGLES\_CUDA\_KERNEL(post\_move\_triangles)

<a id="l00604" name="l00604"></a> 604 

<a id="l00605" name="l00605"></a> 605 #define ROCKY\_PLUGIN\_POST\_MOVE\_ON\_TRIANGLES\_END() \\

<a id="l00606" name="l00606"></a> 606 } \\

<a id="l00607" name="l00607"></a> 607 ROCKY\_PLUGIN\_POST\_MOVE\_ON\_TRIANGLES\_CUDA()

<a id="l00608" name="l00608"></a> 608 

<a id="l00609" name="l00609"></a> 609// Contact adhesive forces -------------------------------------------------------------------------

<a id="l00610" name="l00610"></a> 610 

<a id="l00611" name="l00611"></a> 611 #define ROCKY\_PLUGIN\_CONTACT\_ADHESIVE\_FORCES\_CUDA\_KERNEL(func\_name) \\

<a id="l00612" name="l00612"></a> 612 struct f\_##func\_name##\_type \\

<a id="l00613" name="l00613"></a> 613 { \\

<a id="l00614" name="l00614"></a> 614 ROCKY\_FUNCTIONS void operator()( \\

<a id="l00615" name="l00615"></a> 615 IRockyContact&amp; contact\_api, \\

<a id="l00616" name="l00616"></a> 616 IRockyAdhesionOutputData&amp; output\_data\_api, \\

<a id="l00617" name="l00617"></a> 617 void\* udf\_data) \\

<a id="l00618" name="l00618"></a> 618 { \\

<a id="l00619" name="l00619"></a> 619 func\_name(contact\_api, output\_data\_api, udf\_data); \\

<a id="l00620" name="l00620"></a> 620 } \\

<a id="l00621" name="l00621"></a> 621 }; \\

<a id="l00622" name="l00622"></a> 622 extern "C" ROCKYAPI\_EXPORT void cuda\_##func\_name##\_kernel( \\

<a id="l00623" name="l00623"></a> 623 IRockyModel&amp; model, void\*\* plugin\_device\_data) \\

<a id="l00624" name="l00624"></a> 624 { \\

<a id="l00625" name="l00625"></a> 625 f\_##func\_name##\_type device\_functor {}; \\

<a id="l00626" name="l00626"></a> 626 rocky::cuda::dispatch\_adhesive\_contact\_forces\_kernel( \\

<a id="l00627" name="l00627"></a> 627 model, device\_functor, device\_functor, plugin\_device\_data); \\

<a id="l00628" name="l00628"></a> 628 }

<a id="l00629" name="l00629"></a> 629 

<a id="l00630" name="l00630"></a> 630 #define ROCKY\_PLUGIN\_COMPUTE\_CONTACT\_ADHESIVE\_FORCES\_END() \\

<a id="l00631" name="l00631"></a> 631 } \\

<a id="l00632" name="l00632"></a> 632 ROCKY\_PLUGIN\_CONTACT\_ADHESIVE\_FORCES\_CUDA\_KERNEL(compute\_contact\_adhesive\_forces)

<a id="l00633" name="l00633"></a> 633 

<a id="l00634" name="l00634"></a> 634// Joint forces ------------------------------------------------------------------------------------

<a id="l00635" name="l00635"></a> 635 

<a id="l00636" name="l00636"></a> 636 #define ROCKY\_PLUGIN\_JOINT\_FORCES\_CUDA\_KERNEL(func\_name) \\

<a id="l00637" name="l00637"></a> 637 struct f\_##func\_name##\_type \\

<a id="l00638" name="l00638"></a> 638 { \\

<a id="l00639" name="l00639"></a> 639 ROCKY\_FUNCTIONS void operator()( \\

<a id="l00640" name="l00640"></a> 640 IRockyJoint&amp; joint\_api, IRockyJointOutputData&amp; output\_data\_api, void\* udf\_data) \\

<a id="l00641" name="l00641"></a> 641 { \\

<a id="l00642" name="l00642"></a> 642 func\_name(joint\_api, output\_data\_api, udf\_data); \\

<a id="l00643" name="l00643"></a> 643 } \\

<a id="l00644" name="l00644"></a> 644 }; \\

<a id="l00645" name="l00645"></a> 645 extern "C" ROCKYAPI\_EXPORT void cuda\_##func\_name##\_kernel( \\

<a id="l00646" name="l00646"></a> 646 IRockyModel&amp; model, void\*\* plugin\_device\_data) \\

<a id="l00647" name="l00647"></a> 647 { \\

<a id="l00648" name="l00648"></a> 648 f\_##func\_name##\_type device\_functor {}; \\

<a id="l00649" name="l00649"></a> 649 rocky::cuda::dispatch\_joint\_forces\_kernel(model, device\_functor, plugin\_device\_data); \\

<a id="l00650" name="l00650"></a> 650 }

<a id="l00651" name="l00651"></a> 651 

<a id="l00652" name="l00652"></a> 652 #define ROCKY\_PLUGIN\_COMPUTE\_JOINT\_FORCES\_END() \\

<a id="l00653" name="l00653"></a> 653 } \\

<a id="l00654" name="l00654"></a> 654 ROCKY\_PLUGIN\_JOINT\_FORCES\_CUDA\_KERNEL(compute\_joint\_forces)

<a id="l00655" name="l00655"></a> 655 

<a id="l00656" name="l00656"></a> 656// Joint breakage ------------------------------------------------------------------------------

<a id="l00657" name="l00657"></a> 657 

<a id="l00658" name="l00658"></a> 658 #define ROCKY\_PLUGIN\_JOINT\_BREAKAGE\_CUDA\_KERNEL(func\_name) \\

<a id="l00659" name="l00659"></a> 659 struct f\_##func\_name##\_type \\

<a id="l00660" name="l00660"></a> 660 { \\

<a id="l00661" name="l00661"></a> 661 ROCKY\_FUNCTIONS void operator()(IRockyJoint&amp; joint\_api, bool&amp; broken, void\* udf\_data) \\

<a id="l00662" name="l00662"></a> 662 { \\

<a id="l00663" name="l00663"></a> 663 func\_name(joint\_api, broken, udf\_data); \\

<a id="l00664" name="l00664"></a> 664 } \\

<a id="l00665" name="l00665"></a> 665 }; \\

<a id="l00666" name="l00666"></a> 666 extern "C" ROCKYAPI\_EXPORT void cuda\_##func\_name##\_kernel( \\

<a id="l00667" name="l00667"></a> 667 IRockyModel&amp; model, void\*\* plugin\_device\_data) \\

<a id="l00668" name="l00668"></a> 668 { \\

<a id="l00669" name="l00669"></a> 669 f\_##func\_name##\_type device\_functor {}; \\

<a id="l00670" name="l00670"></a> 670 rocky::cuda::dispatch\_joint\_breakage\_kernel( \\

<a id="l00671" name="l00671"></a> 671 model, device\_functor, plugin\_device\_data); \\

<a id="l00672" name="l00672"></a> 672 }

<a id="l00673" name="l00673"></a> 673 

<a id="l00674" name="l00674"></a> 674 #define ROCKY\_PLUGIN\_COMPUTE\_JOINT\_BREAKAGE\_END() \\

<a id="l00675" name="l00675"></a> 675 } \\

<a id="l00676" name="l00676"></a> 676 ROCKY\_PLUGIN\_JOINT\_BREAKAGE\_CUDA\_KERNEL(compute\_joint\_breakage)

<a id="l00677" name="l00677"></a> 677 

<a id="l00678" name="l00678"></a> 678// Instantaneous breakage --------------------------------------------------------------------------

<a id="l00679" name="l00679"></a> 679 

<a id="l00680" name="l00680"></a> 680 #define ROCKY\_PLUGIN\_INSTANTANEOUS\_BREAKAGE\_CUDA\_KERNEL(func\_name) \\

<a id="l00681" name="l00681"></a> 681 struct f\_##func\_name##\_type \\

<a id="l00682" name="l00682"></a> 682 { \\

<a id="l00683" name="l00683"></a> 683 ROCKY\_FUNCTIONS void operator()( \\

<a id="l00684" name="l00684"></a> 684 IRockyParticle&amp; particle\_api, bool&amp; broken, void\* udf\_data) \\

<a id="l00685" name="l00685"></a> 685 { \\

<a id="l00686" name="l00686"></a> 686 func\_name(particle\_api, broken, udf\_data); \\

<a id="l00687" name="l00687"></a> 687 } \\

<a id="l00688" name="l00688"></a> 688 }; \\

<a id="l00689" name="l00689"></a> 689 extern "C" ROCKYAPI\_EXPORT void cuda\_##func\_name##\_kernel( \\

<a id="l00690" name="l00690"></a> 690 IRockyModel&amp; model, void\*\* plugin\_device\_data) \\

<a id="l00691" name="l00691"></a> 691 { \\

<a id="l00692" name="l00692"></a> 692 f\_##func\_name##\_type device\_functor {}; \\

<a id="l00693" name="l00693"></a> 693 rocky::cuda::dispatch\_instantaneous\_breakage\_kernel( \\

<a id="l00694" name="l00694"></a> 694 model, device\_functor, plugin\_device\_data); \\

<a id="l00695" name="l00695"></a> 695 }

<a id="l00696" name="l00696"></a> 696 

<a id="l00697" name="l00697"></a> 697 #define ROCKY\_PLUGIN\_COMPUTE\_INSTANTANEOUS\_BREAKAGE\_END() \\

<a id="l00698" name="l00698"></a> 698 } \\

<a id="l00699" name="l00699"></a> 699 ROCKY\_PLUGIN\_INSTANTANEOUS\_BREAKAGE\_CUDA\_KERNEL(compute\_instantaneous\_breakage)

<a id="l00700" name="l00700"></a> 700 

<a id="l00701" name="l00701"></a> 701// Boundaries wear ---------------------------------------------------------------------------------

<a id="l00702" name="l00702"></a> 702 

<a id="l00703" name="l00703"></a> 703 #define ROCKY\_PLUGIN\_COMPUTE\_BOUNDARIES\_WEAR\_CUDA\_KERNEL(func\_name) \\

<a id="l00704" name="l00704"></a> 704 struct f\_##func\_name##\_type \\

<a id="l00705" name="l00705"></a> 705 { \\

<a id="l00706" name="l00706"></a> 706 ROCKY\_FUNCTIONS void operator()( \\

<a id="l00707" name="l00707"></a> 707 IRockyContact&amp; contact\_api, double&amp; wear\_volume, void\* udf\_data) \\

<a id="l00708" name="l00708"></a> 708 { \\

<a id="l00709" name="l00709"></a> 709 func\_name(contact\_api, wear\_volume, udf\_data); \\

<a id="l00710" name="l00710"></a> 710 } \\

<a id="l00711" name="l00711"></a> 711 }; \\

<a id="l00712" name="l00712"></a> 712 extern "C" ROCKYAPI\_EXPORT void cuda\_##func\_name##\_kernel( \\

<a id="l00713" name="l00713"></a> 713 IRockyModel&amp; model, void\*\* plugin\_device\_data) \\

<a id="l00714" name="l00714"></a> 714 { \\

<a id="l00715" name="l00715"></a> 715 f\_##func\_name##\_type device\_functor {}; \\

<a id="l00716" name="l00716"></a> 716 rocky::cuda::dispatch\_boundaries\_wear\_kernel( \\

<a id="l00717" name="l00717"></a> 717 model, device\_functor, plugin\_device\_data); \\

<a id="l00718" name="l00718"></a> 718 }

<a id="l00719" name="l00719"></a> 719 

<a id="l00720" name="l00720"></a> 720 #define ROCKY\_PLUGIN\_COMPUTE\_BOUNDARIES\_WEAR\_END() \\

<a id="l00721" name="l00721"></a> 721 } \\

<a id="l00722" name="l00722"></a> 722 ROCKY\_PLUGIN\_COMPUTE\_BOUNDARIES\_WEAR\_CUDA\_KERNEL(compute\_boundaries\_wear)

<a id="l00723" name="l00723"></a> 723 

<a id="l00724" name="l00724"></a> 724// Contact Data Gathering --------------------------------------------------------------------------

<a id="l00725" name="l00725"></a> 725 

<a id="l00726" name="l00726"></a> 726 #define ROCKY\_PLUGIN\_ALL\_CONTACTS\_CUDA\_KERNEL(func\_name) \\

<a id="l00727" name="l00727"></a> 727 struct f\_##func\_name##\_type \\

<a id="l00728" name="l00728"></a> 728 { \\

<a id="l00729" name="l00729"></a> 729 ROCKY\_FUNCTIONS void operator()( \\

<a id="l00730" name="l00730"></a> 730 IRockyDeviceModel&amp; device\_model\_api, IRockyContact&amp; contact\_api, void\* udf\_data) \\

<a id="l00731" name="l00731"></a> 731 { \\

<a id="l00732" name="l00732"></a> 732 func\_name(device\_model\_api, contact\_api, udf\_data); \\

<a id="l00733" name="l00733"></a> 733 } \\

<a id="l00734" name="l00734"></a> 734 }; \\

<a id="l00735" name="l00735"></a> 735 extern "C" ROCKYAPI\_EXPORT void cuda\_##func\_name##\_kernel( \\

<a id="l00736" name="l00736"></a> 736 IRockyModel&amp; model, void\*\* plugin\_device\_data) \\

<a id="l00737" name="l00737"></a> 737 { \\

<a id="l00738" name="l00738"></a> 738 f\_##func\_name##\_type device\_functor {}; \\

<a id="l00739" name="l00739"></a> 739 rocky::cuda::dispatch\_all\_contacts\_kernel( \\

<a id="l00740" name="l00740"></a> 740 model, device\_model, device\_model, plugin\_device\_data); \\

<a id="l00741" name="l00741"></a> 741 }

<a id="l00742" name="l00742"></a> 742 

<a id="l00743" name="l00743"></a> 743 #define ROCKY\_PLUGIN\_COLLECT\_CONTACTS\_DATA\_END() \\

<a id="l00744" name="l00744"></a> 744 } \\

<a id="l00745" name="l00745"></a> 745 ROCKY\_PLUGIN\_ALL\_CONTACTS\_CUDA\_KERNEL(collect\_contacts\_data)

<a id="l00746" name="l00746"></a> 746 

<a id="l00747" name="l00747"></a> 747// Thermal -----------------------------------------------------------------------------------------

<a id="l00748" name="l00748"></a> 748 #define ROCKY\_PLUGIN\_COMPUTE\_CONTACT\_HEAT\_CONDUCTION\_END() \\

<a id="l00749" name="l00749"></a> 749 } \\

<a id="l00750" name="l00750"></a> 750 ROCKY\_PLUGIN\_CONTACTS\_CUDA\_KERNEL(compute\_contact\_heat\_conduction, frictional)

<a id="l00751" name="l00751"></a> 751 

<a id="l00752" name="l00752"></a> 752 #define ROCKY\_PLUGIN\_COMPUTE\_THERMAL\_INTEGRATION\_END() \\

<a id="l00753" name="l00753"></a> 753 } \\

<a id="l00754" name="l00754"></a> 754 ROCKY\_PLUGIN\_PARTICLES\_CUDA\_KERNEL(compute\_thermal\_integration)

<a id="l00755" name="l00755"></a> 755 

<a id="l00756" name="l00756"></a> 756\#endif // ROCKY\_CUDA\_API

[IRockyAdhesiveDistanceData](classIRockyAdhesiveDistanceData.xhtml)

**Definition** rocky_timestep_api.h:189



[IRockyPluginData](classIRockyPluginData.xhtml)

**Definition** rocky_plugin_data.h:112



[IRockyTimestepData](classIRockyTimestepData.xhtml)

**Definition** rocky_timestep_api.h:152



[IRockyAdhesionOutputData](structIRockyAdhesionOutputData.xhtml)

**Definition** rocky_contact_output_data_api.hpp:303



[IRockyBreakableParticle](structIRockyBreakableParticle.xhtml)

**Definition** rocky_particle_api.hpp:649



[IRockyContact](structIRockyContact.xhtml)

**Definition** rocky_contact_api.hpp:46



[IRockyDeviceModel](structIRockyDeviceModel.xhtml)

**Definition** rocky_model_api.hpp:19



[IRockyGeometriesMotionData](structIRockyGeometriesMotionData.xhtml)

**Definition** rocky_boundary_api.hpp:684



[IRockyGeometryTriangleHost](structIRockyGeometryTriangleHost.xhtml)

**Definition** rocky_boundary_api.hpp:285



[IRockyGeometryTriangle](structIRockyGeometryTriangle.xhtml)

**Definition** rocky_boundary_api.hpp:134



[IRockyJoint](structIRockyJoint.xhtml)

**Definition** rocky_joint_api.hpp:32



[IRockyModel](structIRockyModel.xhtml)

**Definition** rocky_api.h:60



[IRockyOutputPropertyCollection](structIRockyOutputPropertyCollection.xhtml)

**Definition** rocky_output_collections_api.hpp:555



[IRockyParticleHost](structIRockyParticleHost.xhtml)

**Definition** rocky_particle_api.hpp:766



[IRockyParticle](structIRockyParticle.xhtml)

**Definition** rocky_particle_api.hpp:27