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

📄 velocity.c

📁 OpenFVM-v1.1 open source cfd code
💻 C
📖 第 1 页 / 共 2 页
字号:
/*************************************************************************** *   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 "globals.h"#include "mesh.h"#include "material.h"#include "bcond.h"#include "param.h"#include "variables.h"#include "gradient.h"#include "geocalc.h"#include "setup.h"#include "msolver.h"#include "velocity.h"voidCorrectVelocityField (){  unsigned int i, j;  register unsigned int face;  register unsigned int element;  msh_vector gradp;  msh_vector sum1;  msh_vector sum2;  double u, v, w;  if (parameter.calc[is] == LOGICAL_TRUE)    {      for (i = 0; i < nbelements; i++)	{	  element = i;	  sum1.x = 0.0;	  sum1.y = 0.0;	  sum1.z = 0.0;	  sum2.x = 0.0;	  sum2.y = 0.0;	  sum2.z = 0.0;	  for (j = 0; j < elements[element].nbfaces; j++)	    {	      face = elements[element].face[j];	      sum1.x += LABS (faces[face].A.x);	      sum1.y += LABS (faces[face].A.y);	      sum1.z += LABS (faces[face].A.z);	      sum2.x += V_GetCmp (&uf, face + 1) * faces[face].A.x;	      sum2.y += V_GetCmp (&uf, face + 1) * faces[face].A.y;	      sum2.z += V_GetCmp (&uf, face + 1) * faces[face].A.z;	    }	  u = sum2.x / sum1.x;	  v = sum2.y / sum1.y;	  w = sum2.z / sum1.z;	  //printf("u: %f\n", u);	  //printf("v: %f\n", v);	  //printf("w: %f\n", w);	  V_SetCmp (&xu, element + 1, u);	  V_SetCmp (&xv, element + 1, v);	  V_SetCmp (&xw, element + 1, w);	}    }  else    {      for (i = 0; i < nbelements; i++)	{	  element = i;	  gradp = Gradient (&xp, &xpf, LOGICAL_TRUE, element);	  V_SetCmp (&xu, element + 1, (V_GetCmp (&hu, element + 1) - gradp.x) / V_GetCmp (&ap, element + 1));	  V_SetCmp (&xv, element + 1, (V_GetCmp (&hv, element + 1) - gradp.y) / V_GetCmp (&ap, element + 1));	  V_SetCmp (&xw, element + 1, (V_GetCmp (&hw, element + 1) - gradp.z) / V_GetCmp (&ap, element + 1));	}    }}voidCorrectFaceUVW (){  int i;  unsigned int face, pair;  register unsigned int element;  unsigned int neighbor;  double apj;  //double dNf, dPf;  double lambda;  double ppl;  double pnl;  msh_vector gradpp;  msh_vector gradpn;  for (i = 0; i < nbfaces; i++)    {      face = i;      element = faces[face].element;      pair = faces[face].pair;      if (parameter.orthof != 0.0)	gradpp = Gradient (&xp, &xpf, LOGICAL_TRUE, element);      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;	  apj = V_GetCmp (&ap, neighbor + 1) * lambda + V_GetCmp (&ap, element + 1) * (1.0 - lambda);	  if (parameter.orthof != 0.0)	    gradpn = Gradient (&xp, &xpf, LOGICAL_TRUE, neighbor);	  ppl = V_GetCmp (&xp, element + 1);	  if (parameter.orthof != 0.0)	    {	      ppl += parameter.orthof * GeoDotVectorVector (gradpp, GeoSubVectorVector (faces[face].rpl, elements[element].celement));	    }	  pnl = V_GetCmp (&xp, neighbor + 1);	  if (parameter.orthof != 0.0)	    {	      pnl += parameter.orthof * GeoDotVectorVector (gradpn, GeoSubVectorVector (faces[face].rnl, elements[neighbor].celement));	    }	  V_SetCmp (&uf, face + 1, V_GetCmp (&uf, face + 1) - 1.0 / apj * (pnl - ppl) / (faces[face].dj + faces[face].kj));	  V_SetCmp (&xuf, face + 1, V_GetCmp (&uf, face + 1) * faces[face].n.x);	  V_SetCmp (&xvf, face + 1, V_GetCmp (&uf, face + 1) * faces[face].n.y);	  V_SetCmp (&xwf, face + 1, V_GetCmp (&uf, face + 1) * faces[face].n.z);	}      else	{	  apj = V_GetCmp (&ap, element + 1);	  ppl = V_GetCmp (&xp, element + 1);	  if (parameter.orthof != 0.0)	    {	      ppl += parameter.orthof * GeoDotVectorVector (gradpp, GeoSubVectorVector (faces[face].rpl, elements[element].celement));	    }	  if (faces[face].bc == PERMEABLE)	    {	      V_SetCmp (&uf, face + 1, (V_GetCmp (&uf, face + 1) - 1.0 / (apj * (faces[face].dj + faces[face].kj)) * (V_GetCmp (&xpf, face + 1) - ppl)));	      // Wall	      /*	      V_SetCmp (&xuf, face + 1, V_GetCmp (&uf,  face + 1) * faces[face].n.x * (1.0 - V_GetCmp(&xs, element + 1)));	      V_SetCmp (&xvf, face + 1, V_GetCmp (&uf,  face + 1) * faces[face].n.y * (1.0 - V_GetCmp(&xs, element + 1)));	      V_SetCmp (&xwf, face + 1, V_GetCmp (&uf,  face + 1) * faces[face].n.z * (1.0 - V_GetCmp(&xs, element + 1)));	      */			      // Slip	      V_SetCmp (&xuf, face + 1, V_GetCmp (&xu, element + 1) * (1.0 - V_GetCmp(&xs, element + 1)));	      V_SetCmp (&xvf, face + 1, V_GetCmp (&xv, element + 1) * (1.0 - V_GetCmp(&xs, element + 1)));	      V_SetCmp (&xwf, face + 1, V_GetCmp (&xw, element + 1) * (1.0 - V_GetCmp(&xs, element + 1)));	    }	  if (faces[face].bc == OUTLET)	    {	      // velocity gradient = 0	      // specified pressure	      V_SetCmp (&uf, face + 1, V_GetCmp (&uf, face + 1) - 1.0 / (apj * (faces[face].dj + faces[face].kj)) * (V_GetCmp (&xpf, face + 1) - ppl));	      V_SetCmp (&xuf, face + 1, V_GetCmp (&uf, face + 1) * faces[face].n.x); 	      V_SetCmp (&xvf, face + 1, V_GetCmp (&uf, face + 1) * faces[face].n.y);	      V_SetCmp (&xwf, face + 1, V_GetCmp (&uf, face + 1) * faces[face].n.z);	    }	  if (faces[face].bc == PRESSUREINLET)	    {	      // velocity gradient = 0	      // specified pressure	      V_SetCmp (&uf, face + 1, V_GetCmp (&uf, face + 1) - 1.0 / (apj * (faces[face].dj + faces[face].kj)) * (V_GetCmp (&xpf, face + 1) - ppl));	      V_SetCmp (&xuf, face + 1, V_GetCmp (&uf, face + 1) * faces[face].n.x);	      V_SetCmp (&xvf, face + 1, V_GetCmp (&uf, face + 1) * faces[face].n.y);	      V_SetCmp (&xwf, face + 1, V_GetCmp (&uf, face + 1) * faces[face].n.z);	    }	  if (faces[face].bc == INLET ||	      faces[face].bc == MOVINGWALL ||	      faces[face].bc == WALL ||	      faces[face].bc == ADIABATICWALL || faces[face].bc == SURFACE)	    {	      // pressure gradient = 0	      // specified velocity	      V_SetCmp (&uf, face + 1, V_GetCmp (&xuf, face + 1) * faces[face].n.x + V_GetCmp (&xvf, face + 1) * faces[face].n.y + V_GetCmp (&xwf, face + 1) * faces[face].n.z);              V_SetCmp (&xpf, face + 1, ppl);	    }	  if (faces[face].bc == SLIP)	    {	      // pressure gradient = 0	      // velocity gradient = 0	      V_SetCmp (&xuf, face + 1, V_GetCmp (&xu, element + 1));	      V_SetCmp (&xvf, face + 1, V_GetCmp (&xv, element + 1));	      V_SetCmp (&xwf, face + 1, V_GetCmp (&xw, element + 1));	      V_SetCmp (&uf, face + 1, 0.0);	    }	}    }}voidCalculateCorrectionFactors (){  AddAsgn_VV (&hu, Mul_QV (Sub_QQ (Diag_Q (&Am), &Am), &xu));  AddAsgn_VV (&hv, Mul_QV (Sub_QQ (Diag_Q (&Am), &Am), &xv));  AddAsgn_VV (&hw, Mul_QV (Sub_QQ (Diag_Q (&Am), &Am), &xw));  //PrintVector(&xu);  //PrintVector(&hu);}voidBuildMomentumMatrix (double dt){  int i, j, n;  unsigned int face, pair;   register unsigned int element;  unsigned int neighbor;  double app;  double apn[MAXFACES];  unsigned int ani[MAXFACES];  double bpu, bpv, bpw;  double densp;  double viscj;  //msh_vector gradup, gradvp, gradwp;  //msh_vector gradun, gradvn, gradwn;  //msh_vector gradvisc;  msh_vector gradp;  //double dNf, dPf;  double lambda;  double xsi;  msh_vector g;  g.x = parameter.g[0];  g.y = parameter.g[1];  g.z = parameter.g[2];  // Equation: dU/dt + div(rho*U*U) - div(mi*grad(U)) = qU  for (i = 0; i < nbelements; i++)    {      element = i;      bpu = 0.0;      bpv = 0.0;      bpw = 0.0;      app = 0.0;      n = 0;      /*         gradup = Gradient (&xu, &xuf, LOGICAL_TRUE, element);         gradvp = Gradient (&xv, &xvf, LOGICAL_TRUE, element);         gradwp = Gradient (&xw, &xwf, LOGICAL_TRUE, element);       */      densp = V_GetCmp (&dens, element + 1);      for (j = 0; j < elements[element].nbfaces; j++)	{	  face = elements[element].face[j];	  pair = faces[face].pair;

⌨️ 快捷键说明

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