File: DeformableElement.cpp

package info (click to toggle)
yade 2026.1.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 34,448 kB
  • sloc: cpp: 97,645; python: 52,173; sh: 677; makefile: 162
file content (104 lines) | stat: -rw-r--r-- 3,844 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*************************************************************************
*  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. *
*************************************************************************/
#ifdef YADE_FEM
#include <core/BodyContainer.hpp>
#include <core/Scene.hpp>
#include <core/State.hpp>
#include <pkg/common/Sphere.hpp>
#include <pkg/fem/DeformableElement.hpp>
#include <pkg/fem/Node.hpp>
#include <algorithm>
#include <boost/lexical_cast.hpp>
#include <string>

namespace yade { // Cannot have #include directive inside.

DeformableElement::~DeformableElement() { }
YADE_PLUGIN((DeformableElement));
CREATE_LOGGER(DeformableElement);

boost::python::dict DeformableElement::localmap_get()
{
	boost::python::dict ret;
	FOREACH(NodeMap::value_type & b, localmap) { ret[b.first] = boost::python::make_tuple(b.second.position, b.second.orientation); }
	return ret;
}
void DeformableElement::addFace(Vector3r& indexes) { faces.push_back(indexes); }
//std::vector<Vector3r> DeformableElement::getDisplacements(void)
//{
//
//}
shared_ptr<Body> DeformableElement::getNode(int id) const
{
	NodeMap::const_iterator i1(this->localmap.cbegin());
	std::advance(i1, id);
	return i1->first;
}

void DeformableElement::removeLastFace(void) { faces.pop_back(); }

void DeformableElement::addNode(const shared_ptr<Body>& nodeBody)
{
	if (this->localmap.size() == maxNodeCount) {
		std::string errormessage = "This element cannot hold more than" + boost::lexical_cast<std::string>(maxNodeCount);
		throw std::out_of_range(errormessage);
		return;
	}
	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 #" + boost::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(nodeBody) != 0)
		throw std::invalid_argument(("Node that has Body id #" + boost::lexical_cast<string>(subId) + " is already part of this deformable element"));

	// Add body to localmap
	this->localmap[nodeBody] = 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=localmap.begin()->first;

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


	//cout<<"Local map of "<<subId<<" is ="<<localmap[subId].position;
	//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) != 1)
		throw std::invalid_argument(
		        ("Node #" + boost::lexical_cast<string>(subBody->id) + " not a part of the deformable element, not removing...").c_str());
	LOG_DEBUG("Removed node #" << subBody->id);
}

} // namespace yade

#endif //YADE_FEM