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

📄 mesh.c

📁 OpenFVM-v1.1 open source cfd code
💻 C
📖 第 1 页 / 共 4 页
字号:
				 nodes[faces[nbfaces].node[3]]);	      // Calculate centroid   	      faces[nbfaces].cface =		GeoCalcCentroid4 (nodes[faces[nbfaces].node[0]],				  nodes[faces[nbfaces].node[1]],				  nodes[faces[nbfaces].node[2]],				  nodes[faces[nbfaces].node[3]]);	      // Calculate normal of the face                         	      faces[nbfaces].n = GeoCalcNormal (nodes[faces[nbfaces].node[0]],						nodes[faces[nbfaces].node[1]],						nodes[faces[nbfaces].						      node[2]]);	      d =		GeoSubVectorVector (faces[nbfaces].cface,				    elements[element].celement);	      // Normal should point to neighbour	      // Flip normal if necessary	      if (GeoDotVectorVector (faces[nbfaces].n, d) < 0.0)		{		  faces[nbfaces].n.x *= -1;		  faces[nbfaces].n.y *= -1;		  faces[nbfaces].n.z *= -1;		}	      faces[nbfaces].element = element;	      faces[nbfaces].physreg = -1;	      faces[nbfaces].elemreg = -1;              faces[nbfaces].partition = -1;	      faces[nbfaces].pair = -1;	      faces[nbfaces].bc = NONE;	      nbfaces++;	    }	}      if (elements[element].type == PRISM)	{	  elements[element].nbfaces = 5;	  // Allocate memory	  elements[element].face =	    calloc (elements[element].nbfaces, sizeof (int));	  for (j = 0; j < 2; j++)	    {	      elements[element].face[j] = nbfaces;	      faces[nbfaces].type = TRIANGLE;	      faces[nbfaces].nbnodes = 3;	      switch (j)		{		case 0:		  // Allocate memory		  faces[nbfaces].node =		    calloc (faces[nbfaces].nbnodes, sizeof (int));		  faces[nbfaces].node[0] = elements[element].node[0];		  faces[nbfaces].node[1] = elements[element].node[1];		  faces[nbfaces].node[2] = elements[element].node[2];		  break;		case 1:		  // Allocate memory		  faces[nbfaces].node =		    calloc (faces[nbfaces].nbnodes, sizeof (int));		  faces[nbfaces].node[0] = elements[element].node[3];		  faces[nbfaces].node[1] = elements[element].node[5];		  faces[nbfaces].node[2] = elements[element].node[4];		  break;		}	      // Calculate area	      faces[nbfaces].Aj =		GeoCalcTriArea (nodes[faces[nbfaces].node[0]],				nodes[faces[nbfaces].node[1]],				nodes[faces[nbfaces].node[2]]);	      // Calculate centroid   	      faces[nbfaces].cface =		GeoCalcCentroid3 (nodes[faces[nbfaces].node[0]],				  nodes[faces[nbfaces].node[1]],				  nodes[faces[nbfaces].node[2]]);	      // Calculate normal of the face                         	      faces[nbfaces].n = GeoCalcNormal (nodes[faces[nbfaces].node[0]],						nodes[faces[nbfaces].node[1]],						nodes[faces[nbfaces].						      node[2]]);	      d =		GeoSubVectorVector (faces[nbfaces].cface,				    elements[element].celement);	      // Normal should point to neighbour	      // Flip normal if necessary	      if (GeoDotVectorVector (faces[nbfaces].n, d) < 0.0)		{		  faces[nbfaces].n.x *= -1;		  faces[nbfaces].n.y *= -1;		  faces[nbfaces].n.z *= -1;		}	      faces[nbfaces].element = element;	      faces[nbfaces].physreg = -1;	      faces[nbfaces].elemreg = -1;              faces[nbfaces].partition = -1;	      faces[nbfaces].pair = -1;	      nbfaces++;	    }	  for (j = 2; j < 5; j++)	    {	      elements[element].face[j] = nbfaces;	      faces[nbfaces].type = QUADRANGLE;	      faces[nbfaces].nbnodes = 4;	      switch (j)		{		case 2:		  // Allocate memory		  faces[nbfaces].node =		    calloc (faces[nbfaces].nbnodes, sizeof (int));		  faces[nbfaces].node[0] = elements[element].node[0];		  faces[nbfaces].node[1] = elements[element].node[2];		  faces[nbfaces].node[2] = elements[element].node[5];		  faces[nbfaces].node[3] = elements[element].node[3];		  break;		case 3:		  // Allocate memory		  faces[nbfaces].node =		    calloc (faces[nbfaces].nbnodes, sizeof (int));		  faces[nbfaces].node[0] = elements[element].node[1];		  faces[nbfaces].node[1] = elements[element].node[4];		  faces[nbfaces].node[2] = elements[element].node[5];		  faces[nbfaces].node[3] = elements[element].node[2];		  break;		case 4:		  // Allocate memory		  faces[nbfaces].node =		    calloc (faces[nbfaces].nbnodes, sizeof (int));		  faces[nbfaces].node[0] = elements[element].node[0];		  faces[nbfaces].node[1] = elements[element].node[3];		  faces[nbfaces].node[2] = elements[element].node[4];		  faces[nbfaces].node[3] = elements[element].node[1];		  break;		}	      // Calculate area 	      faces[nbfaces].Aj =		GeoCalcQuadArea (nodes[faces[nbfaces].node[0]],				 nodes[faces[nbfaces].node[1]],				 nodes[faces[nbfaces].node[2]],				 nodes[faces[nbfaces].node[3]]);	      // Calculate centroid   	      faces[nbfaces].cface =		GeoCalcCentroid4 (nodes[faces[nbfaces].node[0]],				  nodes[faces[nbfaces].node[1]],				  nodes[faces[nbfaces].node[2]],				  nodes[faces[nbfaces].node[3]]);	      // Calculate normal of the face                         	      faces[nbfaces].n = GeoCalcNormal (nodes[faces[nbfaces].node[0]],						nodes[faces[nbfaces].node[1]],						nodes[faces[nbfaces].						      node[2]]);	      d =		GeoSubVectorVector (faces[nbfaces].cface,				    elements[element].celement);	      // Normal should point to neighbour	      // Flip normal if necessary	      if (GeoDotVectorVector (faces[nbfaces].n, d) < 0.0)		{		  faces[nbfaces].n.x *= -1;		  faces[nbfaces].n.y *= -1;		  faces[nbfaces].n.z *= -1;		}	      faces[nbfaces].element = element;	      faces[nbfaces].physreg = -1;	      faces[nbfaces].elemreg = -1;              faces[nbfaces].partition = -1;	      faces[nbfaces].pair = -1;	      faces[nbfaces].bc = NONE;	      nbfaces++;	    }	}    }  faces = realloc (faces, nbfaces * sizeof (msh_face));}voidMshAddBoundaryFaces (){  int i;  nbfaces += nbpatches;  faces = realloc (faces, nbfaces * sizeof (msh_face));  for (i = nbfaces - nbpatches; i < nbfaces; i++)    {      faces[i] = patches[i - nbfaces + nbpatches];    }}voidMshConnectFaces (){  int i, j, k;  double min[3], max[3];  int nb;  int nbv1, nbv2;  int face, another_face;  double dist;  msh_vector cent[2];  oct_data *tab = NULL;  // Find pairs of all faces   // Boundary faces have no pair: -1  // Create an octree with face cfaces  if (nbfaces == 0)    return;  tab = malloc (nbfaces * sizeof (oct_data));  min[0] = faces[0].cface.x;  min[1] = faces[0].cface.y;  min[2] = faces[0].cface.z;  max[0] = faces[0].cface.x;  max[1] = faces[0].cface.y;  max[2] = faces[0].cface.z;  for (i = 0; i < nbfaces; i++)    {      tab[i].x = faces[i].cface.x;      tab[i].y = faces[i].cface.y;      tab[i].z = faces[i].cface.z;      min[0] = LMIN (min[0], faces[i].cface.x);      min[1] = LMIN (min[1], faces[i].cface.y);      min[2] = LMIN (min[2], faces[i].cface.z);      max[0] = LMAX (max[0], faces[i].cface.x);      max[1] = LMAX (max[1], faces[i].cface.y);      max[2] = LMAX (max[2], faces[i].cface.z);    }  OctCreateOctree (min, max, tab, nbfaces);  for (i = 0; i < nbleafs; i++)    {      nb = leafs[i].nbentities;      // For each node, we find the two corresponding faces      for (j = 0; j < nb; j++)	{	  face = leafs[i].entities[j];	  nbv1 = faces[face].nbnodes;	  cent[0] = faces[face].cface;	  if (faces[face].pair != -1)	    continue;	  for (k = j + 1; k < nb; k++)	    {	      another_face = leafs[i].entities[k];	      nbv2 = faces[another_face].nbnodes;	      cent[1] = faces[another_face].cface;	      dist = GeoMagVector (GeoSubVectorVector (cent[0], cent[1]));	      if (dist < EPSILON && nbv1 == nbv2 && face != another_face)		{		  faces[face].pair = another_face;		  faces[another_face].pair = face;		  break;		}	    }	  leafs[i].entities[k] = leafs[i].entities[nb - j - 1];	}    }  OctDestroyOctree ();  free (tab);}voidMshRemoveBoundaryFaces (){  int i;  int face, pair;  nbfaces -= nbpatches;  for (i = 0; i < nbfaces; i++)    {      face = i;      pair = faces[face].pair;      if (pair != -1)	{	  faces[face].physreg = faces[pair].physreg;	  faces[face].elemreg = faces[pair].elemreg;	  faces[face].partition = faces[pair].partition;	  faces[face].bc = faces[pair].bc;	}    }  for (i = 0; i < nbfaces; i++)    {      face = i;      faces[face].pair = -1;    }  faces = realloc (faces, nbfaces * sizeof (msh_face));}voidMshCalcNewElementCenters (){  int i, j;  int element, face;  double x[8], y[8], z[8];  for (i = 0; i < nbelements; i++)    {      element = i;      if (elements[element].type == TETRAHEDRON)	{	  // Element centre = centre of sphere connecting face centers	  elements[element].celement.x = 0.0;	  elements[element].celement.y = 0.0;	  elements[element].celement.z = 0.0;	  for (j = 0; j < elements[element].nbfaces; j++)	    {	      face = elements[element].face[j];	      x[j] = faces[face].cface.x;	      y[j] = faces[face].cface.y;	      z[j] = faces[face].cface.z;	    }	  elements[element].celement.x =	    -0.5 * (y[2] * z[3] - y[2] * z[0] - y[0] * z[3] - z[2] * y[3] +		    z[2] * y[0] + z[0] * y[3]) / (-x[2] * y[1] * z[0] +						  x[1] * y[0] * z[3] -						  x[1] * z[0] * y[3] +						  x[2] * z[1] * y[0] -						  x[3] * y[1] * z[2] -						  x[1] * y[2] * z[3] +						  x[1] * y[2] * z[0] +						  x[1] * z[2] * y[3] -						  x[1] * z[2] * y[0] +						  x[0] * y[2] * z[3] -						  x[0] * z[2] * y[3] +						  x[2] * y[1] * z[3] -						  x[2] * y[0] * z[3] -						  x[2] * z[1] * y[3] +						  x[2] * z[0] * y[3] -						  x[0] * y[1] * z[3] +						  x[0] * z[1] * y[3] +						  x[3] * y[1] * z[0] +						  x[3] * z[2] * y[0] +						  x[3] * z[1] * y[2] -						  x[3] * z[1] * y[0] -						  x[3] * y[2] * z[0] +						  x[0] * y[1] * z[2] -						  x[0] * z[1] * y[2]) *	    (x[1] * x[1] - x[0] * x[0] + y[1] * y[1] - y[0] * y[0] +	     z[1] * z[1] - z[0] * z[0]) + 0.5 * (-y[1] * z[0] + z[1] * y[0] +						 y[1] * z[3] - y[0] * z[3] -						 z[1] * y[3] +						 z[0] * y[3]) / (-x[2] *								 y[1] * z[0] +								 x[1] * y[0] *								 z[3] -								 x[1] * z[0] *								 y[3] +								 x[2] * z[1] *								 y[0] -								 x[3] * y[1] *								 z[2] -								 x[1] * y[2] *								 z[3] +								 x[1] * y[2] *								 z[0] +								 x[1] * z[2] *								 y[3] -								 x[1] * z[2] *								 y[0] +								 x[0] * y[2] *								 z[3] -								 x[0] * z[2] *								 y[3] +								 x[2] * y[1] *								 z[3] -								 x[2] * y[0] *								 z[3] -								 x[2] * z[1] *								 y[3] +								 x[2] * z[0] *								 y[3] -								 x[0] * y[1] *								 z[3] +								 x[0] * z[1] *								 y[3] +								 x[3] * y[1] *								 z[0] +								 x[3] * z[2] *								 y[0] +								 x[3] * z[1] *								 y[2] -								 x[3] * z[1] *								 y[0] -								 x[3] * y[2] *								 z[0] +								 x[0] * y[1] *								 z[2] -								 x[0] * z[1] *								 y[2]) *	    (x[2] * x[2] - x[0] * x[0] + y[2] * y[2] - y[0] * y[0] +	     z[2] * z[2] - z[0] * z[0]) - 0.5 * (+y[1] * z[2] - y[1] * z[0] -						 z[2] * y[0] - z[1] * y[2] +						 z[1] * y[0] +						 y[2] * z[0]) / (-x[2] *								 y[1] * z[0] +								 x[1] * y[0] *								 z[3] -								 x[1] * z[0] *								 y[3] +								 x[2] * z[1] *								 y[0] -								 x[3] * y[1] *								 z[2] -								 x[1] * y[2] *								 z[3] +								 x[1] * y[2] *								 z[0] +								 x[1] * z[2] *								 y[3] -								 x[1] * z[2] *								 y[0] +								 x[0] * y[2] *								 z[3] -								 x[0] * z[2] *								 y[3] +								 x[2] * y[1] *								 z[3] -								 x[2] * y[0] *								 z[3] -								 x[2] * z[1] *								 y[3] +								 x[2] * z[0] *								 y[3] -								 x[0] * y[1] *								 z[3] +								 x[0] * z[1] *								 y[3] +								 x[3] * y[1] *								 z[0] +								 x[3] * z[2] *								 y[0] +								 x[3] * z[1] *								 y[2] -								 x[3] * z[1] *								 y[0] -								 x[3] * y[2] *								 z[0] +								 x[0] * y[1] *								 z[2] -								 x[0] * z[1] *								 y[2]) *	    (x[3] * x[3] - x[0] * x[0] + y[3] * y[3] - y[0] * y[0] +	     z[3] * z[3] - z[0] * z[0]);	  elements[element].celement.y =	    +0.5 * (x[2] * z[3] - x[2] * z[0] - x[0] * z[3] - z[2] * x[3] +		    z[2] * x[0] + z[0] * x[3]) / (-x[2] * y[1] * z[0] +						  x[1] * y[0] * z[3] -						  x[1] * z[0] * y[3] +						  x[2] * z[1] * y[0] -						  x[3] * y[1] * z[2] -						  x[1] * y[2] * z[3] +						  x[1] * y[2] * z[0] +						  x[1] * z[2] * y[3] -						  x[1] * z[2] * y[0] +						  x[0] * y[2] * z[3] -						  x[0] * z[2] * y[3] +						  x[2] * y[1] * z[3] -						  x[2] * y[0] * z[3] -						  x[2] * z[1] * y[3] +						  x[2] * z[0] * y[3] -						  x[0] * y[1] * z[3] +						  x[0] * z[1] * y[3] +						  x[3] * y[1] * z[0] +						  x[3] * z[2] * y[0] +						  x[3] * z[1] * y[2] -						  x[3] * z[1] * y[0] -						  x[3] * y[2] * z[0] +						  x[0] * y[1] * z[2] -						  x[0] * z[1] * y[2]) *	    (x[1] * x[1] - x[0] * x[0] + y[1] * y[1] - y[0] * y[0] +	     z[1] * z[1] - z[0] * z[0]) - 0.5 * (+x[1] * z[3] - x[1] * z[0] -						 x[0] * z[3] - z[1] * x[3] +						 z[1] * x[0] +						 z[0] * x[3]) / (-x[2] *								 y[1] * z[0] +								 x[1] * y[0] *								 z[3] -								 x[1] * z[0] *								 y[3] +								 x[2] * z[1] *								 y[0] -								 x[3] * y[1] *								 z[2] -								 x[1] * y[2] *								 z[3] +								 x[1] * y[2] *								 z[0] +								 x[1] * z[2] *								 y[3] -								 x[1] * z[2] *								 y[0] +								 x[0] * y[2] *								 z[3] -								 x[0] * z[2] *								 y[3] +								 x[2] * y[1] *								 z[3] -								 x[2] * y[0] *								 z[3] -								 x[2] * z[1] *								 y[3] +								 x[2] * z[0] *								 y[3] -								 x[0] * y[1] *								 z[3] +								 x[0] * z[1] *								 y[3] +								 x[3] * y[1] *								 z[0] +								 x[3] * z[2] *								 y[0] +								 x[3] * z[1] *								 y[2] -								 x[3] * z[1] *								 y[0] -								 x[3] * y[2] *								 z[0] +								 x[0] * y[1] *								 z[2] -								 x[0] * z[1] *

⌨️ 快捷键说明

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