wzmetric.hxx

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

HXX
96
字号
#ifndef wzmetric_hxx
#define wzmetric_hxx

#include "wzpoint.hxx"
#include "cog.hxx"
#include "wzsafepointer.hxx"

const wzIndex wzMetricDataMaxSize = 20;

class wzMetricData{};

class wzMetricLocal: public wzMetricData{
public:
  wzFloat g_ii[wzMetricDataMaxSize];
};

class wzDiagonalMetricData: public wzMetricData
{
public:
  wzFloat g_ii[wzPointDim];
};

class wzMetric: public virtual wzProxyTarget{
public:
  virtual wzIndex size() const {return 0;}
  virtual void getMetric(wzMetricData& data, const wzPoint& p) const
  {;}
  virtual void getMetric(wzMetricData& data, const cogFlag1& f) const
  {;}
  virtual wzFloat g_ii(const wzMetricData& data, 
		       const wzPoint& q, wzIndex i) const
  {return 1.0;}
  virtual wzFloat g_ii(const wzMetricData& data, 
		       const cogFlag1& q, wzIndex i) const
  {return 1.0;}
  virtual wzFloat distance(const wzMetricData& data, 
			   const wzPoint& p,  const wzPoint& q) const;
  virtual wzFloat distance(const wzMetricData& data, 
			   const cogFlag1& f,  const wzPoint& q) const;
  wzBoolean refineBetween(const wzMetricData& data, 
			  const wzPoint& p,  const wzPoint& q) const
  {return (distance(data,p,q)>1);}
  wzBoolean refineBetween(const wzMetricData& data, 
			  const cogFlag1& p,  const wzPoint& q) const
  {return (distance(data,p,q)>1);}
  //obsolete
  wzBoolean refineBetween(const wzPoint& p,  const wzPoint& q) const
  {wzMetricLocal m; getMetric(m,p); return refineBetween(m,p,q);}
  void maximalLengthInRegion(wzFloat* d, const wzPoint& p) const
  {*d = wzInfty;}
};

class wzDiagonalMetricSimple: public wzMetric
{
protected:
  wzFloat G_ii[wzPointDim];
  wzFloat f_oo, f_tt;
public:
  wzIndex size() const {return wzPointDim*sizeof(wzFloat);}
  void refinementGlobal(wzFloat dx, wzFloat dy=wzInfty, wzFloat dz=wzInfty);
  void faceRefinementGlobal(wzFloat orthogonal, wzFloat tangential);
  virtual void getMetric(wzMetricData& data, const wzPoint& p) const;
  virtual void getMetric(wzMetricData& data, const cogFlag1& f) const;
  virtual wzFloat g_ii(const wzMetricData& data, 
		       const wzPoint& q, wzIndex i) const
  {return G_ii[i];}
  virtual wzFloat g_ii(const wzMetricData& data, 
		       const cogFlag1& f, wzIndex i) const;
  virtual wzFloat distance(const wzMetricData& data, 
			   const wzPoint& p,  const wzPoint& q) const;
  virtual wzFloat distance(const wzMetricData& data, 
			   const cogFlag1& f,  const wzPoint& q) const;
  wzDiagonalMetricSimple(wzFloat dx=wzInfty, 
			 wzFloat dy=wzInfty,
			 wzFloat dz=wzInfty);
};

class wzMetricByFunction
  : public wzDiagonalMetricSimple
{
  wzFloat (*Function)(const wzPoint& p);
public:
  wzMetricByFunction(wzFloat (*f)(const wzPoint& p)):Function(f){}
  virtual void getMetric(wzMetricData& data, const wzPoint& p) const;
  virtual void getMetric(wzMetricData& data, const cogFlag1& f) const;
};

typedef wzProxy<wzMetric> wzmetric;

// obsolete:

#define ibgcriteria wzmetric
#define ibgCriteriaSimpleFunction wzMetricByFunction

#endif

⌨️ 快捷键说明

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