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

📄 pos_search.c

📁 cfd求解器使用与gmsh网格的求解
💻 C
📖 第 1 页 / 共 2 页
字号:
#define RCSID "$Id: Pos_Search.c,v 1.37 2006/02/26 00:42:59 geuzaine Exp $"/* * Copyright (C) 1997-2006 P. Dular, C. Geuzaine * * 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. * * Please report all bugs and problems to <getdp@geuz.org>. * * Contributor(s): *   Jean-Francois Remacle */#include "GetDP.h"#include "Data_Active.h"#include "Get_Geometry.h"#include "Pos_Search.h"#include "Get_DofOfElement.h"#include "CurrentData.h"#include "Tools.h"#include "Numeric.h"static struct Geo_Element  * LastGeoElement;/* ------------------------------------------------------------------------ *//*  C o m p u t e E l e m e n t B o x                                       *//* ------------------------------------------------------------------------ */void ComputeElementBox(struct Element * Element,		       struct ElementBox * ElementBox) {  int i;  GetDP_Begin("ComputeElementBox");  ElementBox->Xmin = ElementBox->Xmax = Element->x[0];  ElementBox->Ymin = ElementBox->Ymax = Element->y[0];  ElementBox->Zmin = ElementBox->Zmax = Element->z[0];  for (i = 1 ; i < Element->GeoElement->NbrNodes ; i++) {    ElementBox->Xmin = MIN(ElementBox->Xmin, Element->x[i]);    ElementBox->Xmax = MAX(ElementBox->Xmax, Element->x[i]);    ElementBox->Ymin = MIN(ElementBox->Ymin, Element->y[i]);    ElementBox->Ymax = MAX(ElementBox->Ymax, Element->y[i]);    ElementBox->Zmin = MIN(ElementBox->Zmin, Element->z[i]);    ElementBox->Zmax = MAX(ElementBox->Zmax, Element->z[i]);  }  GetDP_End ;}/* ------------------------------------------------------------------------ *//*  P o i n t I n X X X                                                     *//* ------------------------------------------------------------------------ */int PointInElementBox(struct ElementBox ElementBox, double x, double y, double z,		      double tol) {  GetDP_Begin("PointInElementBox");  if (x > ElementBox.Xmax + tol || x < ElementBox.Xmin - tol ||      y > ElementBox.Ymax + tol || y < ElementBox.Ymin - tol ||      z > ElementBox.Zmax + tol || z < ElementBox.Zmin - tol){    GetDP_Return(0);  }  else{    GetDP_Return(1);  }}int PointInRefElement (struct Element * Element, double u, double v, double w){  double ONE = 1. + 1.e-12;  double ZERO = 1.e-12;    GetDP_Begin("PointInRefElement");  switch(Element->Type) {  case LINE : case LINE_2 :    if (u<-ONE || u>ONE){       GetDP_Return(0);     }    GetDP_Return(1);  case TRIANGLE : case TRIANGLE_2 :    if (u<-ZERO || v<-ZERO || u>(ONE-v)){      GetDP_Return(0);     }    GetDP_Return(1);  case QUADRANGLE : case QUADRANGLE_2 :    if (u<-ONE  || v<-ONE || u>ONE || v>ONE){      GetDP_Return (0);    }    GetDP_Return(1);  case TETRAHEDRON : case TETRAHEDRON_2 :    if (u<-ZERO || v<-ZERO || w<-ZERO || u>(ONE-v-w)){      GetDP_Return(0);    }    GetDP_Return(1);  case HEXAHEDRON : case HEXAHEDRON_2 :    if (u<-ONE || v<-ONE || w<-ONE || u>ONE || v>ONE || w>ONE){      GetDP_Return(0);    }    GetDP_Return(1);  case PRISM : case PRISM_2 :    if (w>ONE || w<-ONE || u<-ZERO || v<-ZERO || u>(ONE-v)){      GetDP_Return(0);    }    GetDP_Return(1);  case PYRAMID : case PYRAMID_2 :    if (u<(w-ONE) || u>(ONE-w) || v<(w-ONE) || v>(ONE-w) || w<-ZERO || w>ONE){      GetDP_Return(0);    }    GetDP_Return(1);  default :    GetDP_Return(0);  }}int PointInElement (struct Element * Element,		    List_T *ExcludeRegion_L,		    double  x, double  y, double  z, 		    double *u, double *v, double *w, 		    double tol) {  struct ElementBox ElementBox ;  GetDP_Begin("PointInElement");  if(ExcludeRegion_L)    if(List_Search(ExcludeRegion_L, &Element->GeoElement->Region, fcmp_int)){      GetDP_Return(0);    }  Element->Num = Element->GeoElement->Num ;  Element->Type = Element->GeoElement->Type ;  Element->Region = Element->GeoElement->Region ;      Get_NodesCoordinatesOfElement(Element) ;  ComputeElementBox(Element, &ElementBox);  if (!PointInElementBox(ElementBox, x, y, z, tol)){    GetDP_Return(0);  }  xyz2uvwInAnElement(Element, x, y, z, u, v, w);  if(!PointInRefElement(Element, *u, *v, *w)){    /* Msg(INFO, "Point was in box, but not in actual element"); */    GetDP_Return(0);  }  GetDP_Return(1);}/* ------------------------------------------------------------------------ *//*  I n i t _ S e a r c h G r i d                                           *//* ------------------------------------------------------------------------ */void Init_SearchGrid(struct Grid * Grid) {  struct Element      Element;  struct ElementBox   ElementBox;  struct Brick        Brick, *Brick_P;  double Xc, Yc, Zc ;  int    NbrGeoElements, iElm;  int    Ix1, Ix2, Iy1, Iy2, Iz1, Iz2;  int    i, j, k, index;  GetDP_Begin("Init_SearchGrid");  LastGeoElement = NULL;  if(Grid->Init){    GetDP_End;  }  Grid->Xmin = Current.GeoData->Xmin;  Grid->Xmax = Current.GeoData->Xmax;  Grid->Ymin = Current.GeoData->Ymin;  Grid->Ymax = Current.GeoData->Ymax;  Grid->Zmin = Current.GeoData->Zmin;   Grid->Zmax = Current.GeoData->Zmax; #define NBB  20#define FACT 0.1  if(Grid->Xmin != Grid->Xmax && Grid->Ymin != Grid->Ymax && Grid->Zmin != Grid->Zmax){    Grid->Nx = Grid->Ny = Grid->Nz = NBB;    Xc = Grid->Xmax-Grid->Xmin; Yc = Grid->Ymax-Grid->Ymin; Zc = Grid->Zmax-Grid->Zmin;    Grid->Xmin -= FACT * Xc ; Grid->Ymin -= FACT * Yc ; Grid->Zmin -= FACT * Zc ;    Grid->Xmax += FACT * Xc ; Grid->Ymax += FACT * Yc ; Grid->Zmax += FACT * Zc ;  }  else if(Grid->Xmin != Grid->Xmax && Grid->Ymin != Grid->Ymax){    Grid->Nx = Grid->Ny = NBB ; Grid->Nz = 1 ;    Xc = Grid->Xmax-Grid->Xmin; Yc = Grid->Ymax-Grid->Ymin;    Grid->Xmin -= FACT * Xc ; Grid->Ymin -= FACT * Xc ; Grid->Zmin -= 1. ;    Grid->Xmax += FACT * Xc ; Grid->Ymax += FACT * Xc ; Grid->Zmax += 1. ;  }  else if(Grid->Xmin != Grid->Xmax && Grid->Zmin != Grid->Zmax){    Grid->Nx = Grid->Nz = NBB ; Grid->Ny = 1 ;    Xc = Grid->Xmax-Grid->Xmin; Zc = Grid->Zmax-Grid->Zmin;    Grid->Xmin -= FACT * Xc ; Grid->Ymin -= 1. ; Grid->Zmin -= FACT * Zc ;    Grid->Xmax += FACT * Xc ; Grid->Ymax += 1. ; Grid->Zmax += FACT * Zc ;  }  else if(Grid->Ymin != Grid->Ymax && Grid->Zmin != Grid->Zmax){    Grid->Nx = 1 ; Grid->Ny = Grid->Nz = NBB ;    Yc = Grid->Ymax-Grid->Ymin; Zc = Grid->Zmax-Grid->Zmin;    Grid->Xmin -= 1. ; Grid->Ymin -= FACT * Yc ; Grid->Zmin -= FACT * Zc ;    Grid->Xmax += 1. ; Grid->Ymax += FACT * Yc ; Grid->Zmax += FACT * Zc ;  }  else if(Grid->Xmin != Grid->Xmax){    Grid->Nx = NBB ; Grid->Ny = Grid->Nz = 1 ;    Xc = Grid->Xmax-Grid->Xmin;    Grid->Xmin -= FACT * Xc ; Grid->Ymin -= 1. ; Grid->Zmin -= 1. ;    Grid->Xmax += FACT * Xc ; Grid->Ymax += 1. ; Grid->Zmax += 1. ;  }  else if(Grid->Ymin != Grid->Ymax){    Grid->Nx = Grid->Nz = 1 ; Grid->Ny = NBB ;    Yc = Grid->Ymax-Grid->Ymin;    Grid->Xmin -= 1. ; Grid->Ymin -= FACT * Yc ; Grid->Zmin -= 1. ;    Grid->Xmax += 1. ; Grid->Ymax += FACT * Yc ; Grid->Zmax += 1. ;  }  else if(Grid->Zmin != Grid->Zmax){    Grid->Nx = Grid->Ny = 1 ; Grid->Nz = NBB ;    Zc = Grid->Zmax-Grid->Zmin;    Grid->Xmin -= 1. ; Grid->Ymin -= 1. ; Grid->Zmin -= FACT * Zc ;    Grid->Xmax += 1. ; Grid->Ymax += 1. ; Grid->Zmax += FACT * Zc ;  }  else{    Grid->Nx = Grid->Ny = Grid->Nz = 1;    Grid->Xmin -= 1. ; Grid->Ymin -= 1. ; Grid->Zmin -= 1. ;    Grid->Xmax += 1. ; Grid->Ymax += 1. ; Grid->Zmax += 1. ;  }  Msg(INFO, "Initializing rapid search grid...");  Grid->Bricks = List_Create(Grid->Nx * Grid->Ny * Grid->Nz, 10, sizeof(Brick));  for(i = 0; i < Grid->Nx * Grid->Ny * Grid->Nz ; i++){    for(j = 0 ; j < 3 ; j++) Brick.p[j] = List_Create(2, 2, sizeof(struct Geo_Element*));    List_Add(Grid->Bricks, &Brick);  }

⌨️ 快捷键说明

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