SPHinXsys  alpha version
state_engine.h
Go to the documentation of this file.
1 /* -------------------------------------------------------------------------*
2 * SPHinXsys *
3 * --------------------------------------------------------------------------*
4 * SPHinXsys (pronunciation: s'finksis) is an acronym from Smoothed Particle *
5 * Hydrodynamics for industrial compleX systems. It provides C++ APIs for *
6 * physical accurate simulation and aims to model coupled industrial dynamic *
7 * systems including fluid, solid, multi-body dynamics and beyond with SPH *
8 * (smoothed particle hydrodynamics), a meshless computational method using *
9 * particle discretization. *
10 * *
11 * SPHinXsys is partially funded by German Research Foundation *
12 * (Deutsche Forschungsgemeinschaft) DFG HU1527/6-1, HU1527/10-1 *
13 * and HU1527/12-1. *
14 * *
15 * Portions copyright (c) 2017-2020 Technical University of Munich and *
16 * the authors' affiliations. *
17 * *
18 * Licensed under the Apache License, Version 2.0 (the "License"); you may *
19 * not use this file except in compliance with the License. You may obtain a *
20 * copy of the License at http://www.apache.org/licenses/LICENSE-2.0. *
21 * *
22 * --------------------------------------------------------------------------*/
35 #ifndef STATE_ENGINE_SIMBODY_H
36 #define STATE_ENGINE_SIMBODY_H
37 
38 
39 #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING
40 
41 #include "base_data_package.h"
42 #include "array.h"
43 #include "exception.h"
44 #include "all_simbody.h"
45 
46 #include <iostream>
47 #include <string>
48 #include <cstdio>
49 #include <stdexcept>
50 
51 #include "Simbody.h"
52 #include "SimTKmath.h"
53 #include "SimTKcommon.h"
54 #include "simbody/internal/MultibodySystem.h"
55 
56 namespace SPH {
60  class StateEngine {
61  //===============================================================//
62  // PROTECTED
63  //===============================================================//
64  protected:
65 
66  XmlEngine simbody_xml_engine_;
67 
68  void resizeXmlDocForSimbody(size_t input_size);
69 
77  class StateVariable {
78  //friend void StateEngine::addStateVariable(StateVariable* sv);
79  public:
81  StateVariable() :name_(""), owner_(nullptr),
82  subsysindex_(SimTK::InvalidIndex),
83  varindex_(SimTK::InvalidIndex),
84  sysyindex_(SimTK::InvalidIndex) {}
85  explicit StateVariable(std::string& name,
86  StateEngine& owner,
87  SimTK::SubsystemIndex subsys,
88  int varindex)
89  : name_(name), owner_(&owner), subsysindex_(subsys),
90  varindex_(varindex), sysyindex_(SimTK::InvalidIndex) {}
91  virtual ~StateVariable() {}
92 
93  std::string& getName() { return name_; }
94  StateEngine& getOwner() { return *owner_; }
96  int& getVarIndex() { return varindex_; }
98  SimTK::SubsystemIndex& getSubsysIndex() { return subsysindex_; }
100  SimTK::SystemYIndex& getSystemYIndex() { return sysyindex_; }
102  void setVarIndex(int index) { varindex_ = index; }
104  void setSubsystemIndex(SimTK::SubsystemIndex& subsysindx)
105  {
106  subsysindex_ = subsysindx;
107  }
109  virtual Real getValue() = 0;
110  virtual void setValue(Real value) = 0;
111  virtual Real getDerivative() = 0;
113  virtual void setDerivative(Real deriv) = 0;
114  private:
115  std::string name_;
116  SimTK::ReferencePtr<StateEngine> owner_;
121  SimTK::SubsystemIndex subsysindex_;
126  int varindex_;
131  SimTK::SystemYIndex sysyindex_;
132  };
133  //===============================================================//
134  // PRIVATE
135  //===============================================================//
141  public:
143  AddedStateVariable() : StateVariable(), invalidatestage_(SimTK::Stage::Empty) {}
144 
146  explicit AddedStateVariable(std::string& name,
147  StateEngine& owner,
148  SimTK::Stage invalidatestage) :
149  StateVariable(name, owner,
150  SimTK::SubsystemIndex(SimTK::InvalidIndex),
151  SimTK::InvalidIndex),
152  invalidatestage_(SimTK::Stage::Empty) {}
153 
155  Real getValue() override;
156  void setValue(Real value) override;
157  Real getDerivative() override;
158  void setDerivative(Real deriv) override;
159 
160  private:
165  SimTK::Stage invalidatestage_;
166  };
167 
168  UniquePtrKeepers<AddedStateVariable> added_state_variable_ptr_keeper_;
174  StateVariableInfo() {}
175  explicit StateVariableInfo(StateEngine::StateVariable* sv, int order) :
176  statevariable_(sv), order(order) {}
177 
183  if (this != &svi) {
187  StateVariableInfo* mutableSvi = const_cast<StateVariableInfo*>(&svi);
188  statevariable_.swap(mutableSvi->statevariable_);
189  }
190  order = svi.order;
191  return *this;
192  }
193 
194  // State variable
195  std::unique_ptr<StateEngine::StateVariable> statevariable_;
196  // order of allocation
197  int order;
198  };
199  //===============================================================//
200  // PULIC
201  //===============================================================//
202  public:
203 
226  void addStateVariable(std::string statevariablename,
227  SimTK::Stage invalidatestage);
228 
241  void addStateVariable(StateEngine::StateVariable* statevariable);
242  //===========================================================//
243  SimTK::DefaultSystemSubsystem& getDefaultSubsystem()
244  {
245  return const_cast<SimTK::DefaultSystemSubsystem&>
246  (getMultibodySystem().getDefaultSubsystem());
247  }
248  SimTK::DefaultSystemSubsystem& updDefaultSubsystem()
249  {
250  return getMultibodySystem().updDefaultSubsystem();
251  }
252  //===========================================================//
259  StateVariable* traverseToStateVariable(std::string& pathname);
262  mutable std::map<std::string, StateVariableInfo> namedstatevariableinfo_;
265 
267  mutable SimTK::Array_<SimTK::ReferencePtr<StateVariable> >
270  mutable SimTK::ReferencePtr<SimTK::System> statesassociatedsystem_;
271 
273  StateEngine(SimTK::MultibodySystem& system);
274 
276  SimTK::ReferencePtr<SimTK::MultibodySystem> mbsystem_;
281  SimTK::State working_state_;
282 
284  virtual ~StateEngine() {};
286  void InitializeState();
293  SimTK::MultibodySystem& getMultibodySystem();
298  SimTK::MultibodySystem& updMultibodySystem();
307  {
308  return (int)namedstatevariableinfo_.size();
309  }
323  SimTK::Vector getStateVariableValues();
327  void reporter(SimTK::State& state_);
334  std::string restart_folder_;
335  void writeStateInfoToXml(int ite_rst_, const SimTK::State& state_);
342  SimTK::State readAndSetStateInfoFromXml(int ite_rst_, SimTK::MultibodySystem& system_);
352  void realizeTime();
357  void realizePosition();
363  void realizeVelocity();
370  void realizeDynamics();
374  void realizeAcceleration();
379  void realizeReport();
380  };
381 }
382 #endif //STATE_ENGINE_SIMBODY_H
bool isAllStatesVariablesListValid()
Definition: state_engine.cpp:127
void setVarIndex(int index)
Definition: state_engine.h:102
int & getVarIndex()
Definition: state_engine.h:96
void realizePosition()
Definition: state_engine.cpp:339
Definition: array.h:30
StateVariable * traverseToStateVariable(std::string &pathname)
Definition: state_engine.cpp:95
AddedStateVariable()
Definition: state_engine.h:143
SimTK::SubsystemIndex & getSubsysIndex()
Definition: state_engine.h:98
SimTK::ReferencePtr< SimTK::MultibodySystem > mbsystem_
Definition: state_engine.h:276
StateEngine(SimTK::MultibodySystem &system)
Definition: state_engine.cpp:12
StateVariableInfo(const StateVariableInfo &)
Definition: state_engine.h:180
void realizeVelocity()
Definition: state_engine.cpp:344
void realizeTime()
Definition: state_engine.cpp:334
void realizeAcceleration()
Definition: state_engine.cpp:354
void setSubsystemIndex(SimTK::SubsystemIndex &subsysindx)
Definition: state_engine.h:104
StateVariable()
Definition: state_engine.h:81
SimTK::SystemYIndex & getSystemYIndex()
Definition: state_engine.h:100
SimTK::MultibodySystem & updMultibodySystem()
virtual void setDerivative(Real deriv)=0
To hold related info about discrete variables.
Definition: state_engine.h:173
void reporter(SimTK::State &state_)
Definition: state_engine.cpp:211
virtual ~StateEngine()
Definition: state_engine.h:284
void addStateVariable(std::string statevariablename, SimTK::Stage invalidatestage)
Definition: state_engine.cpp:53
Real getValue() override
Definition: state_engine.cpp:168
Array< std::string > getStateVariableNames()
Definition: state_engine.cpp:107
Class for handling state variable added (allocated) by this StateEngine.
Definition: state_engine.h:140
void setDerivative(Real deriv) override
Definition: state_engine.cpp:206
AddedStateVariable(std::string &name, StateEngine &owner, SimTK::Stage invalidatestage)
Definition: state_engine.h:146
void realizeReport()
Definition: state_engine.cpp:359
Definition: state_engine.h:77
A wrapper to provide an ownership for a vector of base class pointers which point to derived objects...
Definition: ownership.h:127
void InitializeState()
Definition: state_engine.cpp:23
SimTK::Array_< SimTK::ReferencePtr< StateVariable > > allstatevariables_
Definition: state_engine.h:268
std::map< std::string, StateVariableInfo > namedstatevariableinfo_
Definition: state_engine.h:262
SimTK::ReferencePtr< SimTK::System > statesassociatedsystem_
Definition: state_engine.h:270
void realizeDynamics()
Definition: state_engine.cpp:349
std::string restart_folder_
Definition: state_engine.h:334
StateVariable(std::string &name, StateEngine &owner, SimTK::SubsystemIndex subsys, int varindex)
Definition: state_engine.h:85
SimTK::State working_state_
Definition: state_engine.h:281
SimTK::Vector getStateVariableValues()
Definition: state_engine.cpp:143
int getNumStateVariablesAddedByEngine()
Definition: state_engine.h:306
SimTK::MultibodySystem & getMultibodySystem()
Definition: state_engine.cpp:48
Definition: xml_engine.h:56
int getNumOfStateVariables()
Definition: state_engine.cpp:122
StateVariableInfo & operator=(const StateVariableInfo &svi)
Definition: state_engine.h:182
SimTK::State readAndSetStateInfoFromXml(int ite_rst_, SimTK::MultibodySystem &system_)
Definition: state_engine.cpp:281
Definition: solid_body_supplementary.cpp:9
Definition: state_engine.h:60