int main(){
	cout<<"LPM Chai test.."<<endl;

	int nx = 32;
	int ny = 8;
	int tMax = 25000;
	double l0 = 0.8e-6/nx;
	double V0 = -10e-3;

	CollisionD2Q9LPMChai *cm = new CollisionD2Q9LPMChai();
	StreamD2Q9Periodic *sm = new StreamD2Q9Periodic();
	LatticeModel *lm = new Lattice2D(nx, ny);
	UnitHandlerLPM *uh = new UnitHandlerLPM();

	uh->setCharLength(l0);
	uh->setCharVoltage(V0);
	cm->setUnitHandler(uh);
	cm->setW(0.5);
	cm->setC(1.0);

	LBM *lbm = new LBM(lm, cm, sm);

	/* Boundaries */
	HeZouPressureNodes *bds = new HeZouPressureNodes();
	//bds->setCollisionModel(cm);
	for(int i = 0; i < ny; i++){
		bds->addNode(0, i, 0, 1.0/1.8);
		bds->addNode(nx-1, i, 0, 1.0/1.8);
	}
	lbm->addBoundaryNodes(bds);

	//NeumannLPMNodes *iobds = new NeumannLPMNodes();
	//iobds->setCollisionModel(cm);
	for(int j = 0; j < ny; j++){
		//iobds->addNode(0, j, 0.0);
		//iobds->addNode(nx-1, j, 0.0);
	}
	//lbm->addBoundaryNodes(iobds);

	/* Initialize solver */
	lbm->init();

	/* Main loop */
	for(int t = 0; t < tMax; t++){
		cout<<t<<endl;
		lbm->collideAndStream();
		lbm->handleBoundaries();
	}

	//lbm->calcMacroscopicVars();
	cm->dataToFile();
	cout<<"done LPM."<<endl;

	return 0;
}
int main(){
	cout<<"LPM Wang Helmholtz..."<<endl;
	int nx = 101;
	int ny = 101;
	int tMax = 20000;
	double l0 = 1;
	double V0 = 1;
	double lambda = 2.0;
	double dt = 1.0/(nx-1)/(nx-1);
	double dx = 1.0/(nx-1);
	double c = dx/dt;
	double omega = 1.0/(1.5*dt/dx/dx + 0.5);

	cout<<"dx: "<<dx<<", dt: "<<dt<<endl;
	cout<<"OMEGA: "<<omega<<endl;

	CollisionD2Q9WangHelmholtz *cm = new CollisionD2Q9WangHelmholtz();
	UnitHandlerLPM *uh = new UnitHandlerLPM();
	StreamD2Q9Periodic *sm = new StreamD2Q9Periodic();//todo
	LatticeModel *lm = new Lattice2D(nx, ny);
	LBM *lbm = new LBM(lm, cm, sm);

	cm->setW(omega);
	cm->setC(c);
	cm->setUnitHandler(uh);
	cm->setLambda(lambda);
	uh->setCharLength(l0);
	uh->setCharVoltage(V0);
	uh->setTimeStep(dt);

	/* Boundaries */
	double mu = sqrt(lambda*lambda + M_PI*M_PI);

	DirichletLPMNodes<CollisionD2Q9WangHelmholtz> *bds =
				new DirichletLPMNodes<CollisionD2Q9WangHelmholtz>();
	bds->setCollisionModel(cm);
	for(int i = 0; i < nx; i++){
		bds->addNode(i, 0, cos(M_PI/(nx-1)*i));
		cout<<cos(M_PI/(nx-1)*i)<<endl;
		bds->addNode(i, ny-1, 0.0);
	}
	for(int j = 1; j < ny-1; j++){//no redundancy on corners..
		bds->addNode(0, j, YBDR(j));
		bds->addNode(nx-1, j, -YBDR(j));
	}

	lbm->addBoundaryNodes(bds);

	/* Initialize solver */
	lbm->init();

	/* Main loop */
	for(int t = 0; t < tMax; t++){
		cout<<t<<endl;
		lbm->collideAndStream();
		lbm->handleBoundaries();
	}

	cm->dataToFile();
	cout<<"done LPM."<<endl;

	return 0;
}