← Back to team overview

yade-dev team mailing list archive

"Yade does not render custom shape after integration step"

 

Dear Yade Developers, 

I am trying to create an element interface for yade(finite element). In this interface, 
The nodes and the triangles are held within the structure. The structures that I created as follows, 

DeformableElement-> derived from Shape 
Gl1_DeformableElement->derived from GlShapeFunctor 

Every time in a step drawing of the element is not realized after NewtonIntegrator step. 
Initially all faces of the element is drawn in ::go function of the Gl1_DeformableElement 
but after one step it is not drawn. What is the reason for this behaviour? Here is the screenshots, 

before integration 
<a href="http://tinypic.com?ref=2eauds1"; target="_blank"><img src="http://i42.tinypic.com/2eauds1.png"; border="0" alt="Image and video hosting by TinyPic"></a> 

after integration 
<a href="http://tinypic.com?ref=280qckp"; target="_blank"><img src="http://i44.tinypic.com/280qckp.png"; border="0" alt="Image and video hosting by TinyPic"></a> 

The classes are as follows 

******************************Gl1_DeformableElement.hpp**************************************** 
#pragma once 

#include<yade/pkg/common/GLDrawFunctors.hpp> 
#include<yade/pkg/dem/deformablecohesive/DeformableElement.hpp> 

class Gl1_DeformableElement : public GlShapeFunctor 
{ 
public: 
virtual void go(const shared_ptr<Shape>&, const shared_ptr<State>&,bool,const GLViewInfo&); 
YADE_CLASS_BASE_DOC(Gl1_DeformableElement,GlShapeFunctor,"Renders :yref:`Node` object" 
); 
RENDERS(DeformableElement); 
}; 

REGISTER_SERIALIZABLE(Gl1_DeformableElement); 

***********************************************Gl1_DeformableElement.cpp**************************************** 

/************************************************************************* 
* Copyright (C) 2008 by Sergei Dorofeenko * 
* sega@xxxxxxxxxxxxxxxx * 
* * 
* This program is free software; it is licensed under the terms of the * 
* GNU General Public License v2 or later. See file LICENSE for details. * 
*************************************************************************/ 

#ifdef YADE_OPENGL 

#include<yade/pkg/dem/deformablecohesive/Gl1_DeformableElement.hpp> 
#include<yade/pkg/dem/deformablecohesive/DeformableElement.hpp> 
#include<yade/lib/opengl/OpenGLWrapper.hpp> 

typedef DeformableElement::NodeMap NodeMap; 
void Gl1_DeformableElement::go(const shared_ptr<Shape>& cm, const shared_ptr<State>& ,bool wire,const GLViewInfo&) 
{ 


DeformableElement* element = static_cast<DeformableElement*>(cm.get()); 
std::vector<Vector3r> triangles = element->faces; 
Vector3r elempos=element->frame_get().position; 

Scene* scene(Omega::instance().getScene().get()); // get scene 


// if(!normals) return; 
// // DeformableElement's normal 
// glBegin(GL_LINES); 
// glColor3(0.0,0.0,1.0); 
// glVertex3(0.0,0.0,0.0); 
// glVertex3v(DeformableElement->normal); 
// glEnd(); 
// // normal of edges 
// glColor3(0.0,0.0,1.0); 
// glBegin(GL_LINES); 
// glVertex3(0.0,0.0,0.0); glVertex3v(Vector3r(icr*ne[0])); 
// glVertex3(0.0,0.0,0.0); glVertex3v(Vector3r(icr*ne[1])); 
// glVertex3(0.0,0.0,0.0); glVertex3v(Vector3r(icr*ne[2])); 
// glEnd(); 

if(!(cm->wire || wire)){ 
glDisable(GL_CULL_FACE); 
//Vector3r normal=(facet->vertices[1]-facet->vertices[0]).cross(facet->vertices[2]-facet->vertices[1]); normal.normalize(); 
glColor3v(cm->color); 
glBegin(GL_TRIANGLES); 

FOREACH(Vector3r vertices,triangles){ 
NodeMap::iterator i1(element->localmap.begin()); 
NodeMap::iterator i2(i1); 
NodeMap::iterator i3(i1); 

std::advance(i1,vertices[0]); 
std::advance(i2,vertices[1]); 
std::advance(i3,vertices[2]); 

const shared_ptr<Body>& member1=Body::byId(i1->first,scene); 
const shared_ptr<Body>& member2=Body::byId(i2->first,scene); 
const shared_ptr<Body>& member3=Body::byId(i3->first,scene); 

Vector3r pos1=member1->state->pos; 
Vector3r pos2=member2->state->pos; 
Vector3r pos3=member3->state->pos; 

cout<<"Pos1"<<pos1<<"\n"; 
cout<<"Pos2"<<pos2<<"\n"; 
cout<<"Pos3"<<pos3<<"\n"; 


glVertex3v(pos1); 
glVertex3v(pos2); 
glVertex3v(pos3); 

} 
} 
glEnd(); 

glBegin(GL_LINE_LOOP); 
glColor3v(Vector3r(0,0,0)); 
FOREACH(Vector3r vertices,triangles){ 
NodeMap::iterator i1(element->localmap.begin()); 
NodeMap::iterator i2(i1); 
NodeMap::iterator i3(i1); 

std::advance(i1,vertices[0]); 
std::advance(i2,vertices[1]); 
std::advance(i3,vertices[2]); 

const shared_ptr<Body>& member1=Body::byId(i1->first,scene); 
const shared_ptr<Body>& member2=Body::byId(i2->first,scene); 
const shared_ptr<Body>& member3=Body::byId(i3->first,scene); 

Vector3r pos1=member1->state->pos; 
Vector3r pos2=member2->state->pos; 
Vector3r pos3=member3->state->pos; 

glVertex3v(pos1); 
glVertex3v(pos2); 
glVertex3v(pos3); 
} 

glEnd(); 

} 

