📄 velocity.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 "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 + -