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

📄 heat1d.c

📁 工程中有限元程序,采用C语言编制,包括所有经典的有限元问题!
💻 C
字号:
/****************************************/
/*           program  heat1d           */
/*  t.r.chandrupatla and a.d.belegundu  */
/****************************************/
#include <stdio.h>
#include <string.h>
#include <math.h>
main()
{  
   FILE *fptr;
   int ne,nbc,nq,*nb,k,i1,i2,nn,nbw,i,j,n,*bc;
   float *x,*f,*tc,*v,*h,*s,c,ell,ekl,cnst;
   char dummy[81], title[81], file1[81], file2[81];
   puts("\nInput file name < dr:fn.ext >: ");
   gets(file1);
   puts("Output file name < dr:fn.ext >: ");
   gets(file2);
   fptr = fopen(file1, "r");
   fgets(dummy,80,fptr);
   fgets(title,80,fptr);
   fgets(dummy,80,fptr);
   fscanf(fptr,"%d %d %d %d %d %d\n", &ne, &nbc, &nq);
   nn = ne + 1;
   nbw = 2;    /* --- bandwidth for nodes in natural order --- */
/* ------------- memory allocation ------------- */   
   x = (float *) calloc(nn, sizeof(float));
   f = (float *) calloc(nn, sizeof(float));
   tc = (float *) calloc(ne, sizeof(float));
   v = (float *) calloc(nbc, sizeof(float));
   h = (float *) calloc(nbc, sizeof(float));
   s = (float *) calloc(nbw*nn, sizeof(float));
   nb = (int *) calloc(nbc, sizeof(int));
   bc = (int *) calloc(nbc, sizeof(int));
/* ---------------------------------------------- */
/* --- thermal conductivity ---*/
   fgets(dummy, 80, fptr);
   for (i = 0; i < ne; i++) {
      fscanf(fptr, "%d %f\n", &k, &c);
      tc[k-1] = c;
   }
 /* ---  coordinates --- */
   fgets(dummy,80,fptr);
   for (i = 0; i < nn; i++) {
      fscanf(fptr, "%d %f\n",&k, &c);
      x[k-1] = c;
      }
/* ---  boundary conditions --- */
     fgets(dummy,80,fptr);
     for (i = 0; i < nbc; i++) {
	 fscanf(fptr, "%d  %s\n", &k, dummy);
	 nb[i] = k;
	 bc[i] = 0;
printf("%d  %s\n",k,dummy);
	  if (strcmp(dummy,"temp")==0 || strcmp(dummy,"TEMP")==0){
	    bc[i] = 1;
	    fscanf(fptr,"%f\n", &c);
	    v[i] = c;
	    }
	  if (strcmp(dummy,"flux")==0 || strcmp(dummy,"FLUX")==0){
	    bc[i] = 2;
	    fscanf(fptr,"%f\n", &c);
	    v[i] = c;
	    }
	  if (strcmp(dummy,"conv")==0 || strcmp(dummy,"CONV")==0){
	    bc[i] = 3;
	    fscanf(fptr,"%f\n", &c);
	    h[i] = c;
	    fscanf(fptr,"%f\n", &c);
	    v[i] = c;
	    }
	}
     /* --- calculate and input nodal heat source vector --- */
     for (i = 0; i < nn; i++) {
	    f[i] = 0;
	    }	    
     fgets(dummy,80,fptr);
     if (nq > 0) {
       for (i = 0; i < nq; i++) {
           fscanf(fptr, "%d %f\n",&k,&c);
           f[k-1] = c;
	       }
       }
     fclose(fptr);
   /* --- stiffness matrix --- */
	 for (i = 0; i < nn; i++) {
	    for (j = 0; j < nbw; j++) {
	       s[nbw*i+j] = 0;
	       }
	    }
     for (i = 0; i < ne; i++) {
	  i1 = i;
	  i2 = i + 1;
	  ell = fabs(x[i2] - x[i1]);
	  ekl = tc[i] / ell;
	  s[nbw*i1] = s[nbw*i1] + ekl;
	  s[nbw*i2] = s[nbw*i2] + ekl;
	  s[nbw*i1+1] = s[nbw*i1+1] - ekl;
	 }
     /* --- account for b.c.'s --- */
     cnst = 0;
     for (i = 0; i < nn; i++) {
        if (s[nbw*i] > cnst)
           cnst = s[nbw*i];
        }
     cnst = cnst * 10000;
     for (i = 0; i < nbc; i++) {
	n = nb[i]-1;
	/* --- temperature --- */
	if (bc[i] == 1) {
	   s[nbw*n] = s[nbw*n] + cnst;
	   f[n] = f[n] + cnst * v[i];
	   }
	/* --- heat flux --- */
	if (bc[i] == 2)
	   f[n] = f[n] - v[i];
	/* --- convection --- */
	if (bc[i] == 3) {
	  s[nbw*n] = s[nbw*n] + h[i];
	  f[n] = f[n] + h[i] * v[i];
	  }
	}
   bansol(s,f,nn,nbw);
     /* --- f contains the solution. 'rhs' is over-written --- */
     fptr = fopen(file2, "w");
     printf("\n%s\n", title);
     fprintf(fptr, "\n%s\n", title); 
     printf("node#  temperature\n");
     fprintf(fptr,"node#  temperature\n");
     for (i = 0; i < nn; i++) {
	     printf("%3d    %8.4f\n", i+1, f[i]);
	     fprintf(fptr,"%3d    %8.4f\n", i+1, f[i]);
	    }
	 fclose(fptr);
	 printf("results are in file %s\n",file2);
     return(0);
}
/* ----- band solver ----- */
bansol(s,f,nq,nbw)
  int nq, nbw;
  float *s, *f;
{
 int n1,k,nk,i,i1,j,j1,kk;
  float c1;
  /* ----- band solver ----- */
  n1 = nq - 1;
  /* --- forward elimination --- */
  for (k = 1; k <= n1; k++) {
     nk = nq - k + 1;
     if (nk > nbw)
	nk = nbw;
     for (i = 2; i <= nk; i++) {
       c1 = s[nbw*(k-1)+i-1] / s[nbw*(k-1)];
       i1 = k + i - 1;
       for (j = i; j <= nk; j++) {
	j1 = j - i + 1;
	s[nbw*(i1-1)+j1-1] = s[nbw*(i1-1)+j1-1] - c1 * s[nbw*(k-1)+j-1];
	}
       f[i1-1] = f[i1-1] - c1 * f[k-1];
       }
     }
  /* --- back-substitution --- */
  f[nq-1] = f[nq-1] / s[nbw*(nq-1)];
  for (kk = 1; kk <= n1;kk++) {
     k = nq - kk;
     c1 = 1 / s[nbw*(k-1)];
     f[k-1] = c1 * f[k-1];
     nk = nq - k + 1;
     if (nk > nbw)
       nk = nbw;
       for (j = 2; j <= nk; j++) {
	 f[k-1] = f[k-1] - c1 * s[nbw*(k-1)+j-1] * f[k + j - 2];
	}
     }
    return(0);
}

⌨️ 快捷键说明

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