📄 pos_search.c
字号:
#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 + -