cogenoctree.hxx

来自「有限元学习研究用源代码(老外的),供科研人员参考」· HXX 代码 · 共 150 行

HXX
150
字号
#ifndef cogenoctree_hxx
#define cogenoctree_hxx

#ifndef cogenerator_hxx
#include "cogenerator.hxx"
#endif

class CogenOctreeBox
{
protected:
friend class CogenOctree;
  wzRegion	region;
  wzFloat	min[wzPointDim];
  wzFloat	max[wzPointDim];
  wzIndex	part;
};

class CogenOctreeFace
{
protected:
friend class CogenOctree;
  wzFace	face;
  wzFloat	min[wzPointDim];
  wzFloat	max[wzPointDim];
  wzIndex	part;
};

class CogenOctreeRefineItem{
protected:
friend class CogenOctree;
  wzFloat	dist[wzPointDim];
  wzIndex	box;
};

class ibgOctree;
typedef wzProxy<ibgOctree> ibgoctree;

class CogenOctree
  :public Cogenerator,
   protected Cogeometry, 
   public wzChart,
   public wzDiagonalMetricSimple,
   protected wzTensorGrid
{
public:
  static wzFloat epsilon;
  wzSimpleRange	blist;
  wzSimpleRange	flist;
  wzSimpleRange	rlist;
  wzArray<CogenOctreeBox>	box;
  wzArray<CogenOctreeFace>	face;
  wzArray<CogenOctreeRefineItem> refine;
  CogenOctree();
  virtual cogenOctree	cogenoctree() const;
  cogenerator	generator() const {return (CogenOctree*)this;}
  virtual cogeometry	geometry() const {return (CogenOctree*)this;}
  virtual wzmetric	refinement() const 
  {return (wzDiagonalMetricSimple*)(CogenOctree*)this;}
  virtual wzchart	chart() const 
  {return (CogenOctree*)this;}
  wzIndex addBox(wzRegion r, wzFloat *xmin, wzFloat *xmax);
  wzIndex addBox(wzRegion r,
		 wzFloat xmin = -wzInfty, wzFloat xmax = wzInfty,
		 wzFloat ymin = -wzInfty, wzFloat ymax = wzInfty,
		 wzFloat zmin = -wzInfty, wzFloat zmax = wzInfty);
  wzIndex refinementInBox(wzFloat dx, wzFloat dy, wzFloat dz, wzIndex b);
  wzIndex refinementIsotropicalInBox(wzFloat dx, wzIndex b)
  {return refinementInBox(dx,dx,dx,b);}
  void setBorder(
		 wzFloat xmin = -wzInfty, wzFloat xmax = wzInfty,
		 wzFloat ymin = -wzInfty, wzFloat ymax = wzInfty,
		 wzFloat zmin = -wzInfty, wzFloat zmax = wzInfty);
  void addPlane(wzIndex dir, wzFloat x);
  void addPlaneX(wzFloat x) {addPlane(0,x);}
  void addPlaneY(wzFloat y) {addPlane(1,y);}
  void addPlaneZ(wzFloat z) {addPlane(2,z);}
  void addPlanesOfPoint(wzFloat x = 0, wzFloat y = 0, wzFloat z = 0)
  {addPlane(0,x);addPlane(1,y);addPlane(2,z);}
  void setFaceOfBox(wzFace f, wzIndex box);
  void setFaceOfBoxSide(wzFace f, wzIndex box, wzIndex dir);
  void setFaceInBox(wzFace f, wzFloat *xmin, wzFloat *xmax);
  void setFaceInBox(wzFace f,
		    wzFloat xmin = -wzInfty, wzFloat xmax = wzInfty,
		    wzFloat ymin = -wzInfty, wzFloat ymax = wzInfty,
		    wzFloat zmin = -wzInfty, wzFloat zmax = wzInfty);
  void setFaceOnPlaneX(wzFace f, wzFloat x,
		    wzFloat ymin = -wzInfty, wzFloat ymax = wzInfty,
		    wzFloat zmin = -wzInfty, wzFloat zmax = wzInfty)
  {setFaceInBox(f,x,x,ymin,ymax,zmin,zmax);}
  void setFaceOnPlaneY(wzFace f, wzFloat y,
		    wzFloat xmin = -wzInfty, wzFloat xmax = wzInfty,
		    wzFloat zmin = -wzInfty, wzFloat zmax = wzInfty)
  {setFaceInBox(f,xmin,xmax,y,y,zmin,zmax);}
  void setFaceOnPlaneZ(wzFace f, wzFloat z,
		    wzFloat xmin = -wzInfty, wzFloat xmax = wzInfty,
		    wzFloat ymin = -wzInfty, wzFloat ymax = wzInfty)
  {setFaceInBox(f,xmin,xmax,ymin,ymax,z,z);}
  void setRegularRefinementX(wzIndex i) {setRefinement(0,i);}
  void setRegularRefinementY(wzIndex i) {setRefinement(1,i);}
  void setRegularRefinementZ(wzIndex i) {setRefinement(2,i);}
  void setRegularRefinement(wzIndex dir, wzIndex i) {setRefinement(dir,i);}
  virtual void endInitialization();
  // implementations
  virtual wzFloat 	chi(const wzPoint& p) const;
  virtual wzIndex	Point(wzPoint& p0) const;
  virtual wzIndex	Line (cogFlag1& f, const cogLine& s) const;
  virtual wzIndex 	BoundaryCondition(cogFlag1& f) const;
  virtual wzpoints	generatePoints(cogeometry g,wzmetric r,wzchart c) const;
  virtual void 		getMetric(wzMetricData& data, const wzPoint& p) const;
  virtual void		getMetric(wzMetricData& data, const cogFlag1& f) const;
  // internal calls:
private:
  wzBoolean inBox(wzIndex b, const wzPoint& p) const;
  void mark(ibgoctree gg, wzFloat delta) const;
  void shift(ibgoctree gg, wzFloat delta) const;
  void hideIrregular(ibgoctree gg) const;
  void hideLongSideIntersections(ibgoctree gg) const;
  wzIndex boundaryLevel;
public:
  void omitVertexComputation() {boundaryLevel = 2;}
  void omitEdgeComputation()   {boundaryLevel = 1;}
  void omitFaceComputation()   {boundaryLevel = 0;}
wzObsoleteCode:
  wzIndex addRegion(wzRegion r, wzFloat *xmin, wzFloat *xmax)
  {return addBox(r,xmin,xmax);}
  wzIndex addRegion(wzRegion r,
		    wzFloat xmin = -wzInfty, wzFloat xmax = wzInfty,
		    wzFloat ymin = -wzInfty, wzFloat ymax = wzInfty,
		    wzFloat zmin = -wzInfty, wzFloat zmax = wzInfty)
  {return addBox(r,xmin,xmax,ymin,ymax,zmin,zmax);}
  void setBox(
	      wzFloat xmin = -wzInfty, wzFloat xmax = wzInfty,
	      wzFloat ymin = -wzInfty, wzFloat ymax = wzInfty,
	      wzFloat zmin = -wzInfty, wzFloat zmax = wzInfty)
  {setBorder(xmin,xmax,ymin,ymax,zmin,zmax);}
  void setFaceOfRegion(wzFace f, wzIndex r)
  {setFaceOfBox(f,r);}
  void setFaceOfRegionSide(wzFace f, wzIndex r, wzIndex dir)
  {setFaceOfBoxSide(f,r,dir);}
};

typedef wzProxy<CogenOctree> cogenOctree;

// obsolete:

#define cogenBasic cogenOctree
#define CogenBasic CogenOctree

#endif

⌨️ 快捷键说明

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