<!-- GranularGranularContact -->
<SolveKernel name="GaussSeidelIteration" implementations="GranularGranularContact_NORMAL, GranularGranularContact_FRICTION, GranularGranularContact_ROLLING_RESISTANCE, GranularGranularContact_TWIST_RESISTANCE">
  <Parameter.EntityData name="constraint" bind="@GranularGranularContactConstraint" type="ContactConstraint" read="body1, body2, materialIndex, contactIndex, isImpacting"/>
  <Parameter.EntityData name="constraintRow" bind="@GranularGranularContactConstraint.Row" type="Particle.ContactConstraintRow" read="rhs, lambda, epsilon, invD" write="lambda"/>

  <Parameter.EntityData name="particle" bind="@SolveBody" type="SolveBody" read="velocity, angularVelocity" write="velocity, angularVelocity"/>
  <!-- <Parameter.EntityData name="contactMaterial" bind="@ContactMaterial" type="ContactMaterial" read="adhesion, friction, adhesiveOverlap"/> -->
  
  <Parameter.Array name="jacobianStorage" bind="@GranularGranularContactConstraintJacobianStorage" mode="READ" type="Jacobian6DOFElement"/>
  <Parameter.Array name="GMinvStorage" bind="@GranularGranularContactConstraintGMInvStorage" mode="READ" type="Jacobian6DOFElement"/>
  
  <Parameter.EntityData name="@SolveMaterial" type="SolveMaterial" read="adhesiveImpulse, friction"/>
</SolveKernel>


<!-- GranularGeometryContact -->
<SolveKernel name="GaussSeidelIteration" implementations="GranularGeometryContact_NORMAL, GranularGeometryContact_FRICTION, GranularGeometryContact_ROLLING_RESISTANCE, GranularGeometryContact_TWIST_RESISTANCE">
  <Parameter.EntityData name="constraint" bind="@GranularBodyContactConstraint" type="ContactConstraint" read="body1, body2, materialIndex"/>
  <Parameter.EntityData name="constraintRow" bind="@GranularBodyContactConstraint.Row" type="Particle.ContactConstraintRow" read="rhs, lambda, epsilon, invD" write="lambda"/>

  <Parameter.EntityData name="particle" bind="@SolveBody" type="SolveBody" read="velocity, angularVelocity" write="velocity, angularVelocity"/>
  <Parameter.EntityData name="@RigidBody" type="RigidBody" read="state, velocity, angularVelocity" write="velocity, angularVelocity"/>

  <!-- <Parameter.EntityData name="@ContactMaterial" type="ContactMaterial" read="adhesion, friction"/> -->

  <Parameter.Array name="jacobianStorage" bind="@GranularGeometryContactConstraintJacobianStorage" mode="READ" type="Jacobian6DOFElement"/>
  <Parameter.Array name="GMinvStorage" bind="@GranularGeometryContactConstraintGMInvStorage" mode="READ" type="Jacobian6DOFElement"/>

  <Parameter.EntityData name="@SolveMaterial" type="SolveMaterial" read="adhesiveImpulse, friction"/>
</SolveKernel>




<!-- BandwidthTest -->
<SolveKernel name="GaussSeidelIteration" implementation="BandwidthTest">
  <Parameter.EntityData name="constraint" bind="@GranularGranularContactConstraint" type="ContactConstraint" read="body1, body2, materialIndex"/>
  <Parameter.EntityData name="constraintRow" bind="@GranularGranularContactConstraint.Row" type="Particle.ContactConstraintRow" read="rhs, lambda, epsilon, invD" write="lambda"/>

  <Parameter.EntityData name="solveBody" bind="@SolveBody" type="SolveBody" read="velocity, angularVelocity" write="velocity, angularVelocity"/>
  
  <!-- <Parameter.EntityData name="@ContactMaterial" type="ContactMaterial" read="adhesion, friction"/> -->
  <!-- <Parameter.Scalar name="timeStep" bind="@clock.timeStep" type="Real"/> -->
</SolveKernel>
