void NodeRendererLink::render( const Eigen::Matrix4f& view, const Eigen::Matrix4f& model )
{
    Eigen::Vector3f srcpos( 0.0f, 0.0f, 0.0f );
    Eigen::Vector3f destpos( 0.0f, 0.0f, 0.0f );

    if ( _source.getRef() )
        srcpos = _source->getPosition();

    if ( _destination.getRef() )
        destpos = _destination->getPosition();

    glPushMatrix();

    if ( _isHighlighted )
        glColor3f( 1.0f, 0.5f, 0.4f );
    else
        glColor3f( 0.0f, 0.0f, 0.0f );

    float restorelw;
    glGetFloatv( GL_LINE_WIDTH, &restorelw );
    glLineWidth( 2.0f );

    // draw the connection line
    glBegin( GL_LINES );
        glVertex3f( srcpos.x(), srcpos.y(), -1.0f );
        glVertex3f( destpos.x(), destpos.y(), -1.0f );
    glEnd();

    // draw the direction triangle
    Eigen::Vector3f dist( ( destpos - srcpos ) * 0.5f );
    Eigen::Vector3f tripos = srcpos + dist;
    float angle = atan2( dist.y(), dist.x() );
    glTranslatef( tripos.x(), tripos.y(), tripos.z() );
    glRotatef( angle * 180.0f / M_PI + 90.0f, 0.0f, 0.0f, 1.0f );
    glBegin( GL_TRIANGLES );
        glVertex3f( -5.0f, 0.0f, -1.0 );
        glVertex3f( 5.0f, 0.0f, -1.0 );
        glVertex3f( 0.0f, - 10.0f, -1.0 );
    glEnd();

    glLineWidth( restorelw );
    glPopMatrix();
}
Beispiel #2
0
//---------------------------------------------------------------------
int Wave3d::check(ParVec<int, cpx, PtPrtn>& den, ParVec<int, cpx, PtPrtn>& val,
                  IntNumVec& chkkeys, double& relerr) {
#ifndef RELEASE
    CallStackEntry entry("Wave3d::check");
#endif
    SAFE_FUNC_EVAL( MPI_Barrier(MPI_COMM_WORLD) );
  
    _self = this;
    int mpirank = getMPIRank();
    ParVec<int, Point3, PtPrtn>& pos = (*_posptr);
  
    //1. get pos
    std::vector<int> all(1,1);
    std::vector<int> chkkeyvec;
    for (int i = 0; i < chkkeys.m(); ++i) {
        chkkeyvec.push_back( chkkeys(i) );
    }
    pos.getBegin(chkkeyvec, all);
    pos.getEnd(all);
    std::vector<Point3> tmpsrcpos;
    for (std::map<int,Point3>::iterator mi = pos.lclmap().begin();
        mi != pos.lclmap().end(); ++mi) {
        if(pos.prtn().owner(mi->first) == mpirank) {
            tmpsrcpos.push_back(mi->second);
        }
    }
    std::vector<cpx> tmpsrcden;
    for (std::map<int,cpx>::iterator mi = den.lclmap().begin();
        mi != den.lclmap().end(); ++mi) {
        if(den.prtn().owner(mi->first) == mpirank) {
            tmpsrcden.push_back(mi->second);
        }
    }
  
    std::vector<Point3> tmptrgpos;
    for (int i = 0; i < chkkeyvec.size(); ++i) {
        tmptrgpos.push_back( pos.access(chkkeyvec[i]) );
    }

    DblNumMat srcpos(3, tmpsrcpos.size(), false, (double*)&(tmpsrcpos[0]));
    CpxNumVec srcden(tmpsrcden.size(), false, (cpx*)&(tmpsrcden[0]));
    DblNumMat trgpos(3, tmptrgpos.size(), false, (double*)&(tmptrgpos[0]));
    CpxNumVec trgval(tmptrgpos.size());

    CpxNumMat inter;
    SAFE_FUNC_EVAL( _kernel.kernel(trgpos, srcpos, srcpos, inter) );
    // If no points were assigned to this processor, then the trgval
    // should be zero.
    if (inter.n() != 0) {
	SAFE_FUNC_EVAL( zgemv(1.0, inter, srcden, 0.0, trgval) );
    } else {
	for (int i = 0; i < trgval.m(); ++i) {
	    trgval(i) = 0;
	}
    }

    CpxNumVec allval(trgval.m());
    SAFE_FUNC_EVAL( MPI_Barrier(MPI_COMM_WORLD) );
    // Note: 2 doubles per complex number
    SAFE_FUNC_EVAL( MPI_Allreduce(trgval.data(), allval.data(), trgval.m() * 2, MPI_DOUBLE,
                                  MPI_SUM, MPI_COMM_WORLD) );
  
    //2. get val
    val.getBegin(chkkeyvec, all);  val.getEnd(all);
    CpxNumVec truval(chkkeyvec.size());
    for(int i = 0; i < chkkeyvec.size(); ++i)
        truval(i) = val.access(chkkeyvec[i]);
  
    CpxNumVec errval(chkkeyvec.size());
    for(int i = 0; i < chkkeyvec.size(); ++i)
        errval(i) = allval(i) - truval(i);
  
    double tn = sqrt( energy(truval) );
    double en = sqrt( energy(errval) );
    relerr = en / tn;
  
    SAFE_FUNC_EVAL( MPI_Barrier(MPI_COMM_WORLD) );
    return 0;
}