0031035: Coding - uninitialized class fields reported by Visual Studio Code Analysis
[occt.git] / src / FairCurve / FairCurve_EnergyOfMVC.cxx
1 // Created on: 1996-04-01
2 // Created by: Philippe MANGIN
3 // Copyright (c) 1996-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <FairCurve_BattenLaw.hxx>
19 #include <FairCurve_EnergyOfMVC.hxx>
20 #include <math_GaussSetIntegration.hxx>
21 #include <math_IntegerVector.hxx>
22 #include <Standard_DomainError.hxx>
23 #include <TColgp_HArray1OfPnt2d.hxx>
24
25 //=====================================================================================
26 FairCurve_EnergyOfMVC::FairCurve_EnergyOfMVC(const Standard_Integer BSplOrder,
27                                              const Handle(TColStd_HArray1OfReal)& FlatKnots,
28                                              const Handle(TColgp_HArray1OfPnt2d)& Poles,
29                                              const Standard_Integer ContrOrder1,
30                                              const Standard_Integer ContrOrder2,
31                                              const FairCurve_BattenLaw& Law,
32                                              const Standard_Real PhysicalRatio,
33                                              const Standard_Real LengthSliding,
34                                              const Standard_Boolean FreeSliding,
35                                              const Standard_Real Angle1,
36                                              const Standard_Real Angle2,
37                                              const Standard_Real Curvature1,
38                                              const Standard_Real Curvature2 )
39 //=====================================================================================
40                          : FairCurve_Energy( Poles, ContrOrder1,  ContrOrder2,
41                                              FreeSliding,  Angle1, Angle2, 
42                                              BSplOrder-1, Curvature1, Curvature2),
43                            MyLengthSliding(LengthSliding),
44                            OriginalSliding(LengthSliding),
45                            MyBattenLaw(Law), 
46                            MyPhysicalRatio(PhysicalRatio),
47                            MyTension(BSplOrder, FlatKnots, Poles, 1, LengthSliding,  Law, FreeSliding, Standard_True),
48                            MySagging(BSplOrder, FlatKnots, Poles, 1, Law, FreeSliding),
49                            MyJerk(   BSplOrder, FlatKnots, Poles, 1, Law, FreeSliding),
50                            MyStatus(FairCurve_OK)
51 {
52   Standard_DomainError_Raise_if(PhysicalRatio < 0 || PhysicalRatio > 1, 
53                                 "FairCurve_EnergyOfMVC: PhysicalRatio error" );
54 }
55
56
57 //=====================================================================================
58 void FairCurve_EnergyOfMVC::ComputePoles(const math_Vector& X)
59 //=====================================================================================
60 {
61  FairCurve_Energy::ComputePoles(X);
62  if (MyWithAuxValue) { MyLengthSliding = X(X.Upper()); }
63 }
64
65
66 //=====================================================================================
67 Standard_Boolean FairCurve_EnergyOfMVC::Variable(math_Vector& X) const 
68 //=====================================================================================
69 {
70  Standard_Boolean Ok;
71  Ok = FairCurve_Energy::Variable(X);
72  if (MyWithAuxValue) { X(X.Upper()) = MyLengthSliding; }
73  return Ok;
74 }
75
76
77 //=====================================================================================
78 Standard_Boolean FairCurve_EnergyOfMVC::Compute(const Standard_Integer DerivativeOrder,
79                                                       math_Vector& Result)
80 //=====================================================================================
81 {
82   math_Vector Debut(1, 1, 0.),  Fin(1, 1, 1.);
83   math_IntegerVector MyOrder(1, 1, 24);
84   Standard_Boolean Ok=Standard_False;
85
86 // Blindage contre les longueur de glissement trop exotique
87   MyStatus = FairCurve_OK;
88   if ( MyLengthSliding > 10*OriginalSliding ) {
89     MyStatus =  FairCurve_InfiniteSliding;
90     return Standard_False;
91 }
92    if ( MyLengthSliding < OriginalSliding/100  )  {
93      MyLengthSliding =  OriginalSliding/100;
94    }
95
96 // Mise a jour des objets sous-fonction
97   MyTension.SetDerivativeOrder(DerivativeOrder);
98   MyTension.SetLengthSliding(MyLengthSliding);
99   MySagging.SetDerivativeOrder(DerivativeOrder);
100   MyJerk.SetDerivativeOrder(DerivativeOrder);
101   MyBattenLaw.SetSliding(MyLengthSliding);
102
103 //  Integrations
104   
105   // on decoupe afin d'avoir au moins 2 points d'integration par poles
106   // 24 points de Gauss => 12 poles maximum.
107
108   Standard_Integer NbInterv = (MyPoles->Length()-1) / 12 + 1, ii;
109   Standard_Real Delta = 1./ NbInterv;
110   Result.Init(0);
111
112   if (MyPhysicalRatio <= 1.e-12) {
113
114  // Cas purement non physique --------------------------
115
116     for (ii=1; ii<=NbInterv; ii++) {
117       Debut(1) = (ii-1)*Delta;
118       Fin(1) = ii*Delta;
119     
120       math_GaussSetIntegration SumTension(MyTension, Debut, Fin, MyOrder); 
121       Ok = SumTension.IsDone();
122       if (!Ok) return Ok;
123
124       math_GaussSetIntegration SumJerk(MyJerk, Debut, Fin, MyOrder);
125       Ok = SumJerk.IsDone();
126       if (!Ok) return Ok;
127
128       Result += SumJerk.Value() + SumTension.Value(); // Cas purement non physique
129     }
130   }
131   else {
132  // Cas mixte  --------------------------
133     for (ii=1; ii<=NbInterv; ii++) {
134       Debut(1) = (ii-1)*Delta;
135       Fin(1) = ii*Delta;
136     
137       math_GaussSetIntegration SumTension(MyTension, Debut, Fin, MyOrder); 
138       Ok = SumTension.IsDone();
139       if (!Ok) return Ok;
140
141       math_GaussSetIntegration SumSagging(MySagging, Debut, Fin, MyOrder);
142       Ok = SumSagging.IsDone();
143       if (!Ok) return Ok;
144
145       math_GaussSetIntegration SumJerk(MyJerk, Debut, Fin, MyOrder);
146       Ok = SumJerk.IsDone();
147       if (!Ok) return Ok;
148
149       Result += SumJerk.Value()    * (1-MyPhysicalRatio) 
150               + SumSagging.Value() *   MyPhysicalRatio
151               + SumTension.Value();
152     }
153   }
154    
155   return Ok;
156 }