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(); } }
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);}
//一定要素用のBEM関数 void BEM_main_for_CONSTANT(mpsconfig *CON,vector<point2D> &NODE,vector<element2D> &ELEM,vector<mpsparticle> &PART,int fluid_number,double **F,vector<REGION> ®ion) { 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; }