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);