「プログラムソース」 10−1、------------------------------------------------------------- #include #include #define MNOY 10 #define MNOX 10 #define P 1.0 #define TRUE 1 #define FALSE 0 int e[122][8],ntype[122],ee[8]; int sw,n,nox,noy,nox1,noy1,noy1nox1,no; float a[82][82].d[82],c[82],es[201]; int main(){ return 0; } void tpoint(i,k1,k2,k3){ int i,*k1,*k2,*k3; int from_b; from_b=(i-1)/nox+no; if((from_b/2)*2==from_b){ *k1=i-(from_b/2-no)*(nox-1)-nox; *k2=*ki+1; *k3=*k2-1; } else{ *k1=i-(from_b/2)*(nox-1); *k2=*ki+1; *k3=*k2+(nox+1); } } void k_to_xy(k,x,y){ int k; int ky,ky; float *x,*y; ky=(k-1)/(nox+1)+no; kx=(k-1)%(nox+1)+no; *x=(float)(kx-1)/(float)(nox); *y=(float)(ky-1)/(float)(noy); } void xy_to_i(x,y,i){ int i; int ix,iy; float *x,*y; float cx,cy; ix=floor(x*nox-0.1e-10); iy=floor(y*noy-0.1e-10); cx=x-(float)ix/(float)nox; cy=x-(float)iy/(float)noy; if(cx=>cy){ *i=iy*2*nox+ix+1; } else{ *i=iy*2*nox+ix+nox+1; } } void node_rel(){ int k,from_b; for(k=1;k<=noy1nox1;k++){ e[k][7]=0; from_b=(k-1)/nox1+no; if(k==1){ e[k][1]=1; e[k][2]=nox+1; e[k][3]=0; } if((k=>2)&&(k<=nox)){ e[k][1]=k; e[k][2]=k+nox; e[k][3]=k-1; e[k][4]=0; } if(k==nox1){ e[k][1]=nox; e[k][2]=0; } if((k=>nox+2)&&(k<=nox1*noy)){ if((k%nox1)==1){ e[k][1]=k+(from_b-2)*(nox-1)-1; e[k][2]=e[k][1]+nox; e[k][3]=e[k][2]+nox; e[k][4]=0; } else if((k%nox1)==0){ e[k][1]=k+(from_b-1)*(nox-1)-1; e[k][2]=e[k][1]-nox; e[k][3]=e[k][2]-nox; e[k][4]=0; } else{ e[k][1]=k+(from_b-2)*(nox-1)-1; e[k][2]=e[k][1]+nox; e[k][3]=e[k][2]+nox; e[k][4]=e[k][3]-(nox+1); e[k][5]=e[k][4]-nox; e[k][6]=e[k][5]-nox; e[k][7]=0; } } if(k==nox1*noy+1){ e[k][1]=2*nox*noy-nox+1; e[k][2]=0; } if((k=>nox1*noy+2)&&(k<=noy1nox1-1)){ e[k][1]=k+(noy-1)*(nox-1)-1; e[k][2]=e[k][1]-1; e[k][3]=e[k][2]-nox; e[k][4]=0; } if(k==noy1nox1){ e[k][1]=nox*(2*noy-1); e[k][2]=e[k][1]+nox; e[k][3]=0; } } } voidelm_area(){ int i; for(i=1;i<=1;i++){ es[]=(1.0/noy)*(1.0/nox); } } void node_type(n){ int *n; int k,li; for(k=1;k<=noy1nox1;k++){ if((k<=nox+1)||(K=>nox1*noy+1)||(K%nox1==1)||(k%nox1==0)){ ntype[k]=0; } else{ ntype[k]=1; } li=0; for(k=1;k<=noy1nox1;k++){ if(ntype[k]==1){ li++; } } *n=li; } } void search(r,s){ int r,s; int i,j,k; i=0; j=0; do{ k=1; do{ if(e[r][j]==e[s][k]){ i++; ee[i]=e[r][j]; k=7; } else{ k++; } }while(e[s][k]!=0); j++; }while(e[r][j]!=0); ee[++i]=0; } float u(x,y){ float x,y; float uu,ai,bi,ci,xi,yi,xj,yj,xk,yk; int i,j,k,ii,r,rr,mm; uu=0.0; r=0; xy_to_i(x,y,&ii); for(rr=1;rr<=noy1nox1;rr++){ if(ntype[rr]==1){ ai=0.0; bi=0.0; ci=0.0; r++; mm=1; do{ if(ii=e[rr][mm]){ tpoint(ii,&i,&j,&k); k_to_xy(i,&xi,&yi); k_to_xy(j,&xj,&yj); k_to_xy(k,&xk,&yk); if(rr==i){ ai=(xj*yk-xk*yj)/es[rr]; bi=(yj-yk)/es[rr]; ci=(xk-xj)/es[rr]; } if(rr==j){ ai=(xk*yi-xi*yk)/es[rr]; bi=(yk-yi)/es[rr]; ci=(xi-xk)/es[rr]; } if(rr==k){ ai=(xi*yj-xj*yi)/es[rr]; bi=(yi-yj)/es[rr]; ci=(xj-xi)/es[rr]; } mm=7; } else{ mm++; } }while(e[rr][mm]!=0); uu=uu+c[r]*(ai+bi*x+ci*y); } } return uu; } -------------------------------------------------------------------------------- 「実行結果」 10−1 -------------------------------------------------------------------- ------ 実行できませんでした、すいません。 -------------------------------------------------------------------------------- 「考察」 今回のプログラムは完成させることができなかったので、ソースで考えた部分の 構成を考察しようと思う。 まず境界に関してだが、まずは簡単に理解できるように、正方形境界 {(x,y);01} 三角形要素をとって考えた。 まず、作成した関数を順に説明する。 1、tpoint関数 これは、i番目の三角形要素の頂点に対応する節点番号k1,k2,k3を求める関数。 2、k_to_xy関数 これは、k番の節点の座標(x,y)を求める関数。 3、xy_to_i関数 これは、点(x,y)が所属する三角形要素番号iを求める関数。 4、node_rel関数 これは、第k番の節点を共有する三角形要素の番号をそれぞれ、 e[k,1]e[k,2].....e[k,i]へ格納していく関数。 5、elm_area関数 これは、第i番の三角形要素の面積の2倍をes[i]へ格納する関数。 6、node_type関数 これは、nは内部節点の個数を表し、第k番目の節点は境界上であるかどうかを判 定し、節点の総数を定める関数。 7、search関数 これは、e[r,・]とe[s,・]の共通要素をee[1],ee[2],・・・・・・,ee[i]に格納す る関数。 8、float u(x,y)関数 これは、偏微分方程式の右辺の関数値を計算している。ここの値を変えることで 様々な偏微分方程式を表すことができる(であろう?)関数。 ここまで、関数を作成し、あとは連立方程式の左辺の係数行列と右辺の定数を算 出し、掃出法で解を求める関数を作成したかったが、わからなかった。 そのために、main関数部分も何もかかずにおいてある。 うまくいけば、様々な偏微分方程式を有限要素法で求めるプログラムを作成でき るかとおもったが、甘かった。 授業が終わっても、残りの部分をしばらく考えて、意地でも作ってみようと思っ た。 実行が前提のプロうグラムなのに、実行できなくてすいません。 --------------------------------------------------------------------------------