void Mesh::elementCentroid(int elemIndex, double& cx, double& cy) const
{
  const Element& e = mElems[elemIndex];

  if (e.eType() == Element::ENP)
  {
    const Node* nodes = projectedNodes();
    QPolygonF pX(e.nodeCount());
    for (int i=0; i<e.nodeCount(); i++) {
        pX[i] = nodes[e.p(i)].toPointF();
    }
    ENP_centroid(pX, cx, cy);
  }
  else if (e.eType() == Element::E4Q)
  {
    int e4qIndex = mE4QtmpIndex[elemIndex];
    E4Qtmp& e4q = mE4Qtmp[e4qIndex];
    E4Q_centroid(e4q, cx, cy, *mE4Qnorm);
  }
  else if (e.eType() == Element::E3T)
  {
    const Node* nodes = projectedNodes();
    E3T_centroid(nodes[e.p(0)].toPointF(), nodes[e.p(1)].toPointF(), nodes[e.p(2)].toPointF(), cx, cy);
  }
  else if (e.eType() == Element::E2L)
  {
    const Node* nodes = projectedNodes();
    E2L_centroid(nodes[e.p(0)].toPointF(), nodes[e.p(1)].toPointF(), cx, cy);
  }
  else
    Q_ASSERT(0 && "element not supported");
}
Beispiel #2
0
clsparseStatus
cldenseDaxpy(cldenseVector *r,
             const clsparseScalar *alpha, const cldenseVector *x,
             const cldenseVector *y,
             const clsparseControl control)
{
    if (!clsparseInitialized)
    {
        return clsparseNotInitialized;
    }

    //check opencl elements
    if (control == nullptr)
    {
        return clsparseInvalidControlObject;
    }

    clsparse::vector<cl_double> pR (control, r->values, r->num_values);
    clsparse::vector<cl_double> pAlpha(control, alpha->value, 1);
    clsparse::vector<cl_double> pX (control, x->values, x->num_values);
    clsparse::vector<cl_double> pY (control, y->values, y->num_values);

    assert(pR.size() == pY.size());
    assert(pR.size() == pX.size());

    cl_ulong size = pR.size();

    if(size == 0) return clsparseSuccess;

    //nothing to do
    if (pAlpha[0] == 0.0)
    {
        auto pRBuff = pR.data()();
        auto pYBuff = pY.data()();

        //if R is different pointer than Y than copy Y to R
        if (pRBuff != pYBuff)
        {
            // deep copy;
            pR = pY;
        }
        return clsparseSuccess;
    }

    return axpy(pR, pAlpha, pX, pY, control);
}
bool Mesh::interpolateElementCentered(uint elementIndex, double x, double y, double* value, const ElementOutput* output, const ValueAccessor* accessor) const
{
  const Mesh* mesh = output->dataSet->mesh();
  const Element& elem = mesh->elements()[elementIndex];

  if (elem.eType() == Element::ENP)
    {
      const Node* nodes = projectedNodes();
      QPolygonF pX(elem.nodeCount());
      QVector<double> lam(elem.nodeCount());

      for (int i=0; i<elem.nodeCount(); i++) {
          pX[i] = nodes[elem.p(i)].toPointF();
      }

      if (!ENP_physicalToLogical(pX, QPointF(x, y), lam))
        return false;

      *value = accessor->value(elementIndex);
      return true;
    }
  else if (elem.eType() == Element::E4Q)
  {
    int e4qIndex = mE4QtmpIndex[elementIndex];
    E4Qtmp& e4q = mE4Qtmp[e4qIndex];

    double Lx, Ly;
    if (!E4Q_mapPhysicalToLogical(e4q, x, y, Lx, Ly, *mE4Qnorm))
      return false;

    if (Lx < 0 || Ly < 0 || Lx > 1 || Ly > 1)
      return false;

    *value = accessor->value(elementIndex);
    return true;
  }
  else if (elem.eType() == Element::E3T)
  {
    const Node* nodes = projectedNodes();

    double lam1, lam2, lam3;
    if (!E3T_physicalToBarycentric(nodes[elem.p(0)].toPointF(),
                                   nodes[elem.p(1)].toPointF(),
                                   nodes[elem.p(2)].toPointF(),
                                   QPointF(x, y),
                                   lam1, lam2, lam3))
      return false;

    // Now interpolate

    *value = accessor->value(elementIndex);
    return true;

  }
  else if (elem.eType() == Element::E2L)
  {
    const Node* nodes = projectedNodes();

    double lam;
    if (!E2L_physicalToLogical(nodes[elem.p(0)].toPointF(),
                               nodes[elem.p(1)].toPointF(),
                               QPointF(x, y),
                               lam))
      return false;


    // Now interpolate
    *value = accessor->value(elementIndex);
    return true;

  }
  else
  {
    Q_ASSERT(0 && "unknown element type");
    return false;
  }

}
bool Mesh::interpolate(uint elementIndex, double x, double y, double* value, const NodeOutput* output, const ValueAccessor* accessor) const
{
  const Mesh* mesh = output->dataSet->mesh();
  const Element& elem = mesh->elements()[elementIndex];

  if (elem.eType() == Element::ENP)
  {
    const Node* nodes = projectedNodes();
    QPolygonF pX(elem.nodeCount());
    QVector<double> lam(elem.nodeCount());

    for (int i=0; i<elem.nodeCount(); i++) {
        pX[i] = nodes[elem.p(i)].toPointF();
    }

    if (!ENP_physicalToLogical(pX, QPointF(x, y), lam))
      return false;

    *value = 0;
    for (int i=0; i<elem.nodeCount(); i++) {
        *value += lam[i] * accessor->value( elem.p(i) );
    }

    return true;
  }
  else if (elem.eType() == Element::E4Q)
  {
    int e4qIndex = mE4QtmpIndex[elementIndex];
    E4Qtmp& e4q = mE4Qtmp[e4qIndex];

    double Lx, Ly;
    if (!E4Q_mapPhysicalToLogical(e4q, x, y, Lx, Ly, *mE4Qnorm))
      return false;

    if (Lx < 0 || Ly < 0 || Lx > 1 || Ly > 1)
      return false;

    double q11 = accessor->value( elem.p(2) );
    double q12 = accessor->value( elem.p(1) );
    double q21 = accessor->value( elem.p(3) );
    double q22 = accessor->value( elem.p(0) );

    *value = q11*Lx*Ly + q21*(1-Lx)*Ly + q12*Lx*(1-Ly) + q22*(1-Lx)*(1-Ly);

    return true;

  }
  else if (elem.eType() == Element::E3T)
  {

    /*
        So - we're interpoalting a 3-noded triangle
        The query point must be within the bounding box of this triangl but not nessisarily
        within the triangle itself.
      */

    /*
      First determine if the point of interest lies within the triangle using Barycentric techniques
      described here:  http://www.blackpawn.com/texts/pointinpoly/
      */

    const Node* nodes = projectedNodes();

    double lam1, lam2, lam3;
    if (!E3T_physicalToBarycentric(nodes[elem.p(0)].toPointF(),
                                   nodes[elem.p(1)].toPointF(),
                                   nodes[elem.p(2)].toPointF(),
                                   QPointF(x, y),
                                   lam1, lam2, lam3))
      return false;

    // Now interpolate

    double z1 = accessor->value( elem.p(0));
    double z2 = accessor->value( elem.p(1));
    double z3 = accessor->value( elem.p(2));
    *value = lam1 * z3 + lam2 * z2 + lam3 * z1;
    return true;

  }
  else if (elem.eType() == Element::E2L)
  {

    /*
        So - we're interpoalting a 2-noded line
    */
    const Node* nodes = projectedNodes();
    double lam;

    if (!E2L_physicalToLogical(nodes[elem.p(0)].toPointF(),
                               nodes[elem.p(1)].toPointF(),
                               QPointF(x, y),
                               lam))
      return false;

    // Now interpolate

    double z1 = accessor->value( elem.p(0) );
    double z2 = accessor->value( elem.p(1) );

    *value = z1 + lam * (z2 - z1);
    return true;

  }
  else
  {
    Q_ASSERT(0 && "unknown element type");
    return false;
  }
}
/* Verify that offsetof warns if given a non-standard-layout class */
/* Copyright (C) 2003 Free Software Foundation, Inc. */
/* Contributed by Matt Austern <*****@*****.**> 15 May 2003 */
/* { dg-do compile } */

