Files
create/src/Mod/Assembly/App/opendcm/module3d/solver.hpp
2016-04-12 18:11:59 +02:00

120 lines
3.7 KiB
C++

/*
openDCM, dimensional constraint manager
Copyright (C) 2012 Stefan Troeger <stefantroeger@gmx.net>
This library is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with this library; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef GCM_SOLVER_3D_H
#define GCM_SOLVER_3D_H
#include "defines.hpp"
#include "opendcm/core/sheduler.hpp"
#include <boost/graph/depth_first_search.hpp>
namespace dcm {
namespace details {
template<typename Sys>
struct MES : public Sys::Kernel::MappedEquationSystem {
typedef typename Sys::Kernel Kernel;
typedef typename Sys::Cluster Cluster;
typedef typename system_traits<Sys>::template getModule<m3d>::type module3d;
typedef typename module3d::Geometry3D Geometry3D;
typedef boost::shared_ptr<Geometry3D> Geom;
typedef typename module3d::Constraint3D Constraint3D;
typedef boost::shared_ptr<Constraint3D> Cons;
typedef typename module3d::math_prop math_prop;
typedef typename module3d::fix_prop fix_prop;
typedef typename Kernel::number_type Scalar;
typedef typename Sys::Kernel::MappedEquationSystem Base;
boost::shared_ptr<Cluster> m_cluster;
#ifdef USE_LOGGING
src::logger log;
#endif
MES(boost::shared_ptr<Cluster> cl, int par, int eqn);
virtual void recalculate();
virtual void removeLocalGradientZeros();
};
template<typename Sys>
struct SystemSolver : public Job<Sys> {
typedef typename Sys::Cluster Cluster;
typedef typename Sys::Kernel Kernel;
typedef typename Kernel::number_type Scalar;
typedef typename system_traits<Sys>::template getModule<m3d>::type module3d;
typedef typename module3d::Geometry3D Geometry3D;
typedef boost::shared_ptr<Geometry3D> Geom;
typedef typename module3d::Constraint3D Constraint3D;
typedef boost::shared_ptr<Constraint3D> Cons;
typedef typename module3d::math_prop math_prop;
typedef typename module3d::fix_prop fix_prop;
typedef typename module3d::vertex_prop vertex_prop;
typedef MES<Sys> Mes;
#ifdef USE_LOGGING
src::logger log;
#endif
struct Rescaler {
boost::shared_ptr<Cluster> cluster;
Mes& mes;
int rescales;
Rescaler(boost::shared_ptr<Cluster> c, Mes& m);
void operator()();
Scalar scaleClusters();
void collectPseudoPoints(boost::shared_ptr<Cluster> parent,
LocalVertex cluster,
std::vector<typename Kernel::Vector3,
Eigen::aligned_allocator<typename Kernel::Vector3> >& vec);
};
struct DummyScaler {
void operator()() {};
};
struct cycle_dedector:public boost::default_dfs_visitor {
bool& m_dedected;
cycle_dedector(bool& ed) : m_dedected(ed) {
m_dedected = false;
};
template <class Edge, class Graph>
void back_edge(Edge u, const Graph& g) {
m_dedected = true;
}
};
SystemSolver();
virtual void execute(Sys& sys);
void solveCluster(boost::shared_ptr<Cluster> cluster, Sys& sys);
};
}//details
}//dcm
#endif //DCM_SOLVER_3D_HPP