Beispiel #1
0
void Geometry::Update_All(Grid* p,Grid* u,Grid* v,real_t pL,real_t pR) const {
	Iterator it = Iterator(this);
	it.First();
	while (it.Valid()){
		//cout<<it.Value()<<"b:"<< _b->Cell(it)<<endl;
		if(_b->Cell(it)==0){
			//Mach nichts da keine Randpunkt
		}
		else if(_b->Cell(it)==1){//no Slip Bedingung
			if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//nichts tun da alle Ränder auch Rand sind.
			}
			else if(_b->Cell(it.Right())==0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//Rechts ist Wasser
				p->Cell(it)=p->Cell(it.Right());
				u->Cell(it)=0;
				v->Cell(it)=-1*(v->Cell(it.Right()));
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())==0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//Oben ist Wasser
				p->Cell(it)=p->Cell(it.Top());
				u->Cell(it)=-1*(u->Cell(it.Top()));
				v->Cell(it)=0;
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())==0 && _b->Cell(it.Down())!=0){
				//Links ist Wasser
				p->Cell(it)=p->Cell(it.Left());
				u->Cell(it)=0;
				u->Cell(it.Left())=0;
				v->Cell(it)=-1*(v->Cell(it.Left()));
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())==0){
				//Unten ist Wasser
				p->Cell(it)=p->Cell(it.Down());
				u->Cell(it)=-1*(u->Cell(it.Down()));
				v->Cell(it)=0;
				v->Cell(it.Down())=0;
			}
			else if(_b->Cell(it.Right())==0 && _b->Cell(it.Top())==0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//Rechts und Oben ist Wasser
				p->Cell(it)=( p->Cell(it.Right())+p->Cell(it.Top()) )/2.0; // Mittelwert des Druckes
				u->Cell(it)=0;
				v->Cell(it)=0;
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())==0 && _b->Cell(it.Left())==0 && _b->Cell(it.Down())!=0){
				//Oben und Links ist Wasser
				p->Cell(it)=( p->Cell(it.Left())+p->Cell(it.Top()) )/2.0; // Mittelwert des Druckes
				u->Cell(it)=0;
				u->Cell(it.Left())=0;;
				v->Cell(it)=0;
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())==0 && _b->Cell(it.Down())==0){
				//Links und Unten ist Wasser
				p->Cell(it)=( p->Cell(it.Left())+p->Cell(it.Down()) )/2.0; // Mittelwert des Druckes
				u->Cell(it)=0;
				u->Cell(it.Left())=0;;
				v->Cell(it)=0;
				v->Cell(it.Down())=0;

			}
			else if(_b->Cell(it.Right())==0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())==0){
				//Unten und Rechts ist Wasser
				p->Cell(it)=( p->Cell(it.Down())+p->Cell(it.Right()) )/2.0; // Mittelwert des Druckes
				u->Cell(it)=0;
				v->Cell(it)=0;
				v->Cell(it.Down())=0;
			}
			else if(_b->Cell(it.Right())==0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())==0 && _b->Cell(it.Down())!=0){
				//Links und Rechts ist Wasser
				//Rechts ist Wasser
				p->Cell(it)= 0.5*(p->Cell(it.Right()) + p->Cell(it.Left()));
				//p->Cell(it)=p->Cell(it.Right());
				u->Cell(it)= 0;
				v->Cell(it)= -0.5*(v->Cell(it.Right()) + v->Cell(it.Left()));
				//v->Cell(it)= -(v->Cell(it.Right()));
				//v->Cell(it.Down())= -(v->Cell(it.Down().Right()));
			}
			else{
				cout<<"Error in CSV File"<< it.Value()<<"Bedingung:"<< _b->Cell(it)<<endl;
			}

		}
		else if(_b->Cell(it)==2){//Slip Bedingung
			cout<<"2 not implemented!"<<endl;
			if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//nichts tun da alle Ränder auch Rand sind.
			}
			else if(_b->Cell(it.Right())==0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//Rechts ist Wasser
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())==0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//Oben ist Wasser
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())==0 && _b->Cell(it.Down())!=0){
				//Links ist Wasser
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())==0){
				//Unten ist Wasser
			}
			else if(_b->Cell(it.Right())==0 && _b->Cell(it.Top())==0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//Rechts und Oben ist Wasser
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())==0 && _b->Cell(it.Left())==0 && _b->Cell(it.Down())!=0){
				//Oben und Links ist Wasser
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())==0 && _b->Cell(it.Down())==0){
				//Links und Unten ist Wasser
			}
			else if(_b->Cell(it.Right())==0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())==0){
				//Unten und Rechts ist Wasser
			}
			else{
				cout<<"Error in CSV File"<< it.Value()<<"Bedingung:"<< _b->Cell(it)<<endl;
			}


		}
		else if(_b->Cell(it)==3){//linker Rand OUTFLOW Bedingung
			if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//nichts tun da alle Ränder auch Rand sind.
			}
			else if(_b->Cell(it.Right())==0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//Rechts ist Wasser
				p->Cell(it)= 2.0*pL - p->Cell(it.Right());
				//u->Cell(it.Right()) = u->Cell(it.Right().Right());
				u->Cell(it)= u->Cell(it.Right());
				v->Cell(it)= v->Cell(it.Right());
				//u->Cell(it) = 1.0;
				//v->Cell(it) = 0.0;//2.0*0.0 - v->Cell(it.Right());
				//p->Cell(it) = p->Cell(it.Right());
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())==0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//Oben ist Wasser
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())==0 && _b->Cell(it.Down())!=0){
				//Links ist Wasser
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())==0){
				//Unten ist Wasser
			}
			else if(_b->Cell(it.Right())==0 && _b->Cell(it.Top())==0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//Rechts und Oben ist Wasser
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())==0 && _b->Cell(it.Left())==0 && _b->Cell(it.Down())!=0){
				//Oben und Links ist Wasser
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())==0 && _b->Cell(it.Down())==0){
				//Links und Unten ist Wasser
			}
			else if(_b->Cell(it.Right())==0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())==0){
				//Unten und Rechts ist Wasser
			}
			else{
				cout<<"Error in CSV File"<< it.Value()<<"Bedingung:"<< _b->Cell(it)<<endl;
			}


		}
		else if(_b->Cell(it)==4){//rechter Rand OUTFLOW Bedingung
			if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//nichts tun da alle Ränder auch Rand sind.
			}
			else if(_b->Cell(it.Right())==0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//Rechts ist Wasser
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())==0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//Oben ist Wasser
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())==0 && _b->Cell(it.Down())!=0){
				//Links ist Wasser
				//real_t tmp = 1.0; //p->Cell(it.Left());//2.0*1.0 - p->Cell(it.Left());
				//cout << p->Cell(it.Left()) << endl;
				p->Cell(it)= 2.0*pR - p->Cell(it.Left());

				//u->Cell(it.Left())=u->Cell(it.Left().Left());
				u->Cell(it)=u->Cell(it.Left());
				v->Cell(it)=v->Cell(it.Left());
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())==0){
				//Unten ist Wasser
			}
			else if(_b->Cell(it.Right())==0 && _b->Cell(it.Top())==0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//Rechts und Oben ist Wasser
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())==0 && _b->Cell(it.Left())==0 && _b->Cell(it.Down())!=0){
				//Oben und Links ist Wasser
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())==0 && _b->Cell(it.Down())==0){
				//Links und Unten ist Wasser
			}
			else if(_b->Cell(it.Right())==0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())==0){
				//Unten und Rechts ist Wasser
			}
			else{
				cout<<"Error in CSV File"<< it.Value()<<"Bedingung:"<< _b->Cell(it)<<endl;
			}


		}
		else if(_b->Cell(it)==5){//oben INFLOW Bedingung (driven Cavity)
			if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//nichts tun da alle Ränder auch Rand sind.
			}
			else if(_b->Cell(it.Right())==0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//Rechts ist Wasser
				p->Cell(it)= p->Cell(it.Right());
				u->Cell(it)=1.0;//u->Cell(it.Right());
				v->Cell(it)= 0;//v->
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())==0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//Oben ist Wasser
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())==0 && _b->Cell(it.Down())!=0){
				//Links ist Wasser
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())==0){
				//Unten ist Wasser
				p->Cell(it)=p->Cell(it.Down());
				u->Cell(it)=2.0-(u->Cell(it.Down()));
				v->Cell(it)=0;
				v->Cell(it.Down())=0;

			}
			else if(_b->Cell(it.Right())==0 && _b->Cell(it.Top())==0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())!=0){
				//Rechts und Oben ist Wasser
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())==0 && _b->Cell(it.Left())==0 && _b->Cell(it.Down())!=0){
				//Oben und Links ist Wasser
			}
			else if(_b->Cell(it.Right())!=0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())==0 && _b->Cell(it.Down())==0){
				//Links und Unten ist Wasser
			}
			else if(_b->Cell(it.Right())==0 && _b->Cell(it.Top())!=0 && _b->Cell(it.Left())!=0 && _b->Cell(it.Down())==0){
				//Unten und Rechts ist Wasser
			}
			else{
				cout<<"Error in CSV File"<< it.Value()<<"Bedingung:"<< _b->Cell(it)<<endl;
			}


		}
		it.Next();
	}
}