⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skyline.c

📁 工程中有限元程序,采用C语言编制,包括所有经典的有限元问题!
💻 C
字号:
  /********   program skyline  ***********/
  /*    skyline method for equations     */
  /* t.r.chandrupatla and a.d.belegundu  */
  /***************************************/
  #include <stdio.h>
  #include <math.h>
  main()
    {
     FILE *fptr;
     int i,j,k,n,ns,nt,ni,nj,nsum,ii,ij,ki,kj,kk,i1,j1,k1;
     int *id;
     char dummy[81],title[81],file1[81],file2[81];
     float *a,*b,c;
     printf("\n");
     puts("Input file name <fn.ext>:");
     gets(file1);
     puts("Output file name <fn.ext>:");
     gets(file2);
     fptr = fopen(file1, "r");
     fgets(title,80,fptr);
     fgets(dummy,80,fptr);
     fscanf(fptr,"%d\n",&n);
     id = (int *) calloc(n, sizeof(int));
     fgets(dummy,80,fptr);
/* --- read column heights then convert to diagonal pointers ----- */
     fscanf(fptr,"%d\n", &k);
     id[0] = k;
     for (i = 1; i < n; i++) {
	fscanf(fptr,"%d\n", &k);
	id[i] = k;
	id[i] = id[i] + id[i - 1];
	}
     nsum = id[n-1];
     a = (float *) calloc(nsum, sizeof(float));
     b = (float *) calloc(n, sizeof(float));
     nt = 0;
     ni = 1;
     fgets(dummy,80,fptr);
     for (i = 0; i < n; i++) {
	     if (i > 0) {
	        nt = id[i - 1];
	        ni = id[i] - id[i - 1];
	        }
	      for (j = 0; j < ni; j++) {
		  fscanf(fptr, "%f\n",&c);
	          a[nt + j] = c;
	        }
	      }
     fgets(dummy,80,fptr);
     for (i = 0; i < n; i++) {
		fscanf(fptr, "%f\n",&c);
	      b[i] = c;
	     }
     fclose(fptr);
     for (j = 2; j <= n; j++) {
	     nj = id[j-1] - id[j - 2];
	     if (nj > 1) {
	        k1 = 0;
	        nj = j - nj + 1;
	        for (k = nj; k < j; k++) {
	            k1 = k1 + 1;
	            kj = id[j - 2] + k1;
	            kk = id[k-1];
	            c = a[kj-1] / a[kk-1];
	            for (i = k + 1; i <= j; i++) {
		           ni = id[i-1] - id[i - 2];
		           if ((i - k + 1) <= ni) {
		              ij = id[j-1] - j + i;
		              ki = id[i-1] - i + k;
		              a[ij-1] = a[ij-1] - c * a[ki-1];
		              }
		           }
	            }
	        }
	    }
     for (k = 1; k < n; k++) {
	     kk = id[k-1];
	     c = b[k-1] / a[kk-1];
	     for (i = k + 1; i <= n; i++) {
	         ni = id[i-1] - id[i - 2];
	         if ((i - k + 1) <= ni) {
	            ki = id[i-1] - i + k;
	            b[i-1] = b[i-1] - c * a[ki-1];
	            }
	         }
	     }
    /* ----- backsubstitution ----- */
     ns = id[n-1];
     b[n-1] = b[n-1] / a[ns-1];
     for (i1 = 1; i1 < n; i1++) {
	     i = n - i1;
	     ii= id[i-1];
	     c = 1 / a[ii-1];
	     b[i-1] = c * b[i-1];
	     for (j = i + 1; j <= n; j++) {
	         j1 = j - i + 1;
	         nj = id[j-1] - id[j - 2];
	         if (j1 <= nj) {
	            ij = id[j-1] - j + i;
	            b[i-1] = b[i-1] - c * a[ij-1] * b[j-1];
	      }
	   }
	}
     fptr = fopen(file2, "w");
     fprintf(fptr, "\n   solution to eqns in file %s\n", file1);
     printf("Solution Vector\n");
     for (i = 0; i < n; i++) {
	fprintf(fptr, " %10.4e ", b[i]);
        printf("%10.4e ",b[i]);
	}
	fprintf(fptr,"\n");
	printf("\n");
	fclose(fptr);
     return(0);
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -