void CExactMethodForDGP::PickShortestPaths(int num) { if (num >= model.GetNumOfVerts()) num = model.GetNumOfVerts(); nTotalCurves = num; m_tableOfResultingPaths.clear(); if (num == 0) return; if (model.GetNumOfFaces() * num < 4e6) { if (num >= model.GetNumOfVerts()) { m_tableOfResultingPaths.reserve(model.GetNumOfVerts()); for (int i = 0; i < model.GetNumOfVerts(); ++i) { BackTrace(i); } } else { float step = model.GetNumOfVerts() / float(num); step = max(1.0f, step); m_tableOfResultingPaths.reserve(int(model.GetNumOfVerts() / step) + 1); for (float i = FLT_EPSILON; i < model.GetNumOfVerts(); i += step) { BackTrace(int(i)); } } } }
void Flow2D::Advect() { float Weights[4]; int PlaquetteIndex[4]; int PlaquetteIndexFull[4]; Int2 Plaquette[2]; int indexFull; Swap(m_Vel.x.aligned, m_TmpVel.x.aligned); Swap(m_Vel.y.aligned, m_TmpVel.y.aligned); for (int i = 0; i < m_Nscalar; i++) { Swap(m_Scalar[i].aligned, m_TmpScalar[i].aligned); } for (int i = 0; i < m_Nsite; i++) { // indexFull = GetIndexFull(i); BackTrace(Plaquette, Weights,i); PlaquetteIndex[0] = GetIndex(Plaquette[0].x, Plaquette[0].y); PlaquetteIndex[1] = GetIndex(Plaquette[1].x, Plaquette[0].y); PlaquetteIndex[2] = GetIndex(Plaquette[0].x, Plaquette[1].y); PlaquetteIndex[3] = GetIndex(Plaquette[1].x, Plaquette[1].y); PlaquetteIndexFull[0] = GetIndexFull(Plaquette[0].x, Plaquette[0].y); PlaquetteIndexFull[1] = GetIndexFull(Plaquette[1].x, Plaquette[0].y); PlaquetteIndexFull[2] = GetIndexFull(Plaquette[0].x, Plaquette[1].y); PlaquetteIndexFull[3] = GetIndexFull(Plaquette[1].x, Plaquette[1].y); m_Vel.x.aligned[indexFull] = 0.0f; m_Vel.y.aligned[indexFull] = 0.0f; for (int j = 0; j < 4; j++) { m_Vel.x.aligned[indexFull] += Weights[j] * m_TmpVel.x.aligned[ PlaquetteIndexFull[j] ]; m_Vel.y.aligned[indexFull] += Weights[j] * m_TmpVel.y.aligned[ PlaquetteIndexFull[j] ]; } for (int k = 0; k < m_Nscalar; k++) { m_Scalar[k].aligned[i] = 0.0f; for (int j = 0; j < 4 ; j++) { m_Scalar[k].aligned[i] += Weights[j] * m_TmpScalar[k].aligned[ PlaquetteIndex[j] ]; } } } SetBoundary(m_Vel.x.aligned); SetBoundary(m_Vel.y.aligned); }