struct X
{
  int x, y;
protected:
  int z;
};

typedef X* pX;
typedef __SIZE_TYPE__ size_t;

size_t yoff = size_t(&(pX(0)->y)); /* { dg-warning "invalid access" "" } */
/* { dg-warning "macro was used incorrectly" "macro" { target *-*-* } 16 } */
Beispiel #6
0
// 曲线绘制.
void DataGrids::DrawCurve(void)
{

#define SHOW_LOWLEVEL 0

#define X(_x) UserX((_x)+xMarginLeft)
#define Y(_y) UserY((_y)+yMarginDown)

	WideString strList[] =
	{
		L"Vl(低电平电压)",
		L"Vh(高电平电压)",
		L"Tr(上升沿)",
		L"Th(高电平)",
		L"Tf(下降沿)",
		L"Tl(低电平)",
	};

	Gdiplus::SolidBrush solidBrush(Gdiplus::Color(255, 0, 0, 255));
	Gdiplus::Pen pX(Gdiplus::Color(255, 0, 0, 0),1);
	Gdiplus::AdjustableArrowCap cap(8,6,true);
	Gdiplus::Font font(L"Times New Roman",8);
	Gdiplus::SolidBrush s( Gdiplus::Color(255, 0, 0, 0));
	Gdiplus::PointF *pComm = new Gdiplus::PointF[4];

	// 有上升.下降沿的斜坡.
	Gdiplus::Pen p(Gdiplus::Color(255, 0, 0, 255),2);
	//先将点计算好.
	Gdiplus::PointF *points = new Gdiplus::PointF[10];

	// 低电平位置为可用高度的 %20.
	// 高电平位置位可用高度的 %80.
	// 占空比位%50.
	// 上升沿/下降沿使用的%5的位置.
	// 低电平先开始.
	// 开始区域.(xMarkHeight + 20 , yMarksHeigh + 20).
	// 结束区域.(width - 20, heigh - 20).

	double fLvPos = 0.1 + 0.1 * m_fLRatio / 100, fHvPos = 0.4 + 0.4 * m_fHRatio/100, fHvLen = (m_fDuty*0.8/100.0), fLvLen = ((100-m_fDuty)*0.8/100), fRiseLen = 0.05,fFallLen= 0.05;
	double xMarginLeft = xMarkHeight + 30;
	double yMarginDown = yMarkHeight + 20;
	double xMarginRight  = 20;
	double yMarginTop  = 20;
	double RealWidth = m_iWidth - xMarginLeft - xMarginRight;
	double RealHeight = m_iHeight - yMarginDown - yMarginTop;
	int idx = 0;
	points[idx++] = Gdiplus::PointF((int)X(0),(int)Y(fLvPos * RealHeight));
	points[idx++] = Gdiplus::PointF((int)X(fHvLen * RealWidth),(int)Y(fLvPos * RealHeight));
	points[idx++] = Gdiplus::PointF((int)X((fHvLen + fRiseLen)* RealWidth),(int)Y(fHvPos * RealHeight));
	points[idx++] = Gdiplus::PointF((int)X((fHvLen + fRiseLen + fLvLen)* RealWidth),(int)Y(fHvPos * RealHeight));
	points[idx++] = Gdiplus::PointF((int)X((fHvLen + fRiseLen + fLvLen + fFallLen)* RealWidth),(int)Y(fLvPos * RealHeight));
	points[idx++] = Gdiplus::PointF((int)X(RealWidth),(int)Y(fLvPos * RealHeight));

	m_stGrp->DrawLines(&p,points,idx);

	//设置位虚线.
	pX.SetDashStyle(Gdiplus::DashStyleDash);
	pX.SetAlignment(Gdiplus::PenAlignmentCenter);
	pX.SetDashOffset(20.0);

	// P0 起点. P1 上升沿的起点. P2上升沿结束点. P3 下降沿起点. P4 下降沿的结束点. P5 结束点.
#if SHOW_LOWLEVEL
	pComm[0].X = (int)points[0].X;
	pComm[0].Y = (int)points[0].Y;
	pComm[1].X = pComm[0].X;
	pComm[1].Y = UserY(m_iHeight - yMarginTop);
	m_stGrp->DrawLines(&pX,pComm,2);
#endif

	pComm[0].X = (int)points[1].X;
	pComm[0].Y = (int)points[1].Y;
	pComm[1].X = pComm[0].X;
	pComm[1].Y = UserY(m_iHeight - yMarginTop);
	m_stGrp->DrawLines(&pX,pComm,2);

	pComm[0].X = (int)points[2].X;
	pComm[0].Y = (int)points[2].Y;
	pComm[1].X = pComm[0].X;
	pComm[1].Y = UserY(m_iHeight - yMarginTop - 35);
	m_stGrp->DrawLines(&pX,pComm,2);

	pComm[0].X = (int)points[3].X;
	pComm[0].Y = (int)points[3].Y;
	pComm[1].X = pComm[0].X;
	pComm[1].Y = UserY(m_iHeight - yMarginTop - 35);
	m_stGrp->DrawLines(&pX,pComm,2);

	pComm[0].X = (int)points[4].X;
	pComm[0].Y = (int)points[4].Y;
	pComm[1].X = pComm[0].X;
	pComm[1].Y = UserY(m_iHeight - yMarginTop);
	m_stGrp->DrawLines(&pX,pComm,2);

	// 准备画笔的箭头.
	cap.SetFillState(false);
	pX.SetCustomEndCap(&cap);
	pX.SetCustomStartCap(&cap);


	// Vl -- .P0~P1中点位置开始.到轴线上--双箭头.
	pComm[0].X = (int)(points[0].X + points[1].X) / 2;
	pComm[0].Y = (int)points[0].Y;
	pComm[1].X = pComm[0].X;
	pComm[1].Y = UserY(xAxisOffset);

	m_stGrp->DrawLines(&pX,pComm,2);
	m_stGrp->DrawString(strList[0].c_bstr(),strList[0].Length(),&font,Gdiplus::PointF(pComm[0].X + 10 ,(pComm[0].Y + pComm[1].Y)/2),&s);

	// Vh -- .P2~P3中点位置开始.到轴线上--双箭头.
	// 高电平线.
	pComm[0].X = (int)(points[2].X + points[3].X) / 2;
	pComm[0].Y = (int)points[2].Y;
	pComm[1].X = pComm[0].X;
	pComm[1].Y = UserY(xAxisOffset);
	m_stGrp->DrawLines(&pX,pComm,2);
	m_stGrp->DrawString(strList[1].c_bstr(),strList[1].Length(),&font,Gdiplus::PointF(pComm[0].X + 10 ,(pComm[0].Y + pComm[1].Y)/2),&s);

	//
#if SHOW_LOWLEVEL
	pComm[0].X =  points[0].X;
	pComm[0].Y =  UserY(m_iHeight - yMarginTop - 30);
	pComm[1].X =  points[1].X;
	pComm[1].Y =  UserY(m_iHeight - yMarginTop - 30);
	m_stGrp->DrawLines(&pX,pComm,2);
	m_stGrp->DrawString(strList[5].c_bstr(),strList[5].Length(),&font,Gdiplus::PointF((pComm[0].X + pComm[1].X)/2 -30 , pComm[0].Y + 10 ),&s);
#endif

	pComm[0].X =  points[1].X;
	pComm[0].Y =  UserY(m_iHeight - yMarginTop - 40);
	pComm[1].X =  points[2].X;
	pComm[1].Y =  UserY(m_iHeight - yMarginTop - 40);
	m_stGrp->DrawLines(&pX,pComm,2);
	m_stGrp->DrawString(strList[2].c_bstr(),strList[2].Length(),&font,Gdiplus::PointF(pComm[0].X + 5 , pComm[0].Y - 30 ),&s);

	pComm[2].X =  points[3].X;
	pComm[2].Y =  UserY(m_iHeight - yMarginTop - 40);
	pComm[3].X =  points[4].X;
	pComm[3].Y =  UserY(m_iHeight - yMarginTop - 40);
	m_stGrp->DrawLines(&pX,pComm+2,2);
	m_stGrp->DrawString(strList[4].c_bstr(),strList[4].Length(),&font,Gdiplus::PointF(pComm[2].X - 30 , pComm[2].Y - 20 ),&s);

	pComm[1].Y =  pComm[1].Y + 10;
	pComm[2].Y =  pComm[1].Y;
	m_stGrp->DrawLines(&pX,pComm+1,2);
	m_stGrp->DrawString(strList[3].c_bstr(),strList[3].Length(),&font,Gdiplus::PointF((pComm[1].X + pComm[2].X)/2 - 30, pComm[2].Y + 15 ),&s);

	delete points;
	delete pComm;
#undef X(_x)
#undef Y(_y)
}
Beispiel #7
0
/* Verify that -Wno-invalid-offsetof disables warning */
/* Copyright (C) 2003 Free Software Foundation, Inc. */
/* Contributed by Matt Austern <*****@*****.**> 15 May 2003 */
/* { dg-do compile } */
/* { dg-options "-Wno-invalid-offsetof" } */

struct X
{
  X() : x(3), y(4) { }
  int x, y;
};

typedef X* pX;
typedef __SIZE_TYPE__ size_t;

size_t yoff = size_t(&(pX(0)->y));
void TILE :: display()
{
  draw_at(pX(),pY());
}