Ejemplo n.º 1
0
static void test_array_of_events() {
    printf("\r\n********** Starting test_array_of_events **********\r\n");
    const char* testmsg1 = "Test message 1";
    const char* testmsg2 = "Test message 2";
    const int testint = 13;
    VDerived derived(20, 100);
    MyArg arg("array", 5, 10);

    FunctionPointer1<void, const char*> fp1((VBase*)&derived, &VBase::print_virtual_str);
    FunctionPointer0<void> fp2(sa_func_3);
    FunctionPointer1<void, int> fp3(sa_func_2);
    FunctionPointer0<void> fp4(&derived, &VDerived::print_virtual_noargs);
    FunctionPointer1<void, MyArg> fp5(sa_ntc);
    Event events[] = {fp1.bind(testmsg1), fp1.bind(testmsg2), fp2.bind(), fp3.bind(testint),
                      fp4.bind(), fp5.bind(arg)};

    for (unsigned i = 0; i < sizeof(events)/sizeof(events[0]); i ++) {
        events[i].call();
    }
}
Ejemplo n.º 2
0
PyObject *_PY_fp5(PyObject *self, PyObject *args, PyObject *kwds)
   {int ok;
    PyObject *_lo;
    int _la1;
    long *_rv;
    char *kw_list[] = {"a1", NULL};

/* local variable initializations */
    _la1       = 0;

    ok = PyArg_ParseTupleAndKeywords(args, kwds,
                                     "i:fp5_p",
                                     kw_list,
                                     &_la1);
    if (ok == FALSE)
       return(NULL);

    _rv = fp5(_la1);
    _lo = PY_build_object("fp5",
                          G_LONG_I, 0, &_rv,
                          0);

    return(_lo);}
