    

 ## On this page

  

 

 # rocky\_api\_contact\_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\#define FORCE\_KERNEL\_PARAMETERS \\

<a id="l00004" name="l00004"></a> 4 IRockyContact &amp;contact\_api, IRockyContactIntermediateData &amp;contact\_idata, \\

<a id="l00005" name="l00005"></a> 5 IRockyContactOutputData &amp;contact\_output, void \*plugin\_data

<a id="l00006" name="l00006"></a> 6\#define FORCE\_KERNEL\_ARGUMENTS contact\_api, contact\_idata, contact\_output, plugin\_data

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

<a id="l00008" name="l00008"></a> 8\#define CAMEL\_CASE\_compute\_normal\_force fpfComputeNormalForce

<a id="l00009" name="l00009"></a> 9\#define CAMEL\_CASE\_compute\_tangential\_force fpfComputeTangentialForce

<a id="l00010" name="l00010"></a> 10\#define CAMEL\_CASE\_compute\_impact\_energy fpfComputeImpactEnergy

<a id="l00011" name="l00011"></a> 11\#define CAMEL\_CASE\_compute\_rolling\_resistance fpfComputeRollingResistance

<a id="l00012" name="l00012"></a> 12\#define CAMEL\_CASE\_ENUM(entry) CAMEL\_CASE\_##entry

<a id="l00013" name="l00013"></a> 13 

<a id="l00014" name="l00014"></a> 14// forward declarations

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

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

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

<a id="l00018" name="l00018"></a> 18// function prototypes

<a id="l00019" name="l00019"></a> 19typedef void(__stdcall* contact_model_f_type)(FORCE_KERNEL_PARAMETERS);

<a id="l00020" name="l00020"></a> 20typedef void(__stdcall* cuda_contact_model_kernels_f_type)(

<a id="l00021" name="l00021"></a> 21 [IRockyModel](structIRockyModel.xhtml)&amp; model, void** plugin_devices_data);

<a id="l00022" name="l00022"></a> 22typedef void(__stdcall* omp_contact_model_kernels_f_type)(

<a id="l00023" name="l00023"></a> 23 [IRockyModel](structIRockyModel.xhtml)&amp; model, void* plugin_data);

<a id="l00024" name="l00024"></a> 24 

