Esempio n. 1
0
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;
}
Esempio n. 2
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;
}