/** OWMax operator * * @param x numeric * @param w numeric * @return numeric of length 1 */ SEXP owmax(SEXP x, SEXP w) { x = prepare_arg_numeric_sorted_inc(x, "x"); return wmax(x, w); }
HugeNumber operator + ( HugeNumber &u, HugeNumber &v) // Slogenie neotrisatelnix selix chisel { word j; dword k; // Cifra perenosa word uk; // Chislo razriadov u word vk; // Chislo razriadov v word wk; // Chislo razriadov w word kw; dword p; HugeNumber w; // Zdes bydem nakaplivat rezyltat vk=v.Razr(); uk=u.Razr(); wk=wmax(uk,vk); kw=wmin(uk,vk); w.Resize(wk+1); // Delaem nygnyiy razriadnost rezyltata k=0; // Symiryem razriadi po samomy korotkomy chisly for (j=0; j<kw; j++) { p=dword(u.digit[j])+dword(v.digit[j])+k; if (p>=base) { k=1; w.digit[j] = word(p & (base-1)); } else { k=0; w.digit[j]= word(p); }; }; // Tiper nado prosymirovat ostavshiesia razriadi dlinnogo chisla i // razriad perenosa. if (k!=0) { // Bil perenos pri symmirovanii po korotkomy chisly // Nado symmirivat ostavshiesia razriady if (uk>vk) { // Symmiryem, poka est cifra perenosa for (; j<uk; j++) { p=u.digit[j]+k; if (p>=base) { k=1; w.digit[j] = word(p & (base-1)); } else { k=0; w.digit[j]= word(p); break; }; } // Kopiryem ostavshiesia razriady if (k==0) for (j++; j<uk; j++) w.digit[j]=u.digit[j]; } else { // Symmiryem, poka est cifra perenosa for (; j<vk; j++) { p=v.digit[j]+k; w.digit[j]= word(p & (base-1)); if (p>=base) { k=1; } else { k=0; break; }; } // Kopiryem ostavshiesia razriady if (k==0) for (j++; j<vk; j++) w.digit[j]=v.digit[j]; }; if (k!=0) { // Symmirovanie provedeno po vsem razriadam, no eshe est // cifra perenosa w.digit[j]=word(k); } } else { // Nebilo perenosa pri symmirovanii po korotkomy chisly // Nado prosto skopirovat ostavshiesia razriady dlinnogo chisla if (vk>uk) for (; j<vk; j++) w.digit[j]=v.digit[j]; else if (uk>vk) for (; j<uk; j++) w.digit[j]=word(u.digit[j]+k); }; return w; };
void btParticlesDynamicsWorld::adjustGrid() { //btVector3 wmin( BT_LARGE_FLOAT, BT_LARGE_FLOAT, BT_LARGE_FLOAT); //btVector3 wmax(-BT_LARGE_FLOAT, -BT_LARGE_FLOAT, -BT_LARGE_FLOAT); btVector3 wmin( BT_LARGE_FLOAT, BT_LARGE_FLOAT, BT_LARGE_FLOAT); btVector3 wmax(-BT_LARGE_FLOAT, -BT_LARGE_FLOAT, -BT_LARGE_FLOAT); btVector3 boxDiag(m_particleRad, m_particleRad, m_particleRad); for(int i = 0; i < m_numParticles; i++) { btVector3 pos = m_hPos[i]; btVector3 boxMin = pos - boxDiag; btVector3 boxMax = pos + boxDiag; wmin.setMin(boxMin); wmax.setMax(boxMax); } m_worldMin = wmin; m_worldMax = wmax; btVector3 wsize = m_worldMax - m_worldMin; wsize[3] = 1.0f; glBindBufferARB(GL_ARRAY_BUFFER, m_colVbo); btVector3* color = (btVector3*)glMapBufferARB(GL_ARRAY_BUFFER, GL_WRITE_ONLY); for(int i = 0; i < m_numParticles; i++, color++) { *color = (m_hPos[i] - m_worldMin) / wsize; (*color)[3] = 1.f; } glUnmapBufferARB(GL_ARRAY_BUFFER); /* wsize[0] *= 0.5f; wsize[1] *= 0.1f; wsize[2] *= 0.5f; m_worldMin -= wsize; m_worldMax += wsize; */ m_worldMin.setValue(-1.f, -1.f, -1.f); m_worldMax.setValue( 1.f, 1.f, 1.f); wsize = m_worldMax - m_worldMin; m_cellSize[0] = m_cellSize[1] = m_cellSize[2] = m_particleRad * btScalar(2.f); m_simParams.m_worldMin[0] = m_worldMin[0]; m_simParams.m_worldMin[1] = m_worldMin[1]; m_simParams.m_worldMin[2] = m_worldMin[2]; m_simParams.m_worldMax[0] = m_worldMax[0]; m_simParams.m_worldMax[1] = m_worldMax[1]; m_simParams.m_worldMax[2] = m_worldMax[2]; m_simParams.m_cellSize[0] = m_cellSize[0]; m_simParams.m_cellSize[1] = m_cellSize[1]; m_simParams.m_cellSize[2] = m_cellSize[2]; m_simParams.m_gridSize[0] = (int)(wsize[0] / m_cellSize[0]); m_simParams.m_gridSize[1] = (int)(wsize[1] / m_cellSize[1]); m_simParams.m_gridSize[2] = (int)(wsize[2] / m_cellSize[2]); m_numGridCells = m_simParams.m_gridSize[0] * m_simParams.m_gridSize[1] * m_simParams.m_gridSize[2]; m_hCellStart.resize(m_numGridCells); unsigned int memSize = sizeof(int) * m_numGridCells; cl_int ciErrNum; m_dCellStart = clCreateBuffer(m_cxMainContext, CL_MEM_READ_WRITE, memSize, NULL, &ciErrNum); oclCHECKERROR(ciErrNum, CL_SUCCESS); }