YADE_PLUGIN((Gl1_DeformableElement)); 

#endif /* YADE_OPENGL */ 

AND 


*****************************************************DeformableElement.hpp*************************************** 
/************************************************************************* 
* Copyright (C) 2013 by Burak ER * 
* * 
* * 
* This program is free software; it is licensed under the terms of the * 
* GNU General Public License v2 or later. See file LICENSE for details. * 
*************************************************************************/ 

#pragma once 

#include<vector> 
#include<map> 
#include<stdexcept> 
#include<yade/core/Body.hpp> 
#include<yade/lib/base/Logging.hpp> 
#include<yade/lib/base/Math.hpp> 
#include<yade/core/PartialEngine.hpp> 

//#include<yade/trunk/pkg/dem/deformablecohesive/Node.hpp> //Node shape 

/* Before starting the implementation of the deformable element, I am really dissappointed that deformableelement's algorithm relies on its shape. 
Shape means "shape" and I think it should not contain any other physical meaning or anything else. Therefore, DeformableElement like 
deformable element structure is not used. 

With respect to this view; The deformable element class is derived from the body and knows the information of 
its members that are node shaped bodies. 

*/ 

class NewtonIntegrator; 

namespace yade{ 

class DeformableElement: public Shape { 
public: 

typedef std::map<Body::id_t,Se3r> NodeMap; 
typedef std::vector<Vector3r> Triangles; // Used for drawing the element 

virtual ~DeformableElement (); 
void addNode(const shared_ptr<Body>& subBody); 
void delNode(const shared_ptr<Body>& subBody); 

void addFace(Vector3r&); 
void removeLastFace(void); 
//! Recalculate physical properties of DeformableElement. 

Se3r frame_get(); 
void frame_set(Se3r); 

//! update member positions after deformableelement being moved by mouse (in case simulation is paused and engines will not do that). 
//void userForcedDisplacementRedrawHook(){ throw runtime_error("DeformableElement::userForcedDisplacementRedrawHook not yet implemented (with DeformableElement as subclass of Shape).");} 

python::dict localmap_get(); 

YADE_CLASS_BASE_DOC_ATTRS_INIT_CTOR_PY(DeformableElement,Shape,"Deformable aggregate of nodes", 
((NodeMap,localmap,,,"Ids and relative positions+orientations of members of the deformable element (should not be accessed directly)")) 
((Se3r,elementframe,,,"Position and orientation of the element frame")) 
((Triangles,faces,,,"Faces of the element for drawing")), 
, 
createIndex(); /*ctor*/ 
, 
/*py*/ 
YADE_PY_TOPINDEXABLE(DeformableElement) 
.add_property("elementframe",&DeformableElement::frame_get) 
.def("addNode",&DeformableElement::addNode,"Add a node shared_pt<:yref:'Body'>& as into the element") 
.def("delNode",&DeformableElement::delNode,"Remove a node shared_pt<:yref:'Body'>& from the element") 
.def("addFace",&DeformableElement::addFace,"Add a face into the element") 
.def("removeLastFace",&DeformableElement::removeLastFace,"Remove a face from the element") 

); 
DECLARE_LOGGER; 

REGISTER_CLASS_INDEX(DeformableElement,Shape); 

}; 
} 
// necessary 
using namespace yade; 
REGISTER_SERIALIZABLE(DeformableElement); 




