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

📄 setup.c

📁 OpenFVM-v1.1 open source cfd code
💻 C
字号:
/*************************************************************************** *   Copyright (C) 2004-2008 by OpenFVM team                               * *   http://sourceforge.net/projects/openfvm/                              * *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * *   This program is distributed in the hope that it will be useful,       * *   but WITHOUT ANY WARRANTY; without even the implied warranty of        * *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         * *   GNU General Public License for more details.                          * *                                                                         * *   You should have received a copy of the GNU General Public License     * *   along with this program; if not, write to the                         * *   Free Software Foundation, Inc.,                                       * *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             * ***************************************************************************/#include <string.h>#include <malloc.h>#include <math.h>#include "variables.h"#include "vector.h"#include "mesh.h"#include "material.h"#include "bcond.h"#include "param.h"#include "globals.h"#include "geocalc.h"#include "parser.h"voidSetInitialConditions (){  int i, j;  int element, volume;  int rv;  double value;  gs = calloc (MAXL, sizeof (char));  for (i = 0; i < nbelements; i++)    {      element = i;      elements[element].bc = NONE;      V_SetCmp (&xu, elements[element].index, 0.0);      V_SetCmp (&xv, elements[element].index, 0.0);      V_SetCmp (&xw, elements[element].index, 0.0);      V_SetCmp (&xp, elements[element].index, 0.0);      V_SetCmp (&xT, elements[element].index, 0.0);      V_SetCmp (&xs, elements[element].index, 0.0);    }  for (j = 0; j < nbbcvolumes; j++)    {      volume = j;      for (i = 0; i < nbelements; i++)	{	  element = i;	  if (elements[element].physreg == bcvolumes[volume].physreg)	    {	      elements[element].bc = bcvolumes[volume].bc;	      cx = elements[element].celement.x;	      cy = elements[element].celement.y;	      cz = elements[element].celement.z;	      strcpy (gs, bcvolumes[volume].fu);	      strcat (gs, "\n");	      rv = evaluate (gs, &value);	      V_SetCmp (&xu, elements[element].index, value);	      strcpy (gs, bcvolumes[volume].fv);	      strcat (gs, "\n");	      rv = evaluate (gs, &value);	      V_SetCmp (&xv, elements[element].index, value);	      strcpy (gs, bcvolumes[volume].fw);	      strcat (gs, "\n");	      rv = evaluate (gs, &value);	      V_SetCmp (&xw, elements[element].index, value);	      strcpy (gs, bcvolumes[volume].fp);	      strcat (gs, "\n");	      rv = evaluate (gs, &value);	      V_SetCmp (&xp, elements[element].index, value);	      strcpy (gs, bcvolumes[volume].fT);	      strcat (gs, "\n");	      rv = evaluate (gs, &value);	      V_SetCmp (&xT, elements[element].index, value);	      strcpy (gs, bcvolumes[volume].fs);	      strcat (gs, "\n");	      rv = evaluate (gs, &value);	      V_SetCmp (&xs, elements[element].index, value);	    }	}    }  free (gs);  for (j = 0; j < nbbcvolumes; j++)    {      volume = j;      free (bcvolumes[volume].fu);      free (bcvolumes[volume].fv);      free (bcvolumes[volume].fw);      free (bcvolumes[volume].fp);      free (bcvolumes[volume].fT);      free (bcvolumes[volume].fs);    }  free (bcvolumes);  VecAssemblyBegin (xu);  VecAssemblyEnd (xu);  VecAssemblyBegin (xv);  VecAssemblyEnd (xv);  VecAssemblyBegin (xw);  VecAssemblyEnd (xw);  VecAssemblyBegin (xp);  VecAssemblyEnd (xp);  VecAssemblyBegin (xT);  VecAssemblyEnd (xT);  VecAssemblyBegin (xs);  VecAssemblyEnd (xs);  VecGhostUpdateBegin (xu, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateEnd (xu, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateBegin (xv, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateEnd (xv, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateBegin (xw, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateEnd (xw, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateBegin (xp, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateEnd (xp, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateBegin (xT, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateEnd (xT, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateBegin (xs, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateEnd (xs, INSERT_VALUES, SCATTER_FORWARD);  VecCopy (xu, xu0);  VecCopy (xv, xv0);  VecCopy (xw, xw0);  VecCopy (xp, xp0);  VecCopy (xT, xT0);  VecCopy (xs, xs0);}voidSetInitialFlux (){  int i;  int face, pair;  int element, neighbor;  msh_element ghost;  //double dNf, dPf;  double lambda;  VecGhostGetLocalForm (xu, &xul);  VecGhostGetLocalForm (xv, &xvl);  VecGhostGetLocalForm (xw, &xwl);  for (i = 0; i < nbfaces; i++)    {      face = i;      element = faces[face].element;      pair = faces[face].pair;      // Internal face - neighbor in this processor      if (pair != -1)	{	  neighbor = faces[pair].element;          /*	  dNf =	    GeoMagVector (GeoSubVectorVector			  (elements[neighbor].celement, faces[face].cface));	  dPf =	    GeoMagVector (GeoSubVectorVector			  (elements[element].celement, faces[face].cface));	  lambda = dPf / (dPf + dNf);	  */	  lambda = 0.5;	  V_SetCmp (&uf, face,		    (V_GetCmp (&xul, neighbor) * lambda +		     V_GetCmp (&xul, element) * (1 - lambda)) *		    faces[face].n.x +		    (V_GetCmp (&xvl, neighbor) * lambda +		     V_GetCmp (&xvl, element) * (1 - lambda)) *		    faces[face].n.y +		    (V_GetCmp (&xwl, neighbor) * lambda +		     V_GetCmp (&xwl, element) * (1 - lambda)) *		    faces[face].n.z);	}      else	{	  if (faces[face].bc == PROCESSOR)	    {	      // Face between processors	      ghost.index = faces[face].physreg;	      ghost.celement.x = V_GetCmp (&cexl, faces[face].ghost);	      ghost.celement.y = V_GetCmp (&ceyl, faces[face].ghost);	      ghost.celement.z = V_GetCmp (&cezl, faces[face].ghost);	      /*	      dNf =		GeoMagVector (GeoSubVectorVector			      (ghost.celement, faces[face].cface));	      dPf =		GeoMagVector (GeoSubVectorVector			      (elements[element].celement,			       faces[face].cface));	      lambda = dPf / (dPf + dNf);	      */	      lambda = 0.5;	      V_SetCmp (&uf, face,			(V_GetCmp (&xul, faces[face].ghost) * lambda +			 V_GetCmp (&xul, element) * (1 - lambda)) *			faces[face].n.x +			(V_GetCmp (&xvl, faces[face].ghost) * lambda +			 V_GetCmp (&xvl, element) * (1 - lambda)) *			faces[face].n.y +			(V_GetCmp (&xwl, faces[face].ghost) * lambda +			 V_GetCmp (&xwl, element) * (1 - lambda)) *			faces[face].n.z);	    }	  else	    {	      // Boundary face	      V_SetCmp (&uf, face,			V_GetCmp (&xul, element) *			faces[face].n.x +			V_GetCmp (&xvl, element) *			faces[face].n.y +			V_GetCmp (&xwl, element) * faces[face].n.z);	    }	}    }  VecGhostRestoreLocalForm (xu, &xul);  VecGhostRestoreLocalForm (xv, &xvl);  VecGhostRestoreLocalForm (xw, &xwl);  VecAssemblyBegin (uf);  VecAssemblyEnd (uf);}voidSetBoundary (){  int i, j, n;  int face, pair, surface;  int rv;  double value;  int cyclic[2];  gs = calloc (MAXL, sizeof (char));  for (i = 0; i < nbfaces; i++)    {      face = i;      pair = faces[face].pair;      if (pair != -1 && faces[face].bc != PROCESSOR)	{	  faces[face].bc = NONE;	}      V_SetCmp (&xuf, face, 0.0);      V_SetCmp (&xvf, face, 0.0);      V_SetCmp (&xwf, face, 0.0);      V_SetCmp (&xpf, face, 0.0);      V_SetCmp (&xTf, face, 0.0);      V_SetCmp (&xsf, face, 0.0);    }  for (j = 0; j < nbbcsurfaces; j++)    {      surface = j;      for (i = 0; i < nbfaces; i++)	{	  face = i;	  if (faces[face].bc == PROCESSOR)	    continue;	  pair = faces[face].pair;	  if (pair != -1)	    continue;	  if (faces[face].physreg == bcsurfaces[surface].physreg)	    {	      faces[face].bc = bcsurfaces[surface].bc;	      cx = faces[face].cface.x;	      cy = faces[face].cface.y;	      cz = faces[face].cface.z;	      strcpy (gs, bcsurfaces[surface].fu);	      strcat (gs, "\n");	      rv = evaluate (gs, &value);	      V_SetCmp (&xuf, face, value);	      strcpy (gs, bcsurfaces[surface].fv);	      strcat (gs, "\n");	      rv = evaluate (gs, &value);	      V_SetCmp (&xvf, face, value);	      strcpy (gs, bcsurfaces[surface].fw);	      strcat (gs, "\n");	      rv = evaluate (gs, &value);	      V_SetCmp (&xwf, face, value);	      strcpy (gs, bcsurfaces[surface].fp);	      rv = evaluate (gs, &value);	      strcat (gs, "\n");	      V_SetCmp (&xpf, face, value);	      strcpy (gs, bcsurfaces[surface].fT);	      strcat (gs, "\n");	      rv = evaluate (gs, &value);	      V_SetCmp (&xTf, face, value);	      strcpy (gs, bcsurfaces[surface].fs);	      strcat (gs, "\n");	      rv = evaluate (gs, &value);	      V_SetCmp (&xsf, face, value);	    }	}    }  free (gs);  for (j = 0; j < nbbcsurfaces; j++)    {      surface = j;      free (bcsurfaces[surface].fu);      free (bcsurfaces[surface].fv);      free (bcsurfaces[surface].fw);      free (bcsurfaces[surface].fp);      free (bcsurfaces[surface].fT);      free (bcsurfaces[surface].fs);    }  free (bcsurfaces);  n = 0;  for (i = 0; i < nbfaces; i++)    {      face = i;      if (faces[face].bc == CYCLIC)	{	  if (n < 2)	    {	      cyclic[n] = face;	      n++;	    }	}    }  if (n == 2)    {      faces[cyclic[0]].pair = cyclic[1];      faces[cyclic[1]].pair = cyclic[0];      faces[cyclic[0]].dj *= 2.0;      faces[cyclic[1]].dj *= 2.0;      //PetscPrintf(PETSC_COMM_WORLD, "element: %d, neighbor: %d\n", faces[cyclic[0]].element, faces[cyclic[1]].element);    }  VecAssemblyBegin (xuf);  VecAssemblyEnd (xuf);  VecAssemblyBegin (xvf);  VecAssemblyEnd (xvf);  VecAssemblyBegin (xwf);  VecAssemblyEnd (xwf);  VecAssemblyBegin (xpf);  VecAssemblyEnd (xpf);  VecAssemblyBegin (xTf);  VecAssemblyEnd (xTf);  VecAssemblyBegin (xsf);  VecAssemblyEnd (xsf);}voidSetMaterialProperties (){  int i;  int element;  double fr[2];  VecGhostGetLocalForm (xs0, &xs0l);  VecGhostGetLocalForm (xs, &xsl);  for (i = 0; i < nbelements; i++)    {      element = i;      fr[1] = LMIN(LMAX(V_GetCmp (&xsl, element) * 0.5 + V_GetCmp (&xs0l, element) * 0.5, 0.0), 1.0);      fr[0] = 1.0 - fr[1];      V_SetCmp (&dens, elements[element].index,		material.dens[0].cdens * fr[0] +		material.dens[1].cdens * fr[1]);      V_SetCmp (&visc, elements[element].index,		material.visc[0].cvisc * fr[0] +		material.visc[1].cvisc * fr[1]);      V_SetCmp (&spheat, elements[element].index,		material.therm[0].cspheat * fr[0] +		material.therm[1].cspheat * fr[1]);      V_SetCmp (&thcond, elements[element].index,		material.therm[0].cthcond * fr[0] +		material.therm[1].cthcond * fr[1]);    }  VecGhostRestoreLocalForm (xs, &xsl);  VecGhostRestoreLocalForm (xs0, &xs0l);  VecAssemblyBegin (dens);  VecAssemblyEnd (dens);  VecAssemblyBegin (visc);  VecAssemblyEnd (visc);  VecAssemblyBegin (thcond);  VecAssemblyEnd (thcond);  VecAssemblyBegin (spheat);  VecAssemblyEnd (spheat);  VecGhostUpdateBegin (dens, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateEnd (dens, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateBegin (visc, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateEnd (visc, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateBegin (spheat, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateEnd (spheat, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateBegin (thcond, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateEnd (thcond, INSERT_VALUES, SCATTER_FORWARD);}voidSetCenters (){  int i;  int element;  for (i = 0; i < nbelements; i++)    {      element = i;      V_SetCmp (&cex, elements[element].index, elements[element].celement.x);      V_SetCmp (&cey, elements[element].index, elements[element].celement.y);      V_SetCmp (&cez, elements[element].index, elements[element].celement.z);    }  VecAssemblyBegin (cex);  VecAssemblyEnd (cex);  VecAssemblyBegin (cey);  VecAssemblyEnd (cey);  VecAssemblyBegin (cez);  VecAssemblyEnd (cez);  VecGhostUpdateBegin (cex, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateEnd (cex, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateBegin (cey, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateEnd (cey, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateBegin (cez, INSERT_VALUES, SCATTER_FORWARD);  VecGhostUpdateEnd (cez, INSERT_VALUES, SCATTER_FORWARD);}voidSetGhosts (){  int i;  int face;  nbghosts = 0;  for (i = 0; i < nbfaces; i++)    {      face = i;      if (faces[face].pair != -1)	continue;      if (faces[face].bc == PROCESSOR)	{	  faces[face].ghost = nbelements + nbghosts;	  nbghosts++;	}    }  ghosts = calloc (nbghosts, sizeof (int));  nbghosts = 0;  for (i = 0; i < nbfaces; i++)    {      face = i;      if (faces[face].pair != -1)	continue;      if (faces[face].bc == PROCESSOR)	{	  ghosts[nbghosts] = faces[face].physreg;	  nbghosts++;	}    }}

⌨️ 快捷键说明

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