<a id="l00025" name="l00025"></a> 25namespace device {

<a id="l00026" name="l00026"></a> 26__host__ __device__ void builtin_contact_normal_forces(FORCE_KERNEL_PARAMETERS);

<a id="l00027" name="l00027"></a> 27__host__ __device__ void builtin_contact_tangential_forces(FORCE_KERNEL_PARAMETERS);

<a id="l00028" name="l00028"></a> 28__host__ __device__ void builtin_impact_energies(FORCE_KERNEL_PARAMETERS);

<a id="l00029" name="l00029"></a> 29__host__ __device__ void standard_compute_rolling_resistance(FORCE_KERNEL_PARAMETERS);

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

<a id="l00031" name="l00031"></a> 31 

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

<a id="l00033" name="l00033"></a> 33{

<a id="l00034" name="l00034"></a> 34 fpfComputeNormalForce = 0,

<a id="l00035" name="l00035"></a> 35 fpfComputeTangentialForce = 1,

<a id="l00036" name="l00036"></a> 36 fpfComputeImpactEnergy = 2,

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

<a id="l00038" name="l00038"></a> 38};

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

<a id="l00040" name="l00040"></a> 40struct ForcePipelineFunctions

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

<a id="l00052" name="l00052"></a> 52 template &lt;EForcePipelineFunctions function&gt;

<a id="l00053" name="l00053"></a> 53 inline __host__ __device__ void run(FORCE_KERNEL_PARAMETERS) const

<a id="l00054" name="l00054"></a> 54 {

<a id="l00055" name="l00055"></a> 55 if constexpr (function == fpfComputeNormalForce)

<a id="l00056" name="l00056"></a> 56 {

<a id="l00057" name="l00057"></a> 57 device::builtin_contact_normal_forces(FORCE_KERNEL_ARGUMENTS);

<a id="l00058" name="l00058"></a> 58 }

<a id="l00059" name="l00059"></a> 59 else if constexpr (function == fpfComputeTangentialForce)

<a id="l00060" name="l00060"></a> 60 {

<a id="l00061" name="l00061"></a> 61 device::builtin_contact_tangential_forces(FORCE_KERNEL_ARGUMENTS);

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

<a id="l00063" name="l00063"></a> 63 else if constexpr (function == fpfComputeImpactEnergy)

<a id="l00064" name="l00064"></a> 64 {

<a id="l00065" name="l00065"></a> 65 device::builtin_impact_energies(FORCE_KERNEL_ARGUMENTS);

<a id="l00066" name="l00066"></a> 66 }

<a id="l00067" name="l00067"></a> 67 else if constexpr (function == fpfComputeRollingResistance)

<a id="l00068" name="l00068"></a> 68 {

<a id="l00069" name="l00069"></a> 69 device::standard_compute_rolling_resistance(FORCE_KERNEL_ARGUMENTS);

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

<a id="l00071" name="l00071"></a> 71 }

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

<a id="l00073" name="l00073"></a> 73 

<a id="l00074" name="l00074"></a> 74\#define SPECIALIZE\_RUN\_TO\_FORCE\_KERNEL(func\_name) \\

<a id="l00075" name="l00075"></a> 75 } /\* force kernel \*/ \\

<a id="l00076" name="l00076"></a> 76 } /\* extern C \*/ \\

<a id="l00077" name="l00077"></a> 77 template &lt;&gt; \\

<a id="l00078" name="l00078"></a> 78 inline \_\_host\_\_ \_\_device\_\_ void ForcePipelineFunctions::run&lt;CAMEL\_CASE\_ENUM(func\_name)&gt;(\\

<a id="l00079" name="l00079"></a> 79 FORCE\_KERNEL\_PARAMETERS) const \\

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

<a id="l00081" name="l00081"></a> 81 func\_name(FORCE\_KERNEL\_ARGUMENTS); \\

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

<a id="l00083" name="l00083"></a> 83 extern "C" {

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

<a id="l00085" name="l00085"></a> 85// Contact frictional forces, energy function, and rolling resistance head macros ==================

<a id="l00086" name="l00086"></a> 86\#define FORCE\_KERNEL\_DEFINITION\_HEADER(name, contact, intermediate\_data, output\_data, data) \\

<a id="l00087" name="l00087"></a> 87 extern "C" ROCKYAPI\_EXPORT ROCKY\_FUNCTIONS void name( \\

<a id="l00088" name="l00088"></a> 88 IRockyContact&amp;(contact), \\

<a id="l00089" name="l00089"></a> 89 IRockyContactIntermediateData&amp;(intermediate\_data), \\

<a id="l00090" name="l00090"></a> 90 IRockyContactOutputData&amp;(output\_data), \\

<a id="l00091" name="l00091"></a> 91 void\*(data)) \\

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

<a id="l00093" name="l00093"></a> 93\#define ROCKY\_PLUGIN\_NORMAL\_FORCE\_ON\_CONTACTS(contact, intermediate\_data, output\_data, data) \\

<a id="l00094" name="l00094"></a> 94 FORCE\_KERNEL\_DEFINITION\_HEADER( \\

<a id="l00095" name="l00095"></a> 95 compute\_normal\_force, contact, intermediate\_data, output\_data, data)

<a id="l00096" name="l00096"></a> 96\#define ROCKY\_PLUGIN\_TANGENTIAL\_FORCE\_ON\_CONTACTS(contact, intermediate\_data, output\_data, data) \\

<a id="l00097" name="l00097"></a> 97 FORCE\_KERNEL\_DEFINITION\_HEADER( \\

<a id="l00098" name="l00098"></a> 98 compute\_tangential\_force, contact, intermediate\_data, output\_data, data)

<a id="l00099" name="l00099"></a> 99\#define ROCKY\_PLUGIN\_IMPACT\_ENERGY\_ON\_CONTACTS(contact, intermediate\_data, output\_data, data) \\

<a id="l00100" name="l00100"></a> 100 FORCE\_KERNEL\_DEFINITION\_HEADER( \\

<a id="l00101" name="l00101"></a> 101 compute\_impact\_energy, contact, intermediate\_data, output\_data, data)

<a id="l00102" name="l00102"></a> 102\#define ROCKY\_PLUGIN\_ROLLING\_RESISTANCE\_ON\_CONTACTS(contact, intermediate\_data, output\_data, data) \\

<a id="l00103" name="l00103"></a> 103 FORCE\_KERNEL\_DEFINITION\_HEADER( \\

<a id="l00104" name="l00104"></a> 104 compute\_rolling\_resistance, contact, intermediate\_data, output\_data, data)

<a id="l00105" name="l00105"></a> 105 

<a id="l00106" name="l00106"></a> 106// Contact frictional forces and energy function tail macros =======================================

<a id="l00107" name="l00107"></a> 107\#define ROCKY\_PLUGIN\_NORMAL\_FORCE\_ON\_CONTACTS\_END() \\

<a id="l00108" name="l00108"></a> 108 SPECIALIZE\_RUN\_TO\_FORCE\_KERNEL(compute\_normal\_force)

<a id="l00109" name="l00109"></a> 109\#define ROCKY\_PLUGIN\_TANGENTIAL\_FORCE\_ON\_CONTACTS\_END() \\

<a id="l00110" name="l00110"></a> 110 SPECIALIZE\_RUN\_TO\_FORCE\_KERNEL(compute\_tangential\_force)

<a id="l00111" name="l00111"></a> 111\#define ROCKY\_PLUGIN\_IMPACT\_ENERGY\_ON\_CONTACTS\_END() \\

<a id="l00112" name="l00112"></a> 112 SPECIALIZE\_RUN\_TO\_FORCE\_KERNEL(compute\_impact\_energy)

<a id="l00113" name="l00113"></a> 113\#define ROCKY\_PLUGIN\_ROLLING\_RESISTANCE\_ON\_CONTACTS\_END() \\

<a id="l00114" name="l00114"></a> 114 SPECIALIZE\_RUN\_TO\_FORCE\_KERNEL(compute\_rolling\_resistance)

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

<a id="l00116" name="l00116"></a> 116// CUDA Dispatcher function ========================================================================

<a id="l00117" name="l00117"></a> 117\#define ROCKY\_PLUGIN\_OMP\_CONTACT\_MODEL\_FUNCTIONS\_SETUP() \\

<a id="l00118" name="l00118"></a> 118 extern "C" ROCKYAPI\_EXPORT void dispatch\_omp\_frictional\_contact\_forces\_kernels( \\

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

<a id="l00120" name="l00120"></a> 120 { \\

<a id="l00121" name="l00121"></a> 121 ForcePipelineFunctions functions {}; \\

<a id="l00122" name="l00122"></a> 122 rocky::omp::dispatch\_frictional\_contact\_forces\_kernel(model, functions, plugin\_device\_data); \\

<a id="l00123" name="l00123"></a> 123 }

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

<a id="l00125" name="l00125"></a> 125\#ifdef ROCKY\_CUDA\_API

<a id="l00126" name="l00126"></a> 126 #define ROCKY\_PLUGIN\_FINISH\_CONTACT\_MODEL\_FUNCTIONS\_SETUP() \\

<a id="l00127" name="l00127"></a> 127 ROCKY\_PLUGIN\_OMP\_CONTACT\_MODEL\_FUNCTIONS\_SETUP() \\

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

<a id="l00129" name="l00129"></a> 129 extern "C" ROCKYAPI\_EXPORT void dispatch\_cuda\_frictional\_contact\_forces\_kernels( \\

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

<a id="l00131" name="l00131"></a> 131 { \\

<a id="l00132" name="l00132"></a> 132 ForcePipelineFunctions functions {}; \\

<a id="l00133" name="l00133"></a> 133 rocky::cuda::dispatch\_frictional\_contact\_forces\_kernel(model, functions, plugin\_device\_data); \\

<a id="l00134" name="l00134"></a> 134 } \\

<a id="l00135" name="l00135"></a> 135 

<a id="l00136" name="l00136"></a> 136\#else

<a id="l00137" name="l00137"></a> 137 #define ROCKY\_PLUGIN\_FINISH\_CONTACT\_MODEL\_FUNCTIONS\_SETUP() \\

<a id="l00138" name="l00138"></a> 138 ROCKY\_PLUGIN\_OMP\_CONTACT\_MODEL\_FUNCTIONS\_SETUP()

<a id="l00139" name="l00139"></a> 139\#endif

[IRockyContactIntermediateData](structIRockyContactIntermediateData.xhtml)

**Definition** rocky_contact_intermediate_data_api.hpp:17



[IRockyContactOutputData](structIRockyContactOutputData.xhtml)

**Definition** rocky_contact_output_data_api.hpp:37



[IRockyModel](structIRockyModel.xhtml)

**Definition** rocky_api.h:60