Esempio n. 1
0
void dgSolver::InitJacobianMatrix()
{
	m_jacobianMatrixRowAtomicIndex = 0;
	for (dgInt32 i = 0; i < m_threadCounts; i++) {
		m_world->QueueJob(InitJacobianMatrixKernel, this, NULL, "dgSolver::InitJacobianMatrix");
	}
	m_world->SynchronizationBarrier();

	dgBodyProxy* const bodyProxyArray = m_bodyProxyArray;
	dgBodyJacobianPair* const bodyJacobiansPairs = m_bodyJacobiansPairs;
	const dgInt32 entryCount = m_cluster->m_jointCount * 2;
	dgSort(bodyJacobiansPairs, entryCount, CompareBodyJointsPairs);
	for (dgInt32 i = entryCount - 1; i >= 0; i--) {
		dgInt32 index = bodyJacobiansPairs[i].m_bodyIndex;
		bodyProxyArray[index].m_jointStart = i;
	}

	for (dgInt32 i = 0; i < m_threadCounts; i++) {
		m_world->QueueJob(InitInternalForcesKernel, this, NULL, "dgSolver::InitInternalForces");
	}
	m_world->SynchronizationBarrier();

	dgJacobian* const internalForces = &m_world->GetSolverMemory().m_internalForcesBuffer[0];
	internalForces[0].m_linear = m_zero;
	internalForces[0].m_angular = m_zero;

	dgJointInfo* const jointArray = m_jointArray;
	dgSort(jointArray, m_cluster->m_jointCount, CompareJointInfos);

	const dgInt32 jointCount = m_jointCount * DG_SOA_WORD_GROUP_SIZE;
	for (dgInt32 i = m_cluster->m_jointCount; i < jointCount; i++) {
		memset(&jointArray[i], 0, sizeof(dgJointInfo));
	}

	dgInt32 size = 0;
	for (dgInt32 i = 0; i < jointCount; i += DG_WORK_GROUP_SIZE) {
		const dgConstraint* const joint1 = jointArray[i + DG_WORK_GROUP_SIZE - 1].m_joint;
		if (joint1) {
			if (!(joint1->GetBody0()->m_resting & joint1->GetBody1()->m_resting)) {
				const dgConstraint* const joint0 = jointArray[i].m_joint;
				if (joint0->GetBody0()->m_resting & joint0->GetBody1()->m_resting) {
					SortWorkGroup(i);
				}
			}
		} else {
			SortWorkGroup(i);
		}
		size += jointArray[i].m_pairCount;
	}
	m_massMatrix.ResizeIfNecessary(size);

	m_soaRowsCount = 0;
	for (dgInt32 i = 0; i < m_threadCounts; i++) {
		m_world->QueueJob(TransposeMassMatrixKernel, this, NULL, "dgSolver::TransposeMassMatrix");
	}
	m_world->SynchronizationBarrier();
}
Esempio n. 2
0
void dgSolver::InitJacobianMatrix()
{
	DG_TRACKTIME();
	m_jacobianMatrixRowAtomicIndex = 0;
	dgJacobian* const internalForces = &m_world->GetSolverMemory().m_internalForcesBuffer[0];
	memset(internalForces, 0, m_cluster->m_bodyCount * sizeof (dgJacobian));

	for (dgInt32 i = 0; i < m_threadCounts; i++) {
		m_world->QueueJob(InitJacobianMatrixKernel, this, NULL, "dgSolver::InitJacobianMatrix");
	}
	m_world->SynchronizationBarrier();

	dgJointInfo* const jointArray = m_jointArray;
//	dgSort(jointArray, m_cluster->m_jointCount, CompareJointInfos);
	dgParallelSort(*m_world, jointArray, m_cluster->m_jointCount, CompareJointInfos);

	const dgInt32 jointCount = m_jointCount * DG_SOA_WORD_GROUP_SIZE;
	for (dgInt32 i = m_cluster->m_jointCount; i < jointCount; i++) {
		memset(&jointArray[i], 0, sizeof(dgJointInfo));
	}

	dgInt32 size = 0;
	for (dgInt32 i = 0; i < jointCount; i += DG_SOA_WORD_GROUP_SIZE) {
		const dgConstraint* const joint1 = jointArray[i + DG_SOA_WORD_GROUP_SIZE - 1].m_joint;
		if (joint1) {
			if (!(joint1->GetBody0()->m_resting & joint1->GetBody1()->m_resting)) {
				const dgConstraint* const joint0 = jointArray[i].m_joint;
				if (joint0->GetBody0()->m_resting & joint0->GetBody1()->m_resting) {
					SortWorkGroup(i);
				}
			}
			for (dgInt32 j = 0; j < DG_SOA_WORD_GROUP_SIZE; j++) {
				dgConstraint* const joint = jointArray[i + j].m_joint;
				joint->SetIndex (i + j);
			}
		} else {
			SortWorkGroup(i);
			for (dgInt32 j = 0; j < DG_SOA_WORD_GROUP_SIZE; j++) {
				dgConstraint* const joint = jointArray[i + j].m_joint;
				if (joint) {
					joint->SetIndex (i + j);
				}
			}
		}
		size += jointArray[i].m_pairCount;
	}
	m_massMatrix.ResizeIfNecessary(size);

	m_soaRowsCount = 0;
	for (dgInt32 i = 0; i < m_threadCounts; i++) {
		m_world->QueueJob(TransposeMassMatrixKernel, this, NULL, "dgSolver::TransposeMassMatrix");
	}
	m_world->SynchronizationBarrier();
}