/*===========================*/ /* gccFRAME.c */ /*===========================*/ #include #include #include #include #include #define NDmax 500 /*最大節点数*/ #define NEmax 500 /*最大要素数*/ #define MAmax 200 /*最大材料種別数*/ #define Nnod 2 /*1要素節点数*/ #define Nfre 3 /*1節点自由度*/ #define Nfel Nnod*Nfre /*1要素自由度*/ #define NTmax NDmax*Nfre /*最大自由度数*/ int main_part(char fnameR[],char fnameW[]); void SM_FRM(int ne,int kakom[NEmax+1][Nnod+1],double x[NDmax+1],double y[NDmax+1], double Em[NEmax+1],double AA[NEmax+1],double AI[NEmax+1],double sm[Nfel+1][Nfel+1],double hen[Nfel+1][Nfel+1]); void MV_FRM(int ne,int kakom[NEmax+1][Nnod+1],double x[NDmax+1],double y[NDmax+1], double AA[NEmax+1],double gamma[NEmax+1],double gkh[NEmax+1],double gkv[NEmax+1], double fevec[Nfel+1],double hen[Nfel+1][Nfel+1]); void TV_FRM(int ne,int kakom[NEmax+1][Nnod+1],double deltaT[NDmax+1], double Em[NEmax+1],double AA[NEmax+1],double alpha[NEmax+1],double fevec[Nfel+1],double hen[Nfel+1][Nfel+1]); void CALST_FRM(int ne, int kakom[NEmax+1][Nnod+1], double dis[NTmax+1], double sm[Nfel+1][Nfel+1], double hen[Nfel+1][Nfel+1], double reac[NTmax+1], double tsm[NTmax+1][NTmax+1],double Em[NEmax+1],double AA[NEmax+1],double alpha[NEmax+1],double deltaT[NDmax+1]); void ASMAT(int ne,int nod,int nhen,int kakom[NEmax+1][Nnod+1],double sm[Nfel+1][Nfel+1],double tsm[NTmax+1][NTmax+1]); void ASVEC(int ne,int nod,int nhen,int kakom[NEmax+1][Nnod+1],double fevec[Nfel+1],double ftvec[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 array[NTmax+1][NTmax+1],double fact0); void BAND(int mm,int ib,double array[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); /* printf("リターンキーを押してください"); getchar(); */ return 0; } /*--------------------------------------------------------------------------------*/ int main_part(char fnameR[],char fnameW[]) { /*平面骨組構造解析*/ FILE *fin,*fout; char dat[256]=""; char sv[50]=""; int i,j,k,l,m,ne,n,ia,ja; char strcom[50]=""; /*コメント*/ int NODT; /*節点総数*/ int NELT; /*要素総数*/ int MATEL; /*材料種別数*/ int KOX; /*x方向変位既知節点数*/ int KOY; /*y方向変位既知節点数*/ int KOZ; /*回転変位既知節点数*/ int NF; /*載荷節点数*/ int nod; /*1要素節点数*/ int nhen; /*1節点自由度*/ int nt; /*全自由度*/ int mm; /*変位既知節点処理語の自由度*/ int ib; /*バンド幅*/ 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][Nnod+1];/*要素構成節点番号*/ double Em[NEmax+1]; /*要素弾性係数*/ double AA[NEmax+1]; /*要素断面積*/ double AI[NEmax+1]; /*要素断面二次モーメント*/ double gamma[NEmax+1]; /*要素単位体積重量*/ double gkh[NEmax+1]; /*要素水平加速度(重力加速度比)*/ double gkv[NEmax+1]; /*要素鉛直加速度(重力加速度比)*/ double alpha[NEmax+1]; /*要素線膨張係数*/ int matno[NEmax+1]; /*材料種別No*/ double wm[MAmax+1][8]; /*材料種別作業用*/ double x[NDmax+1]; /*節点x座標*/ double y[NDmax+1]; /*節点y座標*/ double deltaT[NDmax+1]; /*節点温度変化量*/ int nokx[NDmax+1]; /*x方向変位既知節点番号*/ int noky[NDmax+1]; /*y方向変位既知節点番号*/ int nokz[NDmax+1]; /*回転変位既知節点番号*/ int index[NTmax+1]; /*変位既知節点処理のためのインデックス*/ static double tsm[NTmax+1][NTmax+1]; /*全体剛性マトリックス*/ double f[NTmax+1]; /*全体節点外力ベクトル(入力値)*/ double fmass[NTmax+1]; /*全体節点慣性力ベクトル(計算値)*/ double ftemp[NTmax+1]; /*全体節点温度荷重相当ベクトル(計算値)*/ double ftvec[NTmax+1]; /*全体節点力ベクトル*/ double fdis[NTmax+1]; /*既知節点変位による荷重成分格納*/ double rdis[NTmax+1]; /*既知節点変位量*/ double dis[NTmax+1]; /*全体節点変位*/ double reac[NTmax+1]; /*要素節点反力*/ double sm[Nfel+1][Nfel+1]; /*要素剛性マトリックス*/ double fevec[Nfel+1]; /*要素節点荷重ベクトル*/ double hen[Nfel+1][Nfel+1]; /*座標変換行列*/ /*時間計測開始*/ t_sta=clock(); /*******************************************************/ /*データ入力*/ /*******************************************************/ fin=fopen(fnameR,"r"); /*--------------------------------------------------------------------------------------*/ /*書出用コメント入力*/ /*--------------------------------------------------------------------------------------*/ fgets(dat,sizeof dat,fin);strncpy(strcom,dat,strlen(dat)-1); printf("*comment\n"); /*--------------------------------------------------------------------------------------*/ /*節点数,要素数,材料種別数][X方向変位既知節点数,Y方向変位既知節点数,回転変位既知節点数,載荷点数*/ /*--------------------------------------------------------------------------------------*/ fgets(dat,sizeof dat,fin); NODT =atoi(strtok(dat,",")); NELT =atoi(strtok(NULL,",")); MATEL=atoi(strtok(NULL,",")); KOX =atoi(strtok(NULL,",")); KOY =atoi(strtok(NULL,",")); KOZ =atoi(strtok(NULL,",")); NF =atoi(strtok(NULL,",")); nod=Nnod; nhen=Nfre; nt=NODT*nhen; printf("*basic data\n"); /*------------------------------------------------------------------------------------------*/ /*材料特性(Em,AA,AI)*/ /*------------------------------------------------------------------------------------------*/ for(i=1;i<=MATEL;i++){ fgets(dat,sizeof dat,fin); wm[i][1]=atof(strtok(dat,",")); wm[i][2]=atof(strtok(NULL,",")); wm[i][3]=atof(strtok(NULL,",")); wm[i][4]=atof(strtok(NULL,",")); wm[i][5]=atof(strtok(NULL,",")); wm[i][6]=atof(strtok(NULL,",")); wm[i][7]=atof(strtok(NULL,",")); } printf("*material\n"); /*------------------------------------------------------------------------------------------*/ /*要素構成節点と材料種別(node-1,node-2,matno)*/ /*------------------------------------------------------------------------------------------*/ for(ne=1;ne<=NELT;ne++){ fgets(dat,sizeof dat,fin); kakom[ne][1]=atoi(strtok(dat,",")); kakom[ne][2]=atoi(strtok(NULL,",")); matno[ne] =atoi(strtok(NULL,",")); for(i=1;i<=MATEL;i++){ if(i==matno[ne]){ Em[ne] =wm[i][1]; AA[ne] =wm[i][2]; AI[ne] =wm[i][3]; gamma[ne]=wm[i][4]; gkh[ne] =wm[i][5]; gkv[ne] =wm[i][6]; alpha[ne]=wm[i][7]; } } } printf("*element\n"); /*--------------------------------------------------------------------------------------*/ /*節点座標(x,y)*/ /*--------------------------------------------------------------------------------------*/ for(i=1;i<=NODT;i++){ fgets(dat,sizeof dat,fin); x[i] =atof(strtok(dat,",")); y[i] =atof(strtok(NULL,",")); deltaT[i]=atof(strtok(NULL,",")); } printf("*coordinate\n"); /*--------------------------------------------------------------------------------------*/ /*変位既知節点番号,既知節点変位量*/ /*--------------------------------------------------------------------------------------*/ for(i=1;i<=nt;i++){rdis[i]=0.0;} if(00){ mm=mm+1;index[mm]=i; } } /*-----------------------------------------------------*/ /*変位既知節点処理(連立一次方程式縮小)*/ /*-----------------------------------------------------*/ for(i=1;i<=mm;i++){ ia=index[i]; reac[i]=ftvec[ia]; for(j=1;j<=mm;j++){ ja=index[j]; tsm[i][j]=tsm[ia][ja]; } } /*-----------------------------------------------------*/ /*バンド幅計算とフルマトリックスのバンド化記憶*/ /*-----------------------------------------------------*/ ib=IBAND(mm,tsm,fact0); BAND(mm,ib,tsm); /*-----------------------------------------------------*/ /*対角項確認と異常終了通知*/ /*-----------------------------------------------------*/ for(i=1;i<=mm;i++){ if(fabs(tsm[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