1 /* $Header: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/mbdyn/struct/planej.h,v 1.50 2017/01/12 14:46:43 masarati Exp $ */
2 /*
3  * MBDyn (C) is a multibody analysis code.
4  * http://www.mbdyn.org
5  *
6  * Copyright (C) 1996-2017
7  *
8  * Pierangelo Masarati	<masarati@aero.polimi.it>
9  * Paolo Mantegazza	<mantegazza@aero.polimi.it>
10  *
11  * Dipartimento di Ingegneria Aerospaziale - Politecnico di Milano
12  * via La Masa, 34 - 20156 Milano, Italy
13  * http://www.aero.polimi.it
14  *
15  * Changing this copyright notice is forbidden.
16  *
17  * This program is free software; you can redistribute it and/or modify
18  * it under the terms of the GNU General Public License as published by
19  * the Free Software Foundation (version 2 of the License).
20  *
21  *
22  * This program is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25  * GNU General Public License for more details.
26  *
27  * You should have received a copy of the GNU General Public License
28  * along with this program; if not, write to the Free Software
29  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
30  */
31 
32 /* Giunti piani */
33 
34 #ifndef PLANEJ_H
35 #define PLANEJ_H
36 
37 #include "joint.h"
38 #include "drive.h"
39 #include "friction.h"
40 
41 /* PlaneHingeJoint - begin */
42 
43 class PlaneHingeJoint : virtual public Elem, public Joint {
44  private:
45    /* Cerniera piana - asse di rotazione dato dall'asse 3 del sistema di
46     * riferimento della cerniera. Tale sistema e' noto relativamente ai due
47     * nodi. In particolare rispetto al nodo 1 la trasformazione dal sistema
48     * di riferimento della cerniera al sistema globale e': R1*R1h, mentre per
49     * il nodo 2 la medesima trasformazion e': R2*R2h.
50     * I vettori d1 e d2 esprimono, nel sistema di riferimento dei rispettivi
51     * nodi, la distanza della cerniera dai nodi stessi.
52     * I vettori F, M esprimono le reazioni vincolari di forza e coppia. */
53    const StructNode* pNode1;
54    const StructNode* pNode2;
55    Vec3 d1;
56    Mat3x3 R1h;
57    Vec3 d2;
58    Mat3x3 R2h;
59    Vec3 F;
60    Vec3 M;
61 #ifdef USE_NETCDF
62 	NcVar *Var_Phi;
63 	NcVar *Var_Omega;
64 //	NcVar *Var_MFR;
65 //	NcVar *Var_MU;
66 #endif // USE_NETCDF
67 
68    bool calcInitdTheta;
69    mutable int NTheta;
70    mutable doublereal dTheta, dThetaWrapped;
71 
72    /* friction related data */
73    BasicShapeCoefficient *const Sh_c;
74    BasicFriction *const fc;
75    const doublereal preF;
76    const doublereal r;
77    doublereal M3;
78    static const unsigned int NumSelfDof;
79    static const unsigned int NumDof;
80    /* end of friction related data */
81 
82  protected:
83 	OrientationDescription od;
84 
85  public:
86    /* Costruttore non banale */
87    PlaneHingeJoint(unsigned int uL, const DofOwner* pDO,
88 		   const StructNode* pN1, const StructNode* pN2,
89 		   const Vec3& dTmp1, const Vec3& dTmp2,
90 		   const Mat3x3& R1hTmp, const Mat3x3& R2hTmp,
91 	       const OrientationDescription& od,
92 	       flag fOut,
93 		   const bool _calcInitdTheta = true,
94 		   const doublereal initDTheta = 0.,
95 		   const doublereal rr = 0.,
96 		   const doublereal pref = 0.,
97 		   BasicShapeCoefficient *const sh = 0,
98 		   BasicFriction *const f = 0);
99 
100    /* Distruttore */
101    ~PlaneHingeJoint(void);
102 
103    virtual void ReadInitialState(MBDynParser& HP);
104 
105    /* Contributo al file di restart */
106    virtual std::ostream& Restart(std::ostream& out) const;
107 
108    /* Tipo di Joint */
GetJointType(void)109    virtual Joint::Type GetJointType(void) const {
110       return Joint::PLANEHINGE;
111    };
112 
113    virtual unsigned int iGetNumDof(void) const;
114 
115    virtual std::ostream& DescribeDof(std::ostream& out,
116 		   const char *prefix = "",
117 		   bool bInitial = false) const;
118 
119    virtual void DescribeDof(std::vector<std::string>& desc,
120 		   bool bInitial = false, int i = -1) const;
121 
122    virtual std::ostream& DescribeEq(std::ostream& out,
123 		   const char *prefix = "",
124 		   bool bInitial = false) const;
125 
126    virtual void DescribeEq(std::vector<std::string>& desc,
127 		   bool bInitial = false, int i = -1) const;
128 
129    DofOrder::Order GetDofType(unsigned int i) const;
130 
131    virtual void SetValue(DataManager *pDM,
132 		   VectorHandler& X, VectorHandler& XP,
133 		   SimulationEntity::Hints *ph = 0);
134 
135 	virtual Hint *
136 	ParseHint(DataManager *pDM, const char *s) const;
137 
138    virtual void AfterConvergence(const VectorHandler& X,
139 			const VectorHandler& XP);
140 
WorkSpaceDim(integer * piNumRows,integer * piNumCols)141    void WorkSpaceDim(integer* piNumRows, integer* piNumCols) const {
142       *piNumRows = NumDof;
143       *piNumCols = NumDof;
144       if (fc) {
145           *piNumRows += fc->iGetNumDof();
146           *piNumCols += fc->iGetNumDof();
147       }
148    };
149 
150 
151    VariableSubMatrixHandler& AssJac(VariableSubMatrixHandler& WorkMat,
152 				    doublereal dCoef,
153 				    const VectorHandler& XCurr,
154 				    const VectorHandler& XPrimeCurr);
155    SubVectorHandler& AssRes(SubVectorHandler& WorkVec,
156 			    doublereal dCoef,
157 			    const VectorHandler& XCurr,
158 			    const VectorHandler& XPrimeCurr);
159 
160    DofOrder::Order GetEqType(unsigned int i) const;
161 
162    void OutputPrepare(OutputHandler &OH);
163    void Output(OutputHandler& OH) const;
164 
165 
166    /* funzioni usate nell'assemblaggio iniziale */
167 
iGetInitialNumDof(void)168    virtual unsigned int iGetInitialNumDof(void) const {
169       return 10;
170    };
InitialWorkSpaceDim(integer * piNumRows,integer * piNumCols)171    virtual void InitialWorkSpaceDim(integer* piNumRows,
172 				    integer* piNumCols) const {
173       *piNumRows = 34;
174       *piNumCols = 34;
175    };
176 
177    /* Contributo allo jacobiano durante l'assemblaggio iniziale */
178    VariableSubMatrixHandler& InitialAssJac(VariableSubMatrixHandler& WorkMat,
179 					   const VectorHandler& XCurr);
180 
181    /* Contributo al residuo durante l'assemblaggio iniziale */
182    SubVectorHandler& InitialAssRes(SubVectorHandler& WorkVec,
183 				   const VectorHandler& XCurr);
184 
185    /* Dati privati */
186    virtual unsigned int iGetNumPrivData(void) const;
187    virtual unsigned int iGetPrivDataIdx(const char *s) const;
188    virtual doublereal dGetPrivData(unsigned int i) const;
189 
190    /* *******PER IL SOLUTORE PARALLELO******** */
191    /* Fornisce il tipo e la label dei nodi che sono connessi all'elemento
192       utile per l'assemblaggio della matrice di connessione fra i dofs */
GetConnectedNodes(std::vector<const Node * > & connectedNodes)193    virtual void GetConnectedNodes(std::vector<const Node *>& connectedNodes) const {
194      connectedNodes.resize(2);
195      connectedNodes[0] = pNode1;
196      connectedNodes[1] = pNode2;
197    };
198    /* ************************************************ */
199 };
200 
201 /* PlaneHingeJoint - end */
202 
203 
204 /* PlaneRotationJoint - begin */
205 
206 class PlaneRotationJoint : virtual public Elem, public Joint {
207  private:
208    /* Cerniera piana - asse di rotazione dato dall'asse 3 del sistema di
209     * riferimento della cerniera. Tale sistema e' noto relativamente ai due
210     * nodi. In particolare rispetto al nodo 1 la trasformazione dal sistema
211     * di riferimento della cerniera al sistema globale e': R1*R1h, mentre per
212     * il nodo 2 la medesima trasformazion e': R2*R2h.
213     * I vettori d1 e d2 esprimono, nel sistema di riferimento dei rispettivi
214     * nodi, la distanza della cerniera dai nodi stessi.
215     * I vettori F, M esprimono le reazioni vincolari di forza e coppia. */
216    const StructNode* pNode1;
217    const StructNode* pNode2;
218    Mat3x3 R1h;
219    Mat3x3 R2h;
220    Vec3 M;
221    mutable int NTheta;
222    mutable doublereal dTheta, dThetaWrapped;
223 #ifdef USE_NETCDF
224 	NcVar *Var_Phi;
225 	NcVar *Var_Omega;
226 #endif // USE_NETCDF
227 
228  protected:
229 	OrientationDescription od;
230 
231  public:
232    /* Costruttore non banale */
233    PlaneRotationJoint(unsigned int uL, const DofOwner* pDO,
234 		   const StructNode* pN1, const StructNode* pN2,
235 		   const Mat3x3& R1hTmp, const Mat3x3& R2hTmp,
236 	       const OrientationDescription& od,
237 	       flag fOut);
238 
239    /* Distruttore */
240    ~PlaneRotationJoint(void);
241 
242    /* Contributo al file di restart */
243    virtual std::ostream& Restart(std::ostream& out) const;
244 
245    /* Tipo di Joint */
GetJointType(void)246    virtual Joint::Type GetJointType(void) const {
247       return Joint::PLANEROTATION;
248    };
249 
iGetNumDof(void)250    virtual unsigned int iGetNumDof(void) const {
251       return 2;
252    };
253 
254    virtual std::ostream& DescribeDof(std::ostream& out,
255 		   const char *prefix = "",
256 		   bool bInitial = false) const;
257 
258    virtual void DescribeDof(std::vector<std::string>& desc,
259 		   bool bInitial = false, int i = -1) const;
260 
261    virtual std::ostream& DescribeEq(std::ostream& out,
262 		   const char *prefix = "",
263 		   bool bInitial = false) const;
264 
265    virtual void DescribeEq(std::vector<std::string>& desc,
266 		   bool bInitial = false, int i = -1) const;
267 
GetDofType(unsigned int i)268    DofOrder::Order GetDofType(unsigned int i) const {
269       ASSERT(i >= 0 && i < 2);
270       return DofOrder::ALGEBRAIC;
271    };
272 
273    virtual void SetValue(DataManager *pDM,
274 		   VectorHandler& X, VectorHandler& XP,
275 		   SimulationEntity::Hints *ph = 0);
276 
277 	virtual Hint *
278 	ParseHint(DataManager *pDM, const char *s) const;
279 
280 	virtual void AfterConvergence(const VectorHandler& X,
281 			const VectorHandler& XP);
282 
WorkSpaceDim(integer * piNumRows,integer * piNumCols)283    void WorkSpaceDim(integer* piNumRows, integer* piNumCols) const {
284       *piNumRows = 3+3+2;
285       *piNumCols = 3+3+2;
286    };
287 
288 
289    VariableSubMatrixHandler& AssJac(VariableSubMatrixHandler& WorkMat,
290 				    doublereal dCoef,
291 				    const VectorHandler& XCurr,
292 				    const VectorHandler& XPrimeCurr);
293    SubVectorHandler& AssRes(SubVectorHandler& WorkVec,
294 			    doublereal dCoef,
295 			    const VectorHandler& XCurr,
296 			    const VectorHandler& XPrimeCurr);
297 
298    DofOrder::Order GetEqType(unsigned int i) const;
299 
300    void OutputPrepare(OutputHandler &OH);
301    void Output(OutputHandler& OH) const;
302 
303 
304    /* funzioni usate nell'assemblaggio iniziale */
305 
iGetInitialNumDof(void)306    virtual unsigned int iGetInitialNumDof(void) const {
307       return 2+2;
308    };
InitialWorkSpaceDim(integer * piNumRows,integer * piNumCols)309    virtual void InitialWorkSpaceDim(integer* piNumRows,
310 				    integer* piNumCols) const {
311       *piNumRows = 3+3+3+3+2+2;
312       *piNumCols = 3+3+3+3+2+2;
313    };
314 
315    /* Contributo allo jacobiano durante l'assemblaggio iniziale */
316    VariableSubMatrixHandler& InitialAssJac(VariableSubMatrixHandler& WorkMat,
317 					   const VectorHandler& XCurr);
318 
319    /* Contributo al residuo durante l'assemblaggio iniziale */
320    SubVectorHandler& InitialAssRes(SubVectorHandler& WorkVec,
321 				   const VectorHandler& XCurr);
322 
323    /* Dati privati */
324    virtual unsigned int iGetNumPrivData(void) const;
325    virtual unsigned int iGetPrivDataIdx(const char *s) const;
326    virtual doublereal dGetPrivData(unsigned int i) const;
327 
328    /* *******PER IL SOLUTORE PARALLELO******** */
329    /* Fornisce il tipo e la label dei nodi che sono connessi all'elemento
330       utile per l'assemblaggio della matrice di connessione fra i dofs */
GetConnectedNodes(std::vector<const Node * > & connectedNodes)331    virtual void GetConnectedNodes(std::vector<const Node *>& connectedNodes) const {
332      connectedNodes.resize(2);
333      connectedNodes[0] = pNode1;
334      connectedNodes[1] = pNode2;
335    };
336    /* ************************************************ */
337 };
338 
339 /* PlaneRotationJoint - end */
340 
341 
342 /* AxialRotationJoint - begin */
343 
344 class AxialRotationJoint : virtual public Elem,
345 public Joint, public DriveOwner {
346  private:
347    /* Rotazione assiale attorno ad una cerniera piana -
348     * asse di rotazione dato dall'asse 3 del sistema di
349     * riferimento della cerniera. Tale sistema e' noto relativamente ai due
350     * nodi. In particolare rispetto al nodo 1 la trasformazione dal sistema
351     * di riferimento della cerniera al sistema globale e': R1*R1h, mentre per
352     * il nodo 2 la medesima trasformazione e': R2*R2h.
353     * I vettori d1 e d2 esprimono, nel sistema di riferimento dei rispettivi
354     * nodi, la distanza della cerniera dai nodi stessi.
355     * I vettori F, M esprimono le reazioni vincolari di forza e coppia.
356     * La velocita' di rotazione e' imposta attraverso un driver. */
357    const StructNode* pNode1;
358    const StructNode* pNode2;
359    Vec3 d1;
360    Mat3x3 R1h;
361    Vec3 d2;
362    Mat3x3 R2h;
363    Vec3 F;
364    Vec3 M;
365    mutable int NTheta;
366    mutable doublereal dTheta, dThetaWrapped;
367 
368 #ifdef USE_NETCDF
369 	NcVar *Var_Phi;
370 	NcVar *Var_Omega;
371 //	NcVar *Var_MFR;
372 //	NcVar *Var_MU;
373 #endif // USE_NETCDF
374 
375    /* friction related data */
376    BasicShapeCoefficient *const Sh_c;
377    BasicFriction *const fc;
378    const doublereal preF;
379    const doublereal r;
380    doublereal M3;
381    static const unsigned int NumSelfDof;
382    static const unsigned int NumDof;
383    /* end of friction related data */
384 
385  protected:
386 	OrientationDescription od;
387 
388  public:
389    /* Costruttore non banale */
390    AxialRotationJoint(unsigned int uL, const DofOwner* pDO,
391 		      const StructNode* pN1, const StructNode* pN2,
392 		      const Vec3& dTmp1, const Vec3& dTmp2,
393 		      const Mat3x3& R1hTmp, const Mat3x3& R2hTmp,
394 		      const DriveCaller* pDC,
395 		      const OrientationDescription& od,
396 		      flag fOut,
397 		      const doublereal rr = 0.,
398 		      const doublereal pref = 0.,
399 		      BasicShapeCoefficient *const sh = 0,
400 		      BasicFriction *const f = 0);
401 
402    /* Distruttore */
403    ~AxialRotationJoint(void);
404 
405    /* Tipo di Joint */
GetJointType(void)406    virtual Joint::Type GetJointType(void) const {
407       return Joint::AXIALROTATION;
408    };
409 
410    /* Contributo al file di restart */
411    virtual std::ostream& Restart(std::ostream& out) const;
412 
iGetNumDof(void)413    virtual unsigned int iGetNumDof(void) const {
414        unsigned int i = NumSelfDof;
415        if (fc) {
416            i+=fc->iGetNumDof();
417        }
418        return i;
419    };
420 
421    virtual std::ostream& DescribeDof(std::ostream& out,
422 		   const char *prefix = "",
423 		   bool bInitial = false) const;
424 
425    virtual void DescribeDof(std::vector<std::string>& desc,
426 		   bool bInitial = false, int i = -1) const;
427 
428    virtual std::ostream& DescribeEq(std::ostream& out,
429 		   const char *prefix = "",
430 		   bool bInitial = false) const;
431 
432    virtual void DescribeEq(std::vector<std::string>& desc,
433 		   bool bInitial = false, int i = -1) const;
434 
GetDofType(unsigned int i)435    DofOrder::Order GetDofType(unsigned int i) const {
436       ASSERT(i >= 0 && i < iGetNumDof());
437       if (i<NumSelfDof) {
438           return DofOrder::ALGEBRAIC;
439       } else {
440           return fc->GetDofType(i-NumSelfDof);
441       }
442    };
443 
444    virtual void SetValue(DataManager *pDM,
445 		   VectorHandler& X, VectorHandler& XP,
446 		   SimulationEntity::Hints *ph = 0);
447 
448 	virtual Hint *
449 	ParseHint(DataManager *pDM, const char *s) const;
450 
451 	virtual void AfterConvergence(const VectorHandler& X,
452 			const VectorHandler& XP);
453 
WorkSpaceDim(integer * piNumRows,integer * piNumCols)454    void WorkSpaceDim(integer* piNumRows, integer* piNumCols) const {
455       *piNumRows = NumDof;
456       *piNumCols = NumDof;
457       if (fc) {
458           *piNumRows += fc->iGetNumDof();
459           *piNumCols += fc->iGetNumDof();
460       }
461    };
462 
463 
464    VariableSubMatrixHandler& AssJac(VariableSubMatrixHandler& WorkMat,
465 				    doublereal dCoef,
466 				    const VectorHandler& XCurr,
467 				    const VectorHandler& XPrimeCurr);
468    SubVectorHandler& AssRes(SubVectorHandler& WorkVec,
469 			    doublereal dCoef,
470 			    const VectorHandler& XCurr,
471 			    const VectorHandler& XPrimeCurr);
472 
473    DofOrder::Order GetEqType(unsigned int i) const;
474 
475    void OutputPrepare(OutputHandler &OH);
476    void Output(OutputHandler& OH) const;
477 
478 
479    /* funzioni usate nell'assemblaggio iniziale */
480 
iGetInitialNumDof(void)481    virtual unsigned int iGetInitialNumDof(void) const {
482       return 11;
483    };
InitialWorkSpaceDim(integer * piNumRows,integer * piNumCols)484    virtual void InitialWorkSpaceDim(integer* piNumRows,
485 				    integer* piNumCols) const {
486       *piNumRows = 35;
487       *piNumCols = 35;
488    };
489 
490    /* Contributo allo jacobiano durante l'assemblaggio iniziale */
491    VariableSubMatrixHandler& InitialAssJac(VariableSubMatrixHandler& WorkMat,
492 					   const VectorHandler& XCurr);
493 
494    /* Contributo al residuo durante l'assemblaggio iniziale */
495    SubVectorHandler& InitialAssRes(SubVectorHandler& WorkVec,
496 				   const VectorHandler& XCurr);
497 
498    /* Dati privati */
499    virtual unsigned int iGetNumPrivData(void) const;
500    virtual unsigned int iGetPrivDataIdx(const char *s) const;
501    virtual doublereal dGetPrivData(unsigned int i) const;
502 
503    /* *******PER IL SOLUTORE PARALLELO******** */
504    /* Fornisce il tipo e la label dei nodi che sono connessi all'elemento
505       utile per l'assemblaggio della matrice di connessione fra i dofs */
GetConnectedNodes(std::vector<const Node * > & connectedNodes)506    virtual void GetConnectedNodes(std::vector<const Node *>& connectedNodes) const {
507      connectedNodes.resize(2);
508      connectedNodes[0] = pNode1;
509      connectedNodes[1] = pNode2;
510    };
511    /* ************************************************ */
512 };
513 
514 /* AxialRotationJoint - end */
515 
516 
517 /* PlanePinJoint - begin */
518 
519 /* Incastro con liberta' di rotazione su un asse */
520 
521 class PlanePinJoint : virtual public Elem, public Joint {
522  private:
523    const StructNode* pNode;
524    Vec3 X0;
525    Mat3x3 R0;
526    Vec3 d;
527    Mat3x3 Rh;
528    Vec3 F;
529    Vec3 M;
530    bool calcInitdTheta;
531    mutable int NTheta;
532    mutable doublereal dTheta, dThetaWrapped;
533 
534  public:
535    /* Costruttore non banale */
536    PlanePinJoint(unsigned int uL, const DofOwner* pDO,
537 		 const StructNode* pN,
538 		 const Vec3& X0Tmp, const Mat3x3& R0Tmp,
539 		 const Vec3& dTmp, const Mat3x3& RhTmp,
540 		 flag fOut, const bool _calcInitdTheta,
541 		 const doublereal initDTheta);
542 
543    ~PlanePinJoint(void);
544 
545    /* Tipo di Joint */
GetJointType(void)546    virtual Joint::Type GetJointType(void) const {
547       return Joint::PIN;
548    };
549 
550    /* legge lo sato iniziale*/
551    virtual void ReadInitialState(MBDynParser& HP);
552 
553    /* Contributo al file di restart */
554    virtual std::ostream& Restart(std::ostream& out) const;
555 
iGetNumDof(void)556    virtual unsigned int iGetNumDof(void) const {
557       return 5;
558    };
559 
560    virtual std::ostream& DescribeDof(std::ostream& out,
561 		   const char *prefix = "",
562 		   bool bInitial = false) const;
563 
564    virtual void DescribeDof(std::vector<std::string>& desc,
565 		   bool bInitial = false, int i = -1) const;
566 
567    virtual std::ostream& DescribeEq(std::ostream& out,
568 		   const char *prefix = "",
569 		   bool bInitial = false) const;
570 
571    virtual void DescribeEq(std::vector<std::string>& desc,
572 		   bool bInitial = false, int i = -1) const;
573 
GetDofType(unsigned int i)574    virtual DofOrder::Order GetDofType(unsigned int i) const {
575       ASSERT(i >= 0 && i < 5);
576       return DofOrder::ALGEBRAIC;
577    };
578 
579 	DofOrder::Order GetEqType(unsigned int i) const;
580 
581    virtual void SetValue(DataManager *pDM,
582 		   VectorHandler& X, VectorHandler& XP,
583 		   SimulationEntity::Hints *ph = 0);
584 
585 	virtual Hint *
586 	ParseHint(DataManager *pDM, const char *s) const;
587 
588 	virtual void AfterConvergence(const VectorHandler& X,
589 			const VectorHandler& XP);
590 
WorkSpaceDim(integer * piNumRows,integer * piNumCols)591    virtual void WorkSpaceDim(integer* piNumRows, integer* piNumCols) const {
592       *piNumRows = 11;
593       *piNumCols = 11;
594    };
595 
596    VariableSubMatrixHandler& AssJac(VariableSubMatrixHandler& WorkMat,
597 				    doublereal dCoef,
598 				    const VectorHandler& XCurr,
599 				    const VectorHandler& XPrimeCurr);
600    SubVectorHandler& AssRes(SubVectorHandler& WorkVec,
601 			    doublereal dCoef,
602 			    const VectorHandler& XCurr,
603 			    const VectorHandler& XPrimeCurr);
604 
605    virtual void Output(OutputHandler& OH) const;
606 
607 
608    /* funzioni usate nell'assemblaggio iniziale */
609 
iGetInitialNumDof(void)610    virtual unsigned int iGetInitialNumDof(void) const {
611       return 10;
612    };
InitialWorkSpaceDim(integer * piNumRows,integer * piNumCols)613    virtual void InitialWorkSpaceDim(integer* piNumRows,
614 				    integer* piNumCols) const {
615       *piNumRows = 22;
616       *piNumCols = 22;
617    };
618 
619    /* Contributo allo jacobiano durante l'assemblaggio iniziale */
620    VariableSubMatrixHandler& InitialAssJac(VariableSubMatrixHandler& WorkMat,
621 					   const VectorHandler& XCurr);
622 
623    /* Contributo al residuo durante l'assemblaggio iniziale */
624    SubVectorHandler& InitialAssRes(SubVectorHandler& WorkVec,
625 				   const VectorHandler& XCurr);
626 
627    /* Dati privati */
628    virtual unsigned int iGetNumPrivData(void) const;
629    virtual unsigned int iGetPrivDataIdx(const char *s) const;
630    virtual doublereal dGetPrivData(unsigned int i) const;
631 
632  /* *******PER IL SOLUTORE PARALLELO******** */
633    /* Fornisce il tipo e la label dei nodi che sono connessi all'elemento
634       utile per l'assemblaggio della matrice di connessione fra i dofs */
GetConnectedNodes(std::vector<const Node * > & connectedNodes)635    virtual void GetConnectedNodes(std::vector<const Node *>& connectedNodes) const {
636      connectedNodes.resize(1);
637      connectedNodes[0] = pNode;
638    };
639    /* ************************************************ */
640 };
641 
642 /* PlanePinJoint - end */
643 
644 #endif /* PLANEJ_H */
645 
646