Ejemplo n.º 3
0
Archivo: BEM2D.cpp Proyecto: m1cjey/FSW
//一定要素用のBEM関数
void BEM_main_for_CONSTANT(mpsconfig *CON,vector<point2D> &NODE,vector<element2D> &ELEM,vector<mpsparticle> &PART,int fluid_number,double **F,vector<REGION> &region)
{
	int node_num=int (NODE.size());		//節点数
	int elemnum=int (ELEM.size());		//要素数
	int region_num=(int)(region.size());//領域の数
	int uk=0;								//未知数
	int count;

	cout<<"領域数="<<region_num<<endl;
	
	//未知数計算
	for(int i=0;i<node_num;i++)
	{
		if(NODE[i].boundary_condition==BOTH) uk+=2;	//BOTHは多媒質境界上の節点であり、ポテンシャル、法線微分の両方が未知であることを示す
		else uk++;									//こちらは通常。DiricだろうとNeumnだろうと、片方は未知なので++;
	}
	cout<<"未知数="<<uk<<endl;

	int *Nid=new int [uk];							//i番目の未知数はi番目の計算点であることを示す
	int *bd_type=new int [uk];
	int *BOTH_column=new int [node_num];
	count=0;
	
	for(int i=0;i<elemnum;i++)
	{
		if(ELEM[i].boundary_condition==BOTH)
		{
			Nid[i]=i;		//i番目の未知数はi番目の計算点であることを示す
			bd_type[i]=Neumn;//BOTHの場合、未知数はポテンシャル、法線微分の順に定義する。よってbd_typeはこのようにしておく
			Nid[elemnum+count]=i;
			bd_type[elemnum+count]=Diric;
			BOTH_column[i]=elemnum+count;//i番目の計算点がBOTHのとき、法線微分を表す未知数はBOTH_column[i]番目の未知数である。
			count++;
		}
		else
		{
			Nid[i]=i;				//i番目の未知数はi番目の計算点であることを示す
			bd_type[i]=ELEM[i].boundary_condition;
			BOTH_column[i]=-1;		//BOTHでないならダミーとして−1を格納
		}
	}
	
	
	int gauss_N=4;				//ガウス積分における評価点数 //3,4,8
	int NGS[32];				//たとえばGauss積分点が4のときはfor(int i=NGS[4];i<NGS[4]+4;i++) ep1[i]=~~~~という使いかたをする
	double ep1[32];				//ガウス積分における局所座標格納
	double ep_ln[32];			//自然対数に関するガウス積分における局所座標格納
	double w1[32];				//ガウス積分における重み格納
	double w_ln[32];			//自然対数に関するガウス積分における重み格納

	//ガウス積分の準備
	set_gauss_parameter(NGS, ep1,w1,ep_ln,w_ln);

	//matrix作成
	double **matrixC=new double*[uk];
	for(int n=0;n<uk;n++) matrixC[n]=new double[uk];
	double **matrixC2=new double*[uk];
	for(int n=0;n<uk;n++) matrixC2[n]=new double[uk];
	double **H=new double*[uk];
	for(int n=0;n<uk;n++) H[n]=new double[uk];
	double **G=new double*[uk];
	for(int n=0;n<uk;n++) G[n]=new double[uk];
	double *Bmatrix=new double[uk];//解行列
	
	for(int n=0;n<uk;n++)
	{
		for(int m=0;m<uk;m++)
		{
			matrixC[n][m]=0;				//初期化
			matrixC2[n][m]=0;
			H[n][m]=0;
			G[n][m]=0;
		}
		Bmatrix[n]=0;
	}
	
	for(int ID=0;ID<1;ID++)				//まずは第1領域のみ計算
	{
		for(int n1=region[ID].start;n1<region[ID].end;n1++)
		{	
			int n=n1;
			int n2=BOTH_column[n1];
				
			double SR=0.5*ELEM[n1].L;//要素長さの半分
					
			for(int m1=region[ID].start;m1<region[ID].end;m1++)
			{
				int m=m1;
				int m2=BOTH_column[m1];
					
				int type=0;//type=0なら通常 1なら、その要素は節点nを含む特異積分
				if(n1==m1) type=1;
					
				if(type==0)
				{
					double w;
					double ep;		//評価点の局所座標
					for(int i=NGS[gauss_N];i<NGS[gauss_N]+gauss_N;i++)
					{
						ep=ep1[i];
						w=w1[i];
							
						set_GHmatrix_for_constant(ELEM, ep,  H, G, w, type,n, m,n1,m1);
					}
					if(m2!=-1)
					{
						G[n][m2]=G[n][m];
						G[n][m]=0;
					}
				}
			}
			H[n][n]=PI;
			G[n][n]=2*SR*(1-log(SR));
				

			if(n2!=-1)
			{
				G[n][n2]=G[n][n];
				G[n][n]=0;
			}
		}
	}
	//法線ベクトルを反転
	if(region_num>1) for(int i=0;i<elemnum;i++) for(int D=0;D<2;D++) ELEM[i].direct[D]*=-1.0;
	
	for(int ID=1;ID<region_num;ID++)				//第2領域以降を計算
	{
		for(int n1=region[ID].start;n1<region[ID].end;n1++)
		{	
			int n=BOTH_column[n1];					//計算点n1の、法線微分の未知変数はBOTH_column[n1]番目の未知数
			
			double SR=0.5*ELEM[n1].L;//要素長さの半分
			for(int m1=region[ID].start;m1<region[ID].end;m1++)
			{
				int m=m1;
				int m2=BOTH_column[m1];
				int type=0;//type=0なら通常 1なら、その要素は節点nを含む特異積分
				if(n1==m1) type=1;
					
				if(type==0)
				{
					double w;
					double ep;		//評価点の局所座標
						
					for(int i=NGS[gauss_N];i<NGS[gauss_N]+gauss_N;i++)
					{
						ep=ep1[i];
						w=w1[i];
							
						set_GHmatrix_for_constant(ELEM, ep,  H, G, w, type,n, m,n1,m1);
					}	
					G[n][m2]=-G[n][m]/80;
					//G[n][m2]=-G[n][m]/1;
					G[n][m]=0;
				}
			}
			H[n][n1]=PI;
			G[n][n]=-2*SR*(1-log(SR));
		}
	}
	//法線ベクトルを反転
	if(region_num>1) for(int i=0;i<elemnum;i++) for(int D=0;D<2;D++) ELEM[i].direct[D]*=-1.0;

	//実際に解く係数行列作成
	for(int n=0;n<elemnum;n++)	
	{
		if(ELEM[n].boundary_condition==Diric)
		{
			for(int m=0;m<uk;m++)
			{
				matrixC[m][n]=-G[m][n];
				matrixC2[m][n]=-H[m][n];
			}
		}
		else if(ELEM[n].boundary_condition==Neumn)
		{
			for(int m=0;m<uk;m++)
			{
				matrixC[m][n]=H[m][n];
				matrixC2[m][n]=G[m][n];
			}
		}
		else if(ELEM[n].boundary_condition==BOTH)
		{
			int n2=BOTH_column[n];
			
			for(int m=0;m<uk;m++)
			{
				matrixC[m][n2]=-G[m][n2];
				if(H[m][n2]!=0) cout<<"H "<<m<<" "<<n2<<" "<<H[m][n2]<<endl;
			}
				
			for(int m=0;m<uk;m++)
			{
				matrixC[m][n]=H[m][n];
				if(G[m][n]!=0) cout<<"G "<<m<<" "<<n<<" "<<G[m][n]<<endl;
			}
		}
	}

	//解行列作成
	for(int n=0;n<uk;n++)
	{
		double val=0;//解行列の値
		for(int m=0;m<uk;m++)
		{
			int elem=Nid[m];			//未知数nに対応する要素番号
			int node=ELEM[elem].node[0];	//要素elemに対応するのはELEM[elem].node[0]に格納している
			if(bd_type[m]==Diric) val+=matrixC2[n][m]*NODE[node].potential;
			else if(bd_type[m]==Neumn) val+=matrixC2[n][m]*NODE[node].slop1;
		}
		Bmatrix[n]=val;
	}
	/////matrix作成完了

	cout<<"行列作成完了 ガウスの消去法---";


	gauss(matrixC,Bmatrix,uk);//答えはBmatrixに格納



	cout<<"ok"<<endl;

	//答え格納
	for(int n=0;n<uk;n++)
	{
		int elem=Nid[n];		//未知数nに対応する要素番号
		int node=ELEM[elem].node[0];
		if(bd_type[n]==Neumn) NODE[node].potential=Bmatrix[n];
		else if(bd_type[n]==Diric) NODE[node].slop1=Bmatrix[n]; 
	}

	//答え確認
	ofstream fp3("V.dat");
	ofstream fp4("slop.dat");
	for(int n=0;n<elemnum;n++)
	{
		int node=ELEM[n].node[0];
		fp3<<ELEM[n].r[A_X]<<" "<<ELEM[n].r[A_Y]<<" "<<NODE[node].potential<<endl;
		fp4<<ELEM[n].r[A_X]<<" "<<ELEM[n].r[A_Y]<<" "<<NODE[node].slop1<<endl;
	}
	fp3.close();
	fp4.close();

	

	ofstream fp5("F.dat");
	double ep0=8.854e-12;
	double times=1e-3;
	double le=CON->get_distancebp();
	for(int n=0;n<elemnum;n++)
	{
		if(ELEM[n].material==FLUID)
		{
			int node=ELEM[n].node[0];//対応する節点番号
			int i=NODE[node].particle;//対応する粒子番号
			double E=NODE[node].slop1;
			double Fs=0.5*ep0*E*E;	//応力
			double Fn=Fs*ELEM[n].L;	//力[N]
			for(int D=0;D<2;D++) F[D][i]=-Fn*ELEM[n].direct[D];
			fp5<<PART[i].r[A_X]<<" "<<PART[i].r[A_Y]<<" "<<F[A_X][i]*times/le<<" "<<F[A_Y][i]*times/le<<endl;
			//fp5<<NODE[node].r[A_X]<<" "<<NODE[node].r[A_Y]<<" "<<F[A_X][i]*times/le<<" "<<F[A_Y][i]*times/le<<endl;
		//	fp5<<ELEM[n].r[A_X]<<" "<<ELEM[n].r[A_Y]<<" "<<Fs<<endl;
		}
	}
	fp5.close();

	////スムージング
	//smoothingF3D(CON,PART,fluid_number,F,t);

	if(CON->get_dir_for_P()==2 ||CON->get_dir_for_P()==3 )
    {
		ofstream bb("electromagnetic_P.dat");
		for(int i=0;i<fluid_number;i++)
		{
			double fs=0;//表面力
			if(PART[i].surface==ON)//内部流体の場合はfs=0とする
			{
				double Fn=sqrt(F[A_X][i]*F[A_X][i]+F[A_Y][i]*F[A_Y][i]);
				fs=Fn/le;
				for(int D=0;D<3;D++) F[D][i]=0;//圧力デ゙ィリクレとして電磁力を使用するのでここでは初期化
			}
			bb<<-fs<<endl;
        }
		bb.close();
	}


	for(int n=0;n<node_num;n++) delete[] matrixC[n];
	delete [] matrixC;
	for(int n=0;n<node_num;n++) delete[] matrixC2[n];
	delete [] matrixC2;
	for(int n=0;n<node_num;n++) delete[] H[n];
	delete [] H;
	for(int n=0;n<node_num;n++) delete[] G[n];
	delete [] G;
	delete [] Bmatrix;

	delete [] Nid;
	delete [] bd_type;
	delete [] BOTH_column;
}