1 //#*************************************************************************************** 2 //# filename: mbs_interface.h 3 //# authors: Johannes Gerstmayr, Yuri Vetyukov 4 //# generated: 5 //# rewritten: 6 //# description: 7 //# 8 //# remarks: 9 //# 10 //# Copyright (c) 2003-2013 Johannes Gerstmayr, Linz Center of Mechatronics GmbH, Austrian 11 //# Center of Competence in Mechatronics GmbH, Institute of Technical Mechanics at the 12 //# Johannes Kepler Universitaet Linz, Austria. All rights reserved. 13 //# 14 //# This file is part of HotInt. 15 //# HotInt is free software: you can redistribute it and/or modify it under the terms of 16 //# the HOTINT license. See folder 'licenses' for more details. 17 //# 18 //# bug reports are welcome!!! 19 //# WWW: www.hotint.org 20 //# email: bug_reports@hotint.org or support@hotint.org 21 //#*************************************************************************************** 22 23 #pragma once 24 25 // this is an interface for the MultiBodySystem class; 26 // it contains functions, which may be needed by elements and model generating functions 27 // at the stages of model creation, computation and drawing; 28 // it is placed into the class hierarchy at the level of NumNLSys, 29 // as several functions, which belong to the interface, 30 // are defined there or in TimeInt 31 // in future, deeper decoupling is foreseen, so that we 32 // separate some of the parts of the common interface into base 33 // classes 34 35 #include "preprocessor_includes.h" // Hotint preprocessor definitions 36 #include "mystring.h" 37 #include "tarray.h" 38 #include "..\WorkingModule\hotint_version_info.h" 39 40 // we need linear algebra everywhere - and prior to including the headers we need these definitions 41 class Matrix; 42 class MatrixXD; 43 class SparseMatrix; 44 class Vector3D; 45 class Vector2D; 46 class Matrix2D; 47 class Matrix3D; 48 class Vector; 49 class int3; 50 typedef TArray<int> IVector; 51 typedef TArray<double> DVector; 52 struct SuperMatrix; 53 #include "mathaux.h" 54 #include "linalg3d.h" 55 #include "linalg.h" 56 57 #include "UserOutputInterface.h" 58 #include "NumSolverInterface.h" 59 60 class Element; 61 class Sensor; 62 class Node; 63 class GeomElement; 64 class MBSLoad; 65 class Material; 66 67 class IntegrationRulesLibrary; 68 //class NumNLSolver; 69 struct FieldVariableDescriptor; 70 class ElementDataContainer; 71 struct RenderContext; 72 struct ControlWindowContext; 73 class HOTINTOptions; 74 class SolverSettings; 75 class TimeIntLog; 76 77 class SearchTree; 78 79 class CMBSParser; 80 81 //$ MaSch 2013-08-26 82 class TCPIPHotInt; 83 84 // old definitions 85 //for faster operations, parallel threads impossible!!! 86 #define mystatic static 87 //#define mystatic 88 //#define gencnt 89 90 struct MBSSolutionAccessInterface 91 { 92 // solution vector 93 virtual const double& GetXact(int i) const = 0; 94 virtual double& GetXact(int i) = 0; 95 virtual double GetEigenValue(int index) const = 0; 96 virtual const double& GetDrawValue(int i) const = 0; 97 virtual double& GetDrawValue(int i) = 0; 98 virtual const Vector & GetLastSolVector() const = 0; 99 virtual const Vector& GetSolVector() const = 0; 100 virtual const Vector& GetXact() const = 0; // probably this is the same as the function below 101 virtual Vector& GetSolVector() = 0; 102 virtual void SetActState(const Vector& x) = 0; 103 virtual void SetActState(double* ptr, int len) = 0; 104 virtual const Vector& GetLastNLItSolVector() const = 0; 105 106 // extra data 107 virtual const double& GetDataAct(int i) const = 0; 108 virtual double& GetDataAct(int i) = 0; 109 virtual const double& GetDataDraw(int i) const = 0; 110 virtual double& GetDataDraw(int i) = 0; 111 virtual Vector& GetLastDataVector() = 0; 112 virtual const Vector& GetLastDataVector() const = 0; 113 virtual Vector& GetLastNLItDataVector() = 0; 114 virtual const Vector& GetLastNLItDataVector() const = 0; 115 }; 116 117 struct MBSObjectsAccessInterface 118 { 119 // elements 120 virtual int AddElement(Element* e) = 0; 121 virtual void DeleteElement(int i) = 0; 122 virtual Element& GetElement(int i) = 0; 123 virtual const Element& GetElement(int i) const = 0; 124 virtual Element* GetElementPtr(int i) = 0; 125 virtual const Element* GetElementPtr(int i) const = 0; 126 virtual int NE() const = 0; 127 virtual int GetNElements() const = 0; // the same as above 128 129 // constraints 130 virtual int NConstraints() const = 0; // DR 2013-01-15 131 132 // auxiliary elements 133 virtual Element& GetAuxElement(int i) = 0; 134 virtual const Element& GetAuxElement(int i) const = 0; 135 virtual Element* GetAuxElementPtr(int i) = 0; 136 virtual const Element* GetAuxElementPtr(int i) const = 0; 137 virtual int AddAuxElement(Element* e) = 0; 138 virtual int NAuxE() const = 0; 139 140 // sensors 141 virtual int AddSensor(Sensor * s) = 0; 142 virtual Sensor & GetSensor(int i) = 0; 143 virtual const Sensor & GetSensor(int i) const = 0; 144 virtual int NSensors() const = 0; 145 virtual void DeleteSensor(int i) = 0; 146 virtual Sensor* GetSensorPtr(int i) = 0; //$ DR 2013-01-11 added 147 virtual const Sensor* GetSensorPtr(int i) const = 0; //$ DR 2013-01-11 added 148 149 // loads 150 virtual int AddLoad(const MBSLoad& li) = 0; 151 virtual MBSLoad& GetLoad(int i) = 0; 152 virtual const MBSLoad& GetLoad(int i) const = 0; 153 virtual void DeleteLoad(int i) = 0; 154 virtual int NLoads() const = 0; 155 virtual MBSLoad* GetLoadPtr(int i) = 0; 156 virtual const MBSLoad* GetLoadPtr(int i) const = 0; 157 158 // nodes 159 virtual void DeleteNode(int i) = 0; 160 virtual int AddNode(Node* n) = 0; 161 virtual int AddNode(Node* n, SearchTree& tree) = 0; 162 virtual Node& GetNode(int i) = 0; 163 virtual const Node& GetNode(int i) const = 0; 164 virtual int NNodes() const = 0; 165 virtual int AddBodyNode(Node* n) = 0; 166 virtual int AddBodyNode(Node* n, SearchTree& tree) = 0; 167 virtual Node* GetNodePtr(int i) = 0; 168 virtual const Node* GetNodePtr(int i) const = 0; 169 170 171 // materials 172 virtual int AddMaterial(const Material& m) = 0; 173 virtual Material& GetMaterial(int i) = 0; 174 virtual const Material& GetMaterial(int i) const = 0; 175 virtual int NMaterials() const = 0; 176 virtual int DeleteMaterial(int i) = 0; 177 virtual Material* GetMaterialPtr(int i) = 0; 178 virtual const Material* GetMaterialPtr(int i) const = 0; 179 180 181 // geometric (draw) elements 182 virtual int Add(const GeomElement& de) = 0; 183 virtual int Add(const GeomElement& de, int elnum) = 0; 184 virtual GeomElement* GetDrawElement(int i) const = 0; 185 virtual GeomElement* GetDrawElement(int i) = 0; 186 virtual int NDrawElements() const = 0; 187 virtual void DeleteDrawElement(int i) = 0; 188 }; 189 190 struct MBS3DDrawingInterface 191 { 192 virtual RenderContext * GetRC() = 0; 193 //virtual ControlWindowContext * GetCWC() = 0; 194 virtual void MyDrawLineH(const Vector3D& p1, const Vector3D&p2, const Vector3D& vy2, 195 double t, double h, int drawouterface=1) const = 0; 196 virtual void DrawColorQuads(const TArray<Vector3D>& p, const TArray<double>& v, int n1, int n2, 197 int colormode, int drawlines=0, int vres=1) = 0; 198 virtual void DrawQuad(const Vector3D& p1,const Vector3D& p2,const Vector3D& p3,const Vector3D& p4) const = 0; 199 virtual void DrawTrig(const Vector3D& p1,const Vector3D& p2,const Vector3D& p3) const = 0; 200 virtual void DrawHex(const Vector3D& p1,const Vector3D& p2,const Vector3D& p3,const Vector3D& p4, 201 const Vector3D& p5,const Vector3D& p6,const Vector3D& p7,const Vector3D& p8, int drawouterfaces=1) const = 0; 202 virtual void DrawCube(const Vector3D& p0, const Vector3D& v1, const Vector3D& v2, const Vector3D& v3) const = 0; 203 virtual void MyDrawRectangle(const Vector3D& p1, const Vector3D& p2, const Vector3D& p3, const Vector3D& p4, double thickness, const Vector3D* colline, const Vector3D* colfill=0) const = 0; 204 virtual void MyDrawLine(const Vector3D& p1, const Vector3D&p2, double thickness) const = 0; 205 virtual void MyDrawLine(const Vector3D& p1, const Vector3D&p2, double thickness, const Vector3D& col) const = 0; 206 virtual void MyDrawLine(const Vector3D& p1, const Vector3D&p2, double t, double h) const = 0; 207 virtual void MyDrawCircleXY(const Vector3D p, double r, const Vector3D& col, int res=12, double thickness=1) const = 0; 208 virtual void MyDrawArrow(const Vector3D& p1, const Vector3D&p2, const Vector3D& col, 209 double linethickness = -1, double headsize = -1, int resolution=8) const = 0; 210 virtual void DrawArrow(const Vector3D& p1, const Vector3D&p2, double linethickness = -1, double headsize = -1, int resolution = 8) const = 0; 211 virtual void DrawColorArrow(double v, const Vector3D& p1, const Vector3D&p2, double linethickness = -1, double headsize = -1, int resolution = 8) = 0; 212 virtual void DrawColorZyl(double v, const Vector3D& pz1,const Vector3D& pz2, double rz, int tile) = 0; 213 virtual void DrawZyl(const Vector3D& pz1, const Vector3D& pz2, double rz, int tile=8) const = 0; 214 virtual void DrawCone(const Vector3D& pz1, const Vector3D& pz2, double rz, int tile=8, int drawconelines = 0) const = 0; 215 virtual void DrawZyl(const Vector3D& pz1, const Vector3D& pz2, const Vector3D& pz1dir,const Vector3D& pz2dir, double rz, int leftend = 1, int rightend = 1, int tile=8) const = 0; 216 virtual void DrawSphere(const Vector3D& p1, double r, int tile=8, double fill=1) const = 0; 217 virtual void DrawColorSphere(double value, const Vector3D& p, double r, int tile=8, double fill=1) = 0; 218 virtual void DrawPolygon(const TArray<Vector3D>& p, int drawlines=0, double linewidth=1) const = 0; 219 virtual void DrawPolygonOutline(const TArray<Vector3D>& p, double linewidth=1) const = 0; 220 221 virtual void SetColor(const Vector3D& col) = 0; 222 virtual void SetLineColor(const Vector3D& col) = 0; 223 virtual const Vector3D& GetLineColor() = 0; 224 virtual void SetTransparency(int transp_on) = 0; 225 virtual int GetTransparency() const = 0; 226 virtual void ChooseColor(float R, float G, float B) const = 0; 227 virtual void SetDrawlines(int i) = 0; 228 virtual void SetDrawlinesH(int i) = 0; 229 230 // for geom objects 231 virtual double GetObjData(int row, int col) const = 0; 232 virtual double GetObjDataStepSize() const = 0; 233 virtual Vector3D & ColLine() = 0; 234 235 virtual int UseCuttingPlanes() = 0; 236 virtual int CuttingPlanesAllow(const Vector3D& pos) = 0; 237 238 //$ PG 2013-6-12: those functions were added in order to get some old models (in model.cpp) working again: 239 virtual void SetCenterObject(int co, const Vector3D& offset) = 0; 240 virtual int GetCenterObject() const = 0; 241 virtual double GetMagnifyYZ() const = 0; 242 virtual void SetMagnifyYZ(double amagyz) = 0; 243 virtual void SetShowelem(const int __se) = 0; // depreciated 244 virtual void SetShowelem2(const int __se) = 0; // depreciated 245 virtual void SetShowelem3(const int __se) = 0; // depreciated 246 }; 247 248 249 //// AD: [ f.t.t.b. enums for 2D window here 250 // identify the type and number of the element on the MBS-side 251 typedef enum { TNoMBSElem = 0, TIOBlock = 1, TSensor = 2 } TMBSElementType; 252 253 // identify the type and number of the element on the Draw-side 254 typedef enum { TNoSubType = 0, 255 TElementFrame = 1, TElementName = 2, 256 TInputNode = 3, TOutputNode = 4, 257 TConstructionNode = 5, TConnectionLine = 6, 258 TTextObject = 7, 259 TSymbol = 8} TDrawElementType; 260 261 typedef enum { TNoGeoType = 0, TGLine = 1, TGRectangle = 2, TGEllipse = 3, TGText = 4} TGeomElementType; 262 263 typedef enum {HLeft=0, HCenter=1, HRight=2, // horizontal allingment 264 VTop=0, VCenter=3, VBottom=6, // vertical allignment 265 ScaleDown2Fit = 128 // additional properties : "scale to fit" scale down fontsize to fit in rectangle - use a binary value here 266 } TTextAllign; 267 268 //typedef enum {HLeft=1, HCenter=5, HRight=9, 269 // VTop=10, VCenter=50, VBottom=90} TTextAllign; 270 271 //// AD: ] 272 273 274 struct MBS2DDrawingInterface 275 { 276 virtual ControlWindowContext * GetCWC() = 0; 277 278 virtual void AddDrawComponent_Line(int mbs_elnr, TMBSElementType mbs_type, int sub_elnr, TDrawElementType sub_type, Vector2D p1, Vector2D p2, Vector3D col) = 0; 279 virtual void AddDrawComponent_Rect(int mbs_elnr, TMBSElementType mbs_type, int sub_elnr, TDrawElementType sub_type, Vector2D center, Vector2D size, Vector3D col_border, Vector3D col_background) = 0; 280 virtual void AddDrawComponent_Ellipse(int mbs_elnr, TMBSElementType mbs_type, int sub_elnr, TDrawElementType sub_type, Vector2D center, Vector2D size, Vector3D col_border, Vector3D col_background) = 0; 281 virtual void AddDrawComponent_Text(int mbs_elnr, TMBSElementType mbs_type, int sub_elnr, TDrawElementType sub_type, Vector2D center, Vector2D size, Vector3D col_text, mystr& text, TTextAllign positioning) = 0; 282 }; 283 284 struct MBSOptionsInterface 285 { 286 virtual void SetIOption(int index, int data) = 0; 287 virtual const int& GetIOption(int index) const = 0; 288 virtual int& GetIOption(int index) = 0; 289 virtual void SetDOption(int index, double data) = 0; 290 virtual const double& GetDOption(int index) const = 0; 291 virtual double& GetDOption(int index) = 0; 292 virtual void SetTOption(int index, const char* data) = 0; 293 virtual const char* GetTOption(int index) const = 0; 294 295 virtual HOTINTOptions* GetOptions() = 0; 296 virtual const HOTINTOptions* GetOptions() const = 0; 297 298 // these two functions were required by the parser 299 virtual ElementDataContainer* GetMBS_EDC_Options() = 0; 300 virtual ElementDataContainer* GetMBS_EDC_Variables() = 0; 301 // $EK 2013-01-11 added two members to interface 302 virtual void SolverOptions2EDC(ElementDataContainer* edc) = 0; 303 virtual void EDC2SolverOptions(const ElementDataContainer* edc) = 0; 304 }; 305 306 // is often needed alone 307 struct MBSUOInterface 308 { 309 virtual UserOutputInterface & UO(int message_level = UO_LVL_all, int output_prec = -1) const = 0; 310 }; 311 312 struct MBSModelDataInterface 313 { 314 virtual ElementDataContainer* GetModelDataContainer() = 0; 315 // $EK 2013-01-11 added GetModelDataContainer_args 316 virtual ElementDataContainer* GetModelDataContainer_args() = 0; 317 virtual void SetModelDataContainer(const ElementDataContainer& edc) = 0; 318 virtual int ReadModelData(mystr filename) = 0; 319 virtual int AddModelData(mystr filename) = 0; 320 virtual void AddReplaceModelDataEDC(ElementDataContainer& edc) = 0; // $AD: 2013-09-13 added for FOR command of script language ( no external file is read here ) 321 }; 322 323 // functionality related to parsing expressions 324 struct MBSParserInterface 325 { 326 virtual double EvaluateParsedFunction1D(const mystr & parsedFunctionExpression, const mystr & parsedFunctionVariables, double t) = 0; 327 // this function, required by Sim2Hotint, invokes expression parser to evaluate an expression 328 virtual double ExpressionToDouble(mystr & expression) = 0; 329 //this function reads a file and stores it in an edc - required by femesh and GeomMesh3D 330 virtual int File2EDC(const char* filename, ElementDataContainer* edc_file) = 0; 331 // this function evaluates a command of the parser, using the parameter_EDC as additional input data 332 virtual int ExecuteParserCommand(mystr & command, TArray<ElementDataContainer*>& parameter_EDCs, ElementData& return_value, int option) = 0; 333 //this function computes mass, moment of inertia, volume and center of gravity based on the data about the geometry and the material 334 virtual int ComputeInertia(ElementDataContainer* data, ElementDataContainer* return_value) = 0; //$ DR 2013-01-30 335 //this function reads a column of a file and stores the vector in an edc 336 virtual int LoadVectorFromFile(const char* filename, int col, ElementDataContainer* return_value) = 0; //$ DR 2013-07-04 337 //this function returns a pointer to the parser (needed in MathFunction) 338 virtual CMBSParser& MBSParser() = 0; 339 }; 340 341 typedef enum 342 { 343 TSimulationNotStarted = 1, 344 TSimulationRunning = TSimulationNotStarted << 1, 345 TSimulationEndedRegularly = TSimulationNotStarted << 2, 346 TSimulationStoppedDueError = TSimulationNotStarted << 3, 347 TSimulationStoppedByUser = TSimulationNotStarted << 4, 348 TSimulationStoppedByElement = TSimulationNotStarted << 5, 349 TSimulationProcessFinished = TSimulationNotStarted << 6 // $ MaSch 2013-08-08: this flag is set in MultiBodySystem::PerformComputation() after the whole simulation process 350 //(e.g. one single computation, or all computations of a parameter variation) has finished 351 } TSimulationStatus; 352 353 class SimulationStatus 354 { 355 protected: 356 unsigned int status; 357 358 public: SimulationStatus()359 SimulationStatus(): status(unsigned int(0)) {}; SimulationStatus(const TSimulationStatus & s)360 SimulationStatus(const TSimulationStatus & s): status(s) {}; SetStatusFlag(const TSimulationStatus & s)361 void SetStatusFlag(const TSimulationStatus & s) {status = s;} //reset status to s AddSetStatusFlag(const TSimulationStatus & s)362 void AddSetStatusFlag(const TSimulationStatus & s) {status |= s;} //(additionally) set flag s UnsetStatusFlag(const TSimulationStatus & s)363 void UnsetStatusFlag(const TSimulationStatus & s) {status &= (~s);} //delete flag s GetStatusFlag(const TSimulationStatus & s)364 unsigned int GetStatusFlag(const TSimulationStatus & s) {return(status & s);} //returns 0 if flag s is not set, otherwise s (!=0) ResetStatusFlags()365 void ResetStatusFlags() {status &= unsigned int(0);} 366 }; 367 368 369 struct MBS : 370 public MBSSolutionAccessInterface, 371 public MBSObjectsAccessInterface, 372 public MBS3DDrawingInterface, 373 public MBS2DDrawingInterface, 374 public MBSOptionsInterface, 375 public MBSUOInterface, 376 public MBSModelDataInterface, 377 public MBSParserInterface 378 { 379 // specific functions 380 virtual double GetTime() const = 0; 381 virtual TimeIntLog GetTimeIntLog() const = 0; 382 virtual double GetDrawTime() const = 0; 383 virtual int GetCSNumber(double globaltime) = 0; 384 virtual double GetCSTime(double globaltime) = 0; 385 virtual double LoadFact() = 0; 386 387 virtual void Assemble() = 0; 388 virtual void BuildLTGLists() = 0; 389 virtual int MaxIndex() const = 0; 390 virtual void SetMaxIndex(int i) = 0; 391 virtual int UseDependencies() const = 0; 392 virtual void ClearSystem() = 0; 393 394 virtual const double& GetVelocityAndAcceleration(int i) const = 0; // $ MSax 2013-07-16 : changed from GetAcceleration to GetVelocityAndAcceleration 395 396 virtual const SolverSettings& GetSolSet() const = 0; 397 virtual SolverSettings& GetSolSet() = 0; 398 399 // parameter variation access functions 400 virtual const double& GetVarparameter() const = 0; 401 virtual double& GetVarparameter() = 0; 402 virtual const double& GetVarparameter2() const = 0; 403 virtual double& GetVarparameter2() = 0; 404 405 virtual void StopByElement() = 0; 406 virtual SimulationStatus & GetSimulationStatus() = 0; 407 //virtual const NumNLSolver& NumSolver() const = 0; 408 virtual NumSolverInterface& NumSolver() = 0; 409 virtual void EDCError(const mystr& str) = 0; 410 virtual double GetMagnifyYZ() const = 0; 411 virtual FieldVariableDescriptor * GetActualPostProcessingFieldVariable() = 0; 412 virtual int IsLoadSaveMode() const = 0; 413 virtual int IsJacobianComputation() const = 0; 414 virtual double DiscontinuousAccuracy() const = 0; 415 virtual double& DiscontinuousAccuracy() = 0; 416 virtual int StopCalculation() const = 0; 417 virtual int GetSystemSize() const = 0; // for BaseCMSElement 418 virtual void SetTransformJacApply(int i) = 0; // for CMSElement2D 419 virtual int UseSparseSolver() const = 0; // ACRSElement2D 420 virtual double GetStepSize() const = 0; // ACRSElement2D 421 virtual int GetSecondOrderSize() const = 0; // specialconstraints 422 423 virtual void SetUseDependencies(int flag) = 0; 424 425 virtual void SetReducedBandsize(int reducedbandsizeI) = 0; 426 427 virtual double CharacteristicLength() const = 0; 428 429 // functions below appeared due to ancf...2d 430 virtual void UpdateFEMinMaxCol(double val) = 0; 431 virtual const double& GetTImincol() const = 0; 432 virtual double& GetFEmincol() = 0; 433 virtual const double& GetTImaxcol() const = 0; 434 virtual double& GetFEmaxcol() = 0; 435 virtual Vector3D FEColor(double val) const = 0; 436 virtual int GetDrawResolution() const = 0; 437 438 // contact2D/3D, control 439 virtual int DoStaticComputation() const = 0; 440 virtual double GetStepRecommendation() const = 0; 441 virtual void SetStepRecommendation(double s) = 0; 442 virtual double GetStepSizeNew() = 0; 443 virtual double GetStepEndTime() const = 0; 444 virtual void ForceJacobianRecomputation() = 0; 445 446 // this function returns the current hotint version, as defined in "WorkingModule\hotint_version.h" 447 virtual const HotintVersionInfo& GetHotintVersion() const = 0; 448 449 //$ MaSch 2013-08-26 450 //TCP/IP 451 virtual TCPIPHotInt* & GetServerSocket() = 0; 452 453 }; 454 455 //Use the following function in order to register Model functions automatically in the MBS system 456 void ModelFunctionAutoRegistration(int(*function_ptr)(MBS* mbs), const char* functionName, const char* description, int option, 457 int(*function_ptr_init_modeldata)(MBS* mbs) = 0);