00001 #ifndef SimTK_SIMBODY_FORCE_H_
00002 #define SimTK_SIMBODY_FORCE_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include "SimTKcommon.h"
00035 #include "simbody/internal/common.h"
00036 #include "simbody/internal/GeneralForceSubsystem.h"
00037
00038 namespace SimTK {
00039
00040 class SimbodyMatterSubsystem;
00041 class GeneralForceSubsystem;
00042 class MobilizedBody;
00043 class Force;
00044 class ForceImpl;
00045
00046
00047
00048
00049 #ifndef SimTK_SIMBODY_DEFINING_FORCE
00050 extern template class PIMPLHandle<Force, ForceImpl, true>;
00051 #endif
00052
00057 class SimTK_SIMBODY_EXPORT Force : public PIMPLHandle<Force, ForceImpl, true> {
00058 public:
00069 void disable(State&) const;
00073 void enable(State&) const;
00077 bool isDisabled(const State&) const;
00083 void setDisabledByDefault(bool shouldBeDisabled);
00087 bool isDisabledByDefault() const;
00135 void calcForceContribution(const State& state,
00136 Vector_<SpatialVec>& bodyForces,
00137 Vector_<Vec3>& particleForces,
00138 Vector& mobilityForces) const;
00150 Real calcPotentialEnergyContribution(const State& state) const;
00159 Force() {}
00163 operator ForceIndex() const {return getForceIndex();}
00167 const GeneralForceSubsystem& getForceSubsystem() const;
00171 ForceIndex getForceIndex() const;
00174 class TwoPointLinearSpring;
00175 class TwoPointLinearDamper;
00176 class TwoPointConstantForce;
00177 class MobilityLinearSpring;
00178 class MobilityLinearDamper;
00179 class MobilityConstantForce;
00180 class LinearBushing;
00181 class ConstantForce;
00182 class ConstantTorque;
00183 class GlobalDamper;
00184 class Thermostat;
00185 class UniformGravity;
00186 class Custom;
00187
00188 class TwoPointLinearSpringImpl;
00189 class TwoPointLinearDamperImpl;
00190 class TwoPointConstantForceImpl;
00191 class MobilityLinearSpringImpl;
00192 class MobilityLinearDamperImpl;
00193 class MobilityConstantForceImpl;
00194 class LinearBushingImpl;
00195 class ConstantForceImpl;
00196 class ConstantTorqueImpl;
00197 class GlobalDamperImpl;
00198 class ThermostatImpl;
00199 class UniformGravityImpl;
00200 class CustomImpl;
00201
00202 protected:
00205 explicit Force(ForceImpl* r) : HandleBase(r) { }
00206 };
00207
00208
00220 class SimTK_SIMBODY_EXPORT Force::TwoPointLinearSpring : public Force {
00221 public:
00233 TwoPointLinearSpring(GeneralForceSubsystem& forces, const MobilizedBody& body1, const Vec3& station1, const MobilizedBody& body2, const Vec3& station2, Real k, Real x0);
00234 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(TwoPointLinearSpring, TwoPointLinearSpringImpl, Force);
00235 };
00236
00249 class SimTK_SIMBODY_EXPORT Force::TwoPointLinearDamper: public Force {
00250 public:
00261 TwoPointLinearDamper(GeneralForceSubsystem& forces, const MobilizedBody& body1, const Vec3& station1, const MobilizedBody& body2, const Vec3& station2, Real damping);
00262 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(TwoPointLinearDamper, TwoPointLinearDamperImpl, Force);
00263 };
00264
00276 class SimTK_SIMBODY_EXPORT Force::TwoPointConstantForce: public Force {
00277 public:
00288 TwoPointConstantForce(GeneralForceSubsystem& forces, const MobilizedBody& body1, const Vec3& station1, const MobilizedBody& body2, const Vec3& station2, Real force);
00289 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(TwoPointConstantForce, TwoPointConstantForceImpl, Force);
00290 };
00291
00303 class SimTK_SIMBODY_EXPORT Force::MobilityLinearSpring : public Force {
00304 public:
00314 MobilityLinearSpring(GeneralForceSubsystem& forces, const MobilizedBody& body, int coordinate, Real k, Real q0);
00315 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(MobilityLinearSpring, MobilityLinearSpringImpl, Force);
00316 };
00317
00328 class SimTK_SIMBODY_EXPORT Force::MobilityLinearDamper : public Force {
00329 public:
00338 MobilityLinearDamper(GeneralForceSubsystem& forces, const MobilizedBody& body, int coordinate, Real damping);
00339 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(MobilityLinearDamper, MobilityLinearDamperImpl, Force);
00340 };
00341
00352 class SimTK_SIMBODY_EXPORT Force::MobilityConstantForce : public Force {
00353 public:
00362 MobilityConstantForce(GeneralForceSubsystem& forces, const MobilizedBody& body, int coordinate, Real force);
00363 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(MobilityConstantForce, MobilityConstantForceImpl, Force);
00364 };
00365
00373 class SimTK_SIMBODY_EXPORT Force::ConstantForce: public Force {
00374 public:
00375 ConstantForce(GeneralForceSubsystem& forces, const MobilizedBody& body, const Vec3& station, const Vec3& force);
00376 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(ConstantForce, ConstantForceImpl, Force);
00377 };
00378
00386 class SimTK_SIMBODY_EXPORT Force::ConstantTorque: public Force {
00387 public:
00388 ConstantTorque(GeneralForceSubsystem& forces, const MobilizedBody& body, const Vec3& torque);
00389 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(ConstantTorque, ConstantTorqueImpl, Force);
00390 };
00391
00406 class SimTK_SIMBODY_EXPORT Force::GlobalDamper : public Force {
00407 public:
00408 GlobalDamper(GeneralForceSubsystem& forces, const SimbodyMatterSubsystem& matter, Real damping);
00409 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(GlobalDamper, GlobalDamperImpl, Force);
00410 };
00411
00418 class SimTK_SIMBODY_EXPORT Force::UniformGravity : public Force {
00419 public:
00420 UniformGravity(GeneralForceSubsystem& forces, const SimbodyMatterSubsystem& matter, const Vec3& g, Real zeroHeight=0);
00421 Vec3 getGravity() const;
00422 void setGravity(const Vec3& g);
00423 Real getZeroHeight() const;
00424 void setZeroHeight(Real height);
00425 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(UniformGravity, UniformGravityImpl, Force);
00426 };
00427
00457 class SimTK_SIMBODY_EXPORT Force::Custom : public Force {
00458 public:
00459 class Implementation;
00468 Custom(GeneralForceSubsystem& forces, Implementation* implementation);
00469 SimTK_INSERT_DERIVED_HANDLE_DECLARATIONS(Custom, CustomImpl, Force);
00470 protected:
00471 const Implementation& getImplementation() const;
00472 Implementation& updImplementation();
00473 };
00474
00475 class SimTK_SIMBODY_EXPORT Force::Custom::Implementation {
00476 public:
00477 virtual ~Implementation() { }
00489 virtual void calcForce(const State& state, Vector_<SpatialVec>& bodyForces, Vector_<Vec3>& particleForces, Vector& mobilityForces) const = 0;
00495 virtual Real calcPotentialEnergy(const State& state) const = 0;
00501 virtual bool dependsOnlyOnPositions() const {
00502 return false;
00503 }
00508 virtual void realizeTopology(State& state) const {
00509 }
00510 virtual void realizeModel(State& state) const {
00511 }
00512 virtual void realizeInstance(const State& state) const {
00513 }
00514 virtual void realizeTime(const State& state) const {
00515 }
00516 virtual void realizePosition(const State& state) const {
00517 }
00518 virtual void realizeVelocity(const State& state) const {
00519 }
00520 virtual void realizeDynamics(const State& state) const {
00521 }
00522 virtual void realizeAcceleration(const State& state) const {
00523 }
00524 virtual void realizeReport(const State& state) const {
00525 }
00527 };
00528
00529 }
00530
00531 #endif // SimTK_SIMBODY_FORCE_H_