int main(int argc, char *argv[]){ int nbParts=20000; float minMax[3][2]={{-1,1},{-1,1},{-1,1}}; float cellSize=2*0.02*1.001;// 2*particle radius + 0.1% float dt=0.002,simTime=5; float dtFrame=0.02; //0.04 <=> 25 frames per seconds int nbDtPerFrame,i; char filename[]="toto.par"; float mass; System *sys; clock_t time; /* FILE *file; float r[3]; file=fopen("filter.plt","w"); fprintf(file,"VARIABLES = x w\n"); r[1]=r[2]=0; for(i=0;i<=100;i++){ r[0]=i/100.; fprintf(file,"%e\t%e\n",i/100.,kernelPoly6(r,1)); } fclose(file); return 0;*/ nbDtPerFrame=dtFrame/dt; sys=createSystem(nbParts,minMax); tmpAddWalls_1(sys); setGrid(sys, cellSize); //printGrid(sys); //test nico //return 0; mass=1000*(minMax[0][1]-minMax[0][0])*(minMax[1][1]-minMax[1][0])*(minMax[2][1]-minMax[2][0])/nbParts; setParticles(sys,0,nbParts-1,mass/4); //for water, ro0=1000kg/m3, so 1000 parts/Liter => mi=1e-3kg setForces(sys); generateParFile(sys,filename,CREATE); i=0; time=clock(); while(sys->time<=simTime){ printf("time = %e (i=%d)\n",sys->time,i);fflush(stdout); updateSys(sys,dt); if((++i)%nbDtPerFrame==0) generateParFile(sys,filename,UPDATE); } time=clock()-time; generateParFile(sys,filename,CLOSE); deleteSystem(sys); updateSys(NULL,0); #ifdef USE_MULTI_THREADING cleanThreads(); #endif printf("done in %f sec!\n", (double)(time)/CLOCKS_PER_SEC); return 0; }
EllipsoidCell::EllipsoidCell(std::string id, int t, CVector c,std::vector<Force> f) { setID(id); setType(t); setCoord(c); setForces(f); resetBoxCol(); }
// Update the simulation when we're not drawing. void idle(void) { if (!frozen) { setForces(); stable_solve(DIM, u, v, u0, v0, visc, dt); diffuse_matter(DIM, u, v, rho, rho0, dt); glutPostRedisplay(); } }
bool Omega7Udp::recieveForce(QByteArray datagram) { double incomingX,incomingY,incomingZ,incomingG; QDataStream in(&datagram,QIODevice::ReadOnly); in.setVersion(QDataStream::Qt_4_8); in.setByteOrder(QDataStream::LittleEndian); in >> incomingX >> incomingY >> incomingZ >> incomingG; setForces(incomingX,incomingY,incomingZ,incomingG); return true; }
bool Omega7Udp::recieveForce() { QByteArray datagram; qint64 readDatagramRecieve; do{ datagram.resize(socket->pendingDatagramSize()); readDatagramRecieve = socket->readDatagram(datagram.data(),datagram.size()); //if (readDatagramRecieve == -1 ) qDebug()<< "unable to read force datagram"; //else qDebug() << "able to read force datagram"; }while(socket->hasPendingDatagrams()); double incomingX,incomingY,incomingZ,incomingG; QDataStream in(&datagram,QIODevice::ReadOnly); in.setVersion(QDataStream::Qt_4_8); in.setByteOrder(QDataStream::LittleEndian); in >> incomingX >> incomingY >> incomingZ >> incomingG; setForces(incomingX,incomingY,incomingZ,incomingG); return true; }
bool Foam::cfdemCloud::evolve ( volScalarField& alpha, volVectorField& Us, volVectorField& U ) { numberOfParticlesChanged_ = false; arraysReallocated_=false; bool doCouple=false; if(!ignore()) { if (dataExchangeM().couple()) { Info << "\n Coupling..." << endl; doCouple=true; // reset vol Fields clockM().start(16,"resetVolFields"); if(verbose_) { Info << "couplingStep:" << dataExchangeM().couplingStep() << "\n- resetVolFields()" << endl; } averagingM().resetVectorAverage(averagingM().UsPrev(),averagingM().UsNext()); voidFractionM().resetVoidFractions(); averagingM().resetVectorAverage(forceM(0).impParticleForces(),forceM(0).impParticleForces(),true); averagingM().resetVectorAverage(forceM(0).expParticleForces(),forceM(0).expParticleForces(),true); averagingM().resetWeightFields(); for (int i=0;i<momCoupleModels_.size(); i++) momCoupleM(i).resetMomSourceField(); if(verbose_) Info << "resetVolFields done." << endl; clockM().stop("resetVolFields"); if(verbose_) Info << "- getDEMdata()" << endl; clockM().start(17,"getDEMdata"); getDEMdata(); clockM().stop("getDEMdata"); if(verbose_) Info << "- getDEMdata done." << endl; // search cellID of particles clockM().start(18,"findCell"); if(verbose_) Info << "- findCell()" << endl; findCells(); if(verbose_) Info << "findCell done." << endl; clockM().stop("findCell"); // set void fraction field clockM().start(19,"setvoidFraction"); if(verbose_) Info << "- setvoidFraction()" << endl; voidFractionM().setvoidFraction(NULL,voidfractions_,particleWeights_,particleVolumes_); if(verbose_) Info << "setvoidFraction done." << endl; clockM().stop("setvoidFraction"); // set particles velocity field clockM().start(20,"setVectorAverage"); setVectorAverages(); clockM().stop("setVectorAverage"); // set particles forces clockM().start(21,"setForce"); if(verbose_) Info << "- setForce(forces_)" << endl; setForces(); if(verbose_) Info << "setForce done." << endl; clockM().stop("setForce"); // get next force field clockM().start(22,"setParticleForceField"); if(verbose_) Info << "- setParticleForceField()" << endl; averagingM().setVectorSum ( forceM(0).impParticleForces(), impForces_, particleWeights_, NULL //mask ); averagingM().setVectorSum ( forceM(0).expParticleForces(), expForces_, particleWeights_, NULL //mask ); if(verbose_) Info << "- setParticleForceField done." << endl; clockM().stop("setParticleForceField"); // write DEM data if(verbose_) Info << " -giveDEMdata()" << endl; clockM().start(23,"giveDEMdata"); giveDEMdata(); clockM().stop("giveDEMdata"); }//end dataExchangeM().couple() Info << "\n timeStepFraction() = " << dataExchangeM().timeStepFraction() << endl; clockM().start(24,"interpolateEulerFields"); // update smoothing model smoothingM().dSmoothing(); //============================================ // update voidFractionField V1 alpha = voidFractionM().voidFractionInterp(); smoothingM().smoothen(alpha); if(dataExchangeM().couplingStep() < 2) { alpha.oldTime() = alpha; // supress volume src alpha.oldTime().correctBoundaryConditions(); } alpha.correctBoundaryConditions(); // calc ddt(voidfraction) //calcDdtVoidfraction(voidFractionM().voidFractionNext()); calcDdtVoidfraction(alpha); // update particle velocity Field Us = averagingM().UsInterp(); //smoothingM().smoothenReferenceField(Us); Us.correctBoundaryConditions(); /*//============================================ // update voidFractionField volScalarField oldAlpha = alpha.oldTime(); //save old (smooth) alpha field alpha.oldTime().internalField() = voidFractionM().voidFractionInterp(); smoothingM().smoothen(alpha); alpha.correctBoundaryConditions(); alpha.oldTime() = oldAlpha; //set old (smooth) alpha field to allow correct computation of ddt // calc ddt(voidfraction) if (doCouple) calcDdtVoidfraction(alpha); //calcDdtVoidfraction(alpha); // alternative with scale=1! (does not see change in alpha?) // update particle velocity Field Us.oldTime().internalField() = averagingM().UsInterp(); smoothingM().smoothenReferenceField(Us); Us.correctBoundaryConditions(); //============================================*/ clockM().stop("interpolateEulerFields"); if(verbose_){ #include "debugInfo.H" } clockM().start(25,"dumpDEMdata"); // do particle IO IOM().dumpDEMdata(); clockM().stop("dumpDEMdata"); }//end ignore return doCouple; }
/*compute forces, at time t, get new velocity based on forces, * and update particles position. * */ int updateSys(System *sys, float dt){ float ft[3]; //total force on particle. int alpha; //x,y,z index Particle *part; // float fgs[3][3]={{0,0,-9.81},{9.81,0,0},{0,0,9.81}}; //testnico just for fun // float *fg; // static float angle=0, gravity; static clock_t timeFreeFlight=0; static clock_t timeTracking=0; static clock_t timePPCollision=0; clock_t time1, time2; if(sys==NULL){ //testnico printf("free flight: %f sec; tracking: %f sec; collision: %f sec\n", (float)timeFreeFlight/CLOCKS_PER_SEC, (float)timeTracking/CLOCKS_PER_SEC, (float)timePPCollision/CLOCKS_PER_SEC); return 0; } time1=clock(); #ifdef USE_MULTI_THREADING freeFlightMT(sys, dt, THREAD_NUM); time2=clock(); timeFreeFlight+=time2-time1; time1=time2; setParticlesGrid(sys->grid, sys->parts, sys->nbParts); time2=clock(); timeTracking+=time2-time1; time1=time2; checkPPCollisionMT(sys, THREAD_NUM); #else for(part=sys->parts; part<sys->parts+sys->nbParts; part++){ freeFlight(part,dt,sys->walls,sys->nbWalls); // setParticleCell(part, sys); } time2=clock(); timeFreeFlight+=time2-time1; time1=time2; setParticlesGrid(sys->grid, sys->parts, sys->nbParts); time2=clock(); timeTracking+=time2-time1; time1=time2; checkPPCollision(sys, sys->grid->cells, sys->grid->ncells); #endif time2=clock(); timePPCollision+=time2-time1; time1=time2; // angle+=(2*M_PI/4)*dt; // if(angle>2*M_PI) // angle-=2*M_PI; // if(sys->time<1) // gravity=0; // else // gravity=9.81*sin((sys->time-3)*(2*M_PI/4)); // gravity=9.81; // gravity=2; for(part=sys->parts; part<sys->parts+sys->nbParts; part++){ for(alpha=0;alpha<3;alpha++){ ft[alpha] =part->fp[alpha]; ft[alpha]+=part->fs[alpha]; ft[alpha]+=part->fv[alpha]; //part->vel[alpha]+=dt*(ft[alpha]/part->ro+part->fg[alpha]); part->vel[alpha]+=dt*part->fg[alpha]; // {//testnico just for fun // if(sys->time<3) // fg=fgs[0]; // else if(sys->time<6) // fg=fgs[1]; // else // fg=fgs[2]; // part->vel[alpha]+=dt*fg[alpha]; // } } // {//testnico just for fun rotating gravity field // part->vel[0]+=dt*(part->fg[0]*cos(angle)-part->fg[2]*sin(angle)); // part->vel[1]+=dt*part->fg[1]; // part->vel[2]+=dt*(part->fg[0]*sin(angle)+part->fg[2]*cos(angle)); // } // {//testnico just for fun : normal force // float norm; // for(alpha=0, norm=0; alpha<3; alpha++) // norm+=part->pos[alpha]*part->pos[alpha]; // norm=sqrt(norm); // if(norm>0.01){ // for(alpha=0; alpha<3; alpha++) // part->vel[alpha]-=dt*(part->pos[alpha]/norm)*gravity; //+= to repulse, -= to attract // } // } // {//testnico just for fun : tangential force for few seconds // if(sys->time<5) // { // float norm; // norm=sqrt(part->pos[0]*part->pos[0]+part->pos[2]*part->pos[2]); // if(norm>0.01){ // part->vel[0]+=dt*(part->pos[2]/norm)*gravity; // part->vel[2]-=dt*(part->pos[0]/norm)*gravity; // } // } // else{ // part->vel[2]-=dt*9.81; // } // } } setForces(sys); sys->time+=dt; sys->prevDt=dt; return 0; }
bool Foam::cfdemCloud::evolve ( volScalarField& alpha, volVectorField& Us, volVectorField& U ) { numberOfParticlesChanged_ = false; arraysReallocated_=false; bool doCouple=false; if(!ignore()) { if (dataExchangeM().doCoupleNow()) { Info << "\n Coupling..." << endl; dataExchangeM().couple(0); doCouple=true; // reset vol Fields clockM().start(16,"resetVolFields"); if(verbose_) { Info << "couplingStep:" << dataExchangeM().couplingStep() << "\n- resetVolFields()" << endl; } averagingM().resetVectorAverage(averagingM().UsPrev(),averagingM().UsNext(),false); resetVoidFraction(); averagingM().resetVectorAverage(forceM(0).impParticleForces(),forceM(0).impParticleForces(),true); averagingM().resetVectorAverage(forceM(0).expParticleForces(),forceM(0).expParticleForces(),true); averagingM().resetWeightFields(); for (int i=0;i<momCoupleModels_.size(); i++) momCoupleM(i).resetMomSourceField(); if(verbose_) Info << "resetVolFields done." << endl; clockM().stop("resetVolFields"); if(verbose_) Info << "- getDEMdata()" << endl; clockM().start(17,"getDEMdata"); getDEMdata(); clockM().stop("getDEMdata"); if(verbose_) Info << "- getDEMdata done." << endl; // search cellID of particles clockM().start(18,"findCell"); if(verbose_) Info << "- findCell()" << endl; findCells(); if(verbose_) Info << "findCell done." << endl; clockM().stop("findCell"); // set void fraction field clockM().start(19,"setvoidFraction"); if(verbose_) Info << "- setvoidFraction()" << endl; setVoidFraction(); if(verbose_) Info << "setvoidFraction done." << endl; clockM().stop("setvoidFraction"); // set average particles velocity field clockM().start(20,"setVectorAverage"); setVectorAverages(); //Smoothen "next" fields smoothingM().dSmoothing(); smoothingM().smoothen(voidFractionM().voidFractionNext()); //only smoothen if we use implicit force coupling in cells void of particles //because we need unsmoothened Us field to detect cells for explicit //force coupling if(!treatVoidCellsAsExplicitForce()) smoothingM().smoothenReferenceField(averagingM().UsNext()); clockM().stop("setVectorAverage"); } //============================================ //CHECK JUST TIME-INTERPOATE ALREADY SMOOTHENED VOIDFRACTIONNEXT AND UsNEXT FIELD // IMPLICIT FORCE CONTRIBUTION AND SOLVER USE EXACTLY THE SAME AVERAGED // QUANTITIES AT THE GRID! Info << "\n timeStepFraction() = " << dataExchangeM().timeStepFraction() << endl; clockM().start(24,"interpolateEulerFields"); // update voidFractionField setAlpha(alpha); if(dataExchangeM().couplingStep() < 2) { alpha.oldTime() = alpha; // supress volume src alpha.oldTime().correctBoundaryConditions(); } alpha.correctBoundaryConditions(); // calc ddt(voidfraction) calcDdtVoidfraction(alpha,Us); // update mean particle velocity Field Us = averagingM().UsInterp(); Us.correctBoundaryConditions(); clockM().stop("interpolateEulerFields"); //============================================ if(doCouple) { // set particles forces clockM().start(21,"setForce"); if(verbose_) Info << "- setForce(forces_)" << endl; setForces(); if(verbose_) Info << "setForce done." << endl; calcMultiphaseTurbulence(); if(verbose_) Info << "calcMultiphaseTurbulence done." << endl; clockM().stop("setForce"); // get next force field clockM().start(22,"setParticleForceField"); if(verbose_) Info << "- setParticleForceField()" << endl; setParticleForceField(); if(verbose_) Info << "- setParticleForceField done." << endl; clockM().stop("setParticleForceField"); // write DEM data if(verbose_) Info << " -giveDEMdata()" << endl; clockM().start(23,"giveDEMdata"); giveDEMdata(); clockM().stop("giveDEMdata"); dataExchangeM().couple(1); }//end dataExchangeM().couple() if(verbose_){ #include "debugInfo.H" } clockM().start(25,"dumpDEMdata"); // do particle IO IOM().dumpDEMdata(); clockM().stop("dumpDEMdata"); }//end ignore return doCouple; }