File: UnbalancedForceCallbacks.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 (61 lines) | stat: -rw-r--r-- 1,851 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
#include <core/Body.hpp>
#include <core/Interaction.hpp>
#include <core/Scene.hpp>
#include <pkg/common/NormShearPhys.hpp>
#include <pkg/dem/UnbalancedForceCallbacks.hpp>

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

YADE_PLUGIN((SumIntrForcesCb)
#ifdef YADE_BODY_CALLBACK
                    (SumBodyForcesCb)
#endif
);

IntrCallback::FuncPtr SumIntrForcesCb::stepInit()
{
	// if(scene->iter%100 != 0) return NULL;

	cerr << "(" << (Real)force << "," << (int)numIntr << ")";
	// reset accumulators
	force.reset();
	numIntr.reset();
	// return function pointer
	return &SumIntrForcesCb::go;
}

void SumIntrForcesCb::go(IntrCallback* _self, Interaction* i)
{
	SumIntrForcesCb* self = static_cast<SumIntrForcesCb*>(_self);
	NormShearPhys*   nsp  = YADE_CAST<NormShearPhys*>(i->phys.get());
	assert(nsp != NULL); // only effective in debug mode
	Vector3r f = nsp->normalForce + nsp->shearForce;
	if (f == Vector3r::Zero()) return;
	self->numIntr += 1;
	self->force += f.norm();
	//cerr<<"[cb#"<<i->getId1()<<"+"<<i->getId2()<<"]";
}

#ifdef YADE_BODY_CALLBACK
BodyCallback::FuncPtr SumBodyForcesCb::stepInit()
{
	cerr << "{" << (Real)force << "," << (int)numBodies << ",this=" << this << ",scene=" << scene << ",forces=" << &(scene->forces) << "}";
	force.reset();
	numBodies.reset(); // reset accumulators
	return &SumBodyForcesCb::go;
}
void SumBodyForcesCb::go(BodyCallback* _self, Body* b)
{
	if (b->state->blockedDOFs == State::DOF_ALL) return;
	SumBodyForcesCb* self = static_cast<SumBodyForcesCb*>(_self);
#ifdef YADE_OPENMP
	cerr << "[" << omp_get_thread_num() << ",#" << b->id << ",scene=" << self->scene << "]";
#endif
	cerr << "[force=" << self->scene->forces.getForce(b->id) << "]";
	self->numBodies += 1;
	//self->scene->forces.sync();
	self->force += self->scene->forces.getForce(b->id).norm();
}
#endif

} // namespace yade