*****************************************************DeformableElement.cpp*************************************** 


// (c) 2007-2010 Vaclav Smilauer <eudoxos@xxxxxxxx> 

#include<yade/pkg/dem/deformablecohesive/DeformableElement.hpp> 
#include<algorithm> 
#include<yade/core/Scene.hpp> 
#include<yade/core/BodyContainer.hpp> 
#include<yade/core/State.hpp> 
#include<yade/pkg/common/Sphere.hpp> 
#include<yade/pkg/dem/deformablecohesive/Node.hpp> 


YADE_PLUGIN((DeformableElement)); 
CREATE_LOGGER(DeformableElement); 

python::dict DeformableElement::localmap_get(){ 
python::dict ret; 
FOREACH(NodeMap::value_type& b, localmap){ 
ret[b.first]=python::make_tuple(b.second.position,b.second.orientation); 
} 
return ret; 
} 
void DeformableElement::addFace(Vector3r& indexes){ 

faces.push_back(indexes); 

} 

DeformableElement::~DeformableElement(){ 

} 

void DeformableElement::removeLastFace(void){ 

faces.pop_back(); 

} 

void DeformableElement::addNode(const shared_ptr<Body>& nodeBody){ 

const shared_ptr<Node> node=YADE_PTR_CAST<Node>(nodeBody->shape);//Should be checked dynamically otherwise it will always cast: every shape is castable to Node shape 

Body::id_t subId=nodeBody->getId(); 

if(node){} else{ throw std::invalid_argument(("The body that is given #"+lexical_cast<string>(subId)+" is not a Node therefore cannot be added to the deformable element "));} 

if(subId<0){throw std::invalid_argument(("The Node that is given is not a member of the scene therefore it has no state, not adding exiting"));} 

if(this->localmap.count(subId)!=0) throw std::invalid_argument(("Node that has Body id #"+lexical_cast<string>(subId)+" is already part of this deformable element")); 

// Add body to localmap 
this->localmap[subId]=Se3r();// meaningful values will be put in by DeformableElement::updateProperties 

// Get first node 
Scene* scene(Omega::instance().getScene().get()); // get scene 
const shared_ptr<Body>& member=Body::byId(localmap.begin()->first,scene); 

//Substract from the current node, therefore find the local value, 
localmap[subId].position=nodeBody->state->pos-member->state->pos; 
//localmap[subId].orientation=nodeBody->state->ori; 

//this->setBounded(false); // disallow collisions with the element itself 

//If we have more than three nodes define a local triad that is clumped on the first node and initially parallel to the global frame 
if(this->localmap.size()>=3) 
{ 
//define a local triad if needed 
} 

return; 
} 

void DeformableElement::delNode(const shared_ptr<Body>& subBody){ 
// erase the subBody; removing body that is not part of the element throws 
if(this->localmap.erase(subBody->id)!=1) throw std::invalid_argument(("Node #"+lexical_cast<string>(subBody->id)+" not a part of the deformable element, not removing...").c_str()); 
LOG_DEBUG("Removed node #"<<subBody->id); 
} 

Se3r DeformableElement::frame_get() const 
{ 
Scene* scene(Omega::instance().getScene().get()); // get scene 
const shared_ptr<Body>& member=Body::byId(localmap.begin()->first,scene); 
return member->state->se3; 
} 

void DeformableElement::frame_set(Se3r) const 
{ 
// Scene* scene(Omega::instance().getScene().get()); // get scene 
// NodeMap::iterator i=localmap.begin(); 
// const shared_ptr<Body>& member=Body::byId(i->first,scene); 
return; 
} 




Follow ups