int main(int argc, char* argv[]){ ////////////////// //Create vars. ////////////////// PS::Initialize(argc, argv); PS::ParticleSystem<RealPtcl> sph_system; sph_system.initialize(); PS::DomainInfo dinfo; dinfo.initialize(); PS::F64 dt, end_time; ////////////////// //Disp. Info ////////////////// DisplayInfo(); ////////////////// //Setup Initial ////////////////// SetupIC(sph_system, &end_time, dinfo); Initialize(sph_system); //Dom. info dinfo.setDomain(PS::Comm::getNumberOfProc(), 1, 1); dinfo.decomposeDomain(); sph_system.exchangeParticle(dinfo); //plant tree PS::TreeForForceShort<RESULT::Dens , EPI::Dens , EPJ::Dens >::Gather dens_tree; PS::TreeForForceShort<RESULT::Drvt , EPI::Drvt , EPJ::Drvt >::Gather drvt_tree; PS::TreeForForceShort<RESULT::Hydro, EPI::Hydro, EPJ::Hydro>::Symmetry hydr_tree; PS::TreeForForceLong <RESULT::Grav , EPI::Grav , EPJ::Grav >::Monopole grav_tree; dens_tree.initialize(sph_system.getNumberOfParticleGlobal()); drvt_tree.initialize(sph_system.getNumberOfParticleGlobal()); hydr_tree.initialize(sph_system.getNumberOfParticleGlobal()); grav_tree.initialize(sph_system.getNumberOfParticleGlobal()); for(int loop = 0 ; loop <= 5 ; ++ loop){ dens_tree.calcForceAllAndWriteBack(CalcDensity() , sph_system, dinfo); } for(PS::S32 i = 0 ; i < sph_system.getNumberOfParticleLocal() ; ++ i){ sph_system[i].setPressure(); } drvt_tree.calcForceAllAndWriteBack(CalcDerivative(), sph_system, dinfo); hydr_tree.calcForceAllAndWriteBack(CalcHydroForce(), sph_system, dinfo); //grav_tree.calcForceAllAndWriteBack(CalcGravityForce(), sph_system, dinfo); grav_tree.calcForceAllAndWriteBack(CalcGravityForce<EPJ::Grav>(), CalcGravityForce<PS::SPJMonopole>(), sph_system, dinfo); dt = getTimeStepGlobal(sph_system); std::cout << std::scientific << std::setprecision(16) << "time = " << time << ", dt = " << dt << std::endl; PS::S32 step = 0; for(PS::F64 time = 0 ; time < end_time ; time += dt, ++ step){ InitialKick(sph_system, dt); FullDrift(sph_system, dt); sph_system.adjustPositionIntoRootDomain(dinfo); Predict(sph_system, dt); dinfo.decomposeDomain(); sph_system.exchangeParticle(dinfo); for(int loop = 0 ; loop <= 2 ; ++ loop){ dens_tree.calcForceAllAndWriteBack(CalcDensity() , sph_system, dinfo); } for(PS::S32 i = 0 ; i < sph_system.getNumberOfParticleLocal() ; ++ i){ sph_system[i].setPressure(); } //std::cout << "push enter..." << std::endl; //getchar(); drvt_tree.calcForceAllAndWriteBack(CalcDerivative(), sph_system, dinfo); hydr_tree.calcForceAllAndWriteBack(CalcHydroForce(), sph_system, dinfo); //grav_tree.calcForceAllAndWriteBack(CalcGravityForce(), sph_system, dinfo); grav_tree.calcForceAllAndWriteBack(CalcGravityForce<EPJ::Grav>(), CalcGravityForce<PS::SPJMonopole>(), sph_system, dinfo); dt = getTimeStepGlobal(sph_system); FinalKick(sph_system, dt); if(step % PARAM::OUTPUT_INTERVAL == 0){ FileHeader header; header.time = time; header.Nbody = sph_system.getNumberOfParticleGlobal(); char filename[256]; sprintf(filename, "result/%04d.dat", step); sph_system.writeParticleAscii(filename, header); if(PS::Comm::getRank() == 0){ std::cout << "//================================" << std::endl; std::cout << "output " << filename << "." << std::endl; std::cout << "//================================" << std::endl; } } if(PS::Comm::getRank() == 0){ std::cout << "//================================" << std::endl; std::cout << std::scientific << std::setprecision(16) << "time = " << time << ", dt = " << dt << std::endl; std::cout << "step = " << step << std::endl; std::cout << "//================================" << std::endl; } CheckConservativeVariables(sph_system); } PS::Finalize(); return 0; }
int main(void){ //allocate varuables particle_t* SPH = new particle_t[N_SPHP]; node_t* node = new node_t[3*N_SPHP]; system_t system; //display Information DisplayInfo(); printf("\n[Push enter key to start calculation...]\n"); getchar(); //make history dir if not exist. if(isExist("history") == false) MakeDir("history"); //set upt initial condition SetUpInitial<double>(SPH); InitializeProperty(SPH); OutputFile(SPH, system); printf("STEP %d (%16.16lf percent)\n", system.step, system.time / TIME * 100.0); /////////// TreeConstruction(SPH, node); TreeTraverse(SPH, node); //GetNeighbour(SPH); /////////// CalcHydroForce(SPH); GetTimestep(SPH, &system); //time integration while(system.time < TIME){ ++ system.step; //Compute v and u at half step. InitialKick(SPH, system.dt); //Advance x (, rho and h) by a full step. FullDrift(SPH, system.dt); //Predict v and u at full step. Predict(SPH, system.dt); //Time becomes t + dt. system.time += system.dt; //Construct Tree. TreeConstruction(SPH, node); for(int l = 0 ; l < 2 ; ++ l){ //Sweep0: Adjust smoothing length. CalcSmoothing(SPH); TreeTraverse(SPH, node); //GetNeighbour(SPH); //Sweep1: Compute density, div_v and rot_v. // Between this sweep, obtain p and c from rho and u. CalcDensity(SPH); } //Sweep2: Compute v_dot and u_dot. CalcHydroForce(SPH); //Set v and u at full step. FinalKick(SPH, system.dt); //Output result. if(system.step % OUTPUT_INTERVAL == 0) OutputFile(SPH, system); //Search dt. GetTimestep(SPH, &system); // CalcConservativeVaruables(SPH, &system); //Print message printf("STEP %d (%16.16lf percent)\n", system.step, system.time / TIME * 100.0); } //free memory. delete []SPH; delete []node; //Return success code. return SUCCESS; }