<Kernel name="CalculateContactZoneAssignments" implementation="ParticlePairContact">
  <Parameter.Array name="@ActiveParticlePairContacts" type="UInt:32bit" mode="READ"/>
  <Parameter.EntityData name="@ParticlePairContact" type="ParticlePairContact" read="particle1, particle2" write="contactZoneIndex, contactZoneSlot"/>
  <Parameter.EntityData name="@Particle" type="Particle" read="cellIndex"/>
  <Parameter.EntityData name="@Cell" type="HierarchicalGrid.Cell" read="parent, id"/>

  <Parameter.EntityData name="@GridTier" type="GridTier" read="zoneTable" write=""/>
  <!-- <Parameter.HashTable name="@ZoneTable" bucketType="Vec3i | Physics.HierarchicalGrid.ContactZonePtr" mode="READ" typedef="ContactZoneTable"/> -->

  <Parameter.Array name="@MissingParticlePairContactZones" type="UInt:32bit" globalResult="TRUNCATE"/>
  <Parameter.Array name="@TierDependencyParticleContacts" type="UInt:32bit" globalResult="TRUNCATE"/>

  <Parameter.Scalar name="@ContactZoneAccumulationLevel" type="UInt" mode="READ"/>
</Kernel>


<!--  -->
<Kernel name="CalculateContactZoneAssignments" implementation="ParticleGeometryContact">
  <Parameter.Array name="@ActiveParticleGeometryContacts" type="UInt:32bit" mode="READ"/>
  <Parameter.EntityData name="@ParticleGeometryContact" type="ParticleGeometryContact" read="particle, geometry" write="contactZoneIndex, contactZoneSlot"/>
  <Parameter.EntityData name="@Particle" type="Particle" read="cellIndex"/>
  <Parameter.EntityData name="@Geometry" type="Geometry" read="cellIndex"/>
  <Parameter.EntityData name="@Cell" type="HierarchicalGrid.Cell" read="parent, id"/>

  <Parameter.EntityData name="@GridTier" type="GridTier" read="zoneTable" write=""/>
  <!-- <Parameter.HashTable name="@ZoneTable" bucketType="Vec3i | Physics.HierarchicalGrid.ContactZonePtr" mode="READ"/> -->

  <Parameter.Array name="@MissingParticleGeometryContactZones" type="UInt:32bit" globalResult="TRUNCATE"/>
  <Parameter.Array name="@TierDependencyParticleGeometryContacts" type="UInt:32bit" globalResult="TRUNCATE"/>

  <Parameter.Scalar name="@ContactZoneAccumulationLevel" type="UInt" mode="READ"/>
</Kernel>


<!--  -->
<Kernel name="CalculateContactZoneAssignments" implementation="GeometryGeometryContact">
  <Parameter.Array name="@ActiveGeometryContacts" type="UInt:32bit" mode="READ"/>
  <Parameter.EntityData name="@GeometryContact" type="GeometryContact" read="geometry1, geometry2" write="contactZoneIndex, contactZoneSlot"/>
  <Parameter.EntityData name="@Geometry" type="Geometry" read="cellIndex" implicit="true"/>
  <!-- <Parameter.EntityData name="@RigidBody" type="RigidBody" read="state"/> -->
  <Parameter.EntityData name="@Cell" type="HierarchicalGrid.Cell" read="parent, id"/>

  <Parameter.EntityData name="@GridTier" type="GridTier" read="zoneTable" write=""/>
  <!-- <Parameter.HashTable name="@ZoneTable" bucketType="Vec3i | Physics.HierarchicalGrid.ContactZonePtr" mode="READ"/> -->

  <Parameter.Array name="@MissingGeometryGeometryContactZones" type="UInt:32bit" globalResult="TRUNCATE"/>
  <Parameter.Array name="@TierDependencyGeometryContacts" type="UInt:32bit" globalResult="TRUNCATE"/>

  <Parameter.Scalar name="@ContactZoneAccumulationLevel" type="UInt" mode="READ"/>

	<Parameter.Pointer name="@Simulation" type="agxSDK::Simulation" include="agxSDK/Simulation.h" implicit="true"/>
	<Parameter.Pointer name="targetSolveModel" type="agx::SolveModel" required="false"/>
	
  <PreJob name="fetchTargetSolveModel"/>
</Kernel>


<!--  -->
<Kernel name="CalculateContactZoneAssignments" implementation="Particle_SolveBody">
  <Parameter.EntityData name="@Particle" type="Particle" read="cellIndex" write="solveBodyIndex"/>
  <Parameter.EntityData name="@Cell" type="HierarchicalGrid.Cell" read="parent, id"/>
  <Parameter.Scalar name="@ContactZoneAccumulationLevel" type="UInt" mode="READ"/>
</Kernel>
