/*===========================*/ /* gccSEEP4nod.c */ /*===========================*/ #include #include #include #include #include #define NDmax 3000 #define NEmax 5000 #define MAmax 10 #define NTmax NDmax*1 void DNMAT_S4(int ne,int kakom[NEmax+1][5],double x[NDmax+1],double y[NDmax+1], double dnx[5],double dny[5],double *detJ,double a,double b); void IPOINT4(int kk,double *a,double *b); void STIFF_S4(int ne,int kakom[NEmax+1][5],double x[NDmax+1],double y[NDmax+1], double Akx[NEmax+1],double Aky[NEmax+1],double eak[5][5]); void CALV_S4(int ne,int kakom[NEmax+1][5],double x[NDmax+1],double y[NDmax+1],double hvec[NDmax+1], double Akx[NEmax+1],double Aky[NEmax+1],double vx[NEmax+1],double vy[NEmax+1]); void ASMAT(int ne,int nod,int nhen,int kakom[NEmax+1][5],double sm[5][5],double tsm[NTmax+1][NTmax+1]); void CHBAND10(int n1,int m1,double array[NTmax+1][NTmax+1]); void CHBAND11(int n1,int m1,double array[NTmax+1][NTmax+1],double vector[NTmax+1]); int IBAND(int mm,double a[NTmax+1][NTmax+1],double fact0); void BAND(int mm,int ib,double a[NTmax+1][NTmax+1]); /*------------------------------------------------------------------------------*/ int main(int argc, char* argv[]) { char fnameR[50]; char fnameW[50]; strcpy(fnameR,argv[1]); strcpy(fnameW,argv[2]); main_part(fnameR,fnameW); return 0; } /*------------------------------------------------------------------------------*/ int main_part(char fnameR[50],char fnameW[50]) { /*2次元飽和定常浸透流解析*/ FILE *fin,*fout; char dat[256]=""; char sv[20]=""; int i,j,k,n,ia,ja,ne; char strcom[256]=""; /* 書出用コメント */ int idan; /* 0:水平断面,1:鉛直断面 */ int NODT; /* 節点総数 */ int NELT; /* 要素総数 */ int MATEL; /* 材料種類数 */ int KOH; /* 全水頭指定節点数 */ int KOQ; /* 流量指定節点数 */ int nt; /* 全自由度(総節点数×1[1節点自由度])*/ int mm; /* 温度固定点処理後自由度 */ int ib; /* バンド幅 */ double elarea; /* 要素半面積 */ double fact0=1.0E-30; /* 0判定 */ clock_t t_sta,t_end; double cal_time; time_t jikoku; struct tm *lt; char *p; /*-----------------------------------------------------*/ /*配列寸法宣言*/ /*-----------------------------------------------------*/ int kakom[NEmax+1][5]; /*要素構成接点番号*/ double Akx[NEmax+1]; /*要素x方向透水係数*/ double Aky[NEmax+1]; /*要素y方向透水係数*/ int matno[NEmax+1]; /*材料種別No*/ double wm[NEmax+1][3]; /*作業用材料物性記憶*/ double x[NDmax+1]; /*節点x座標*/ double y[NDmax+1]; /*節点y座標*/ int nokh[NDmax+1]; /*全水頭指定節点番号*/ int nokq[NDmax+1]; /*流量指定節点番号*/ double Hinp[NDmax+1]; /*指定全水頭入力*/ double Qinp[NDmax+1]; /*指定流量入力*/ double vx[NEmax+1]; /*x方向流速ベクトル*/ double vy[NEmax+1]; /*y方向流速ベクトル*/ int index[NTmax+1]; /*温度固定点処理用*/ static double tak[NTmax+1][NTmax+1];/*全体透水行列*/ double hvec[NTmax+1]; /*全体全水頭ベクトル*/ double qvec[NTmax+1]; /*全体節点流量ベクトル*/ double reac[NTmax+1]; /*作業用ベクトル*/ static double wak[NTmax+1][NTmax+1];/*水頭指定節点対応列記憶*/ double eak[5][5]; /*要素透水行列*/ /*時間計測開始*/ t_sta=clock(); /******************************************************/ /*データ入力*/ /******************************************************/ fin=fopen(fnameR,"r"); printf("%s\n",fnameR); /*--------------------------------------------------------------------------------------*/ /*書出用コメント入力*/ /*--------------------------------------------------------------------------------------*/ fgets(dat,sizeof dat,fin);strncpy(strcom,dat,strlen(dat)-1); /*--------------------------------------------------------------------------------------*/ /*解析断面(0:水平,1:鉛直),節点数,要素数,材料種類数,全水頭固定節点数,流量指定節点数*/ /*--------------------------------------------------------------------------------------*/ fgets(dat,sizeof dat,fin); idan =atoi(strtok(dat,",")); NODT =atoi(strtok(NULL,",")); NELT =atoi(strtok(NULL,",")); MATEL =atoi(strtok(NULL,",")); KOH =atoi(strtok(NULL,",")); KOQ =atoi(strtok(NULL,",")); nt=NODT*1; /* 全自由度 */ printf("%d %d %d %d %d %d\n",idan,NODT,NELT,MATEL,KOH,KOQ); /*--------------------------------------------------------------------------------------*/ /*材料特性(Akx,Aky)*/ /*--------------------------------------------------------------------------------------*/ for(i=1;i<=MATEL;i++){ fgets(dat,sizeof dat,fin); wm[i][1]=atof(strtok(dat,",")); wm[i][2]=atof(strtok(NULL,",")); } /*--------------------------------------------------------------------------------------*/ /*要素構成節点と材料種別(node-1,node-2,node-3,matno)*/ /*--------------------------------------------------------------------------------------*/ for(ne=1;ne<=NELT;ne++){ fgets(dat,sizeof dat,fin); kakom[ne][1]=atoi(strtok(dat,",")); kakom[ne][2]=atoi(strtok(NULL,",")); kakom[ne][3]=atoi(strtok(NULL,",")); kakom[ne][4]=atoi(strtok(NULL,",")); matno[ne]=atoi(strtok(NULL,",")); for(i=1;i<=MATEL;i++){ if(i==matno[ne]){ Akx[ne]=wm[i][1]; Aky[ne]=wm[i][2]; } } } /*--------------------------------------------------------------------------------------*/ /*節点座標(x,y)*/ /*--------------------------------------------------------------------------------------*/ for(i=1;i<=NODT;i++){ fgets(dat,sizeof dat,fin); x[i] =atof(strtok(dat,",")); y[i] =atof(strtok(NULL,",")); } /*--------------------------------------------------------------------------------------*/ /*全水頭指定節点番号,指定全水頭*/ /*--------------------------------------------------------------------------------------*/ if(00){ mm=mm+1; index[mm]=i; } } for(i=1;i<=mm;i++){ ia=index[i]; reac[i]=qvec[ia]; for(j=1;j<=mm;j++){ ja=index[j]; tak[i][j]=tak[ia][ja]; }} /*-----------------------------------------------------*/ /*バンド幅計算とフルマトリックスのバンド化記憶*/ /*-----------------------------------------------------*/ ib=IBAND(mm,tak,fact0); BAND(mm,ib,tak); /*-----------------------------------------------------*/ /*対角項確認と異常終了通知*/ /*-----------------------------------------------------*/ for(i=1;i<=mm;i++){ if(fabs(tak[i][1])m1){ mm=m1; }else{ mm=n1-i+1; } for(j=1;j<=mm;j++){ z=array[i][j]; if(j!=m1){ if(m1-j+11){ array[i][j]=z/array[i][1]; }else{ array[i][1]=sqrt(z); } }else{ array[i][j]=z/array[i][1]; } } } } /*--------------------------------------------------------------------------------*/ void CHBAND11(int n1,int m1,double array[NTmax+1][NTmax+1],double vector[NTmax+1]) { /*前進消去・後退代入*/ int i,j,mm; double z; vector[1]=vector[1]/array[1][1]; for(i=2;i<=n1;i++){ z=vector[i]; if(i>m1){ mm=m1; }else{ mm=i; } for(j=2;j<=mm;j++){ z=z-array[i-j+1][j]*vector[i-j+1]; } vector[i]=z/array[i][1]; } vector[n1]=vector[n1]/array[n1][1]; for(i=n1-1;i>=1;i--){ z=vector[i]; for(j=2;j<=m1;j++){ if(i+j-1>n1)break; z=z-array[i][j]*vector[i+j-1]; } vector[i]=z/array[i][1]; } } /*--------------------------------------------------------------------------------*/ int IBAND(int mm,double array[NTmax+1][NTmax+1],double fact0) { int ib,i,j; /*-----------------------------------------------------*/ /*バンド幅計算 /*-----------------------------------------------------*/ ib=1; for(i=1;i<=mm-1;i++){ for(j=mm;j>=i+1;j--){ if(fact0