Integration of OCCT 6.5.0 from SVN
[occt.git] / src / FairCurve / FairCurve_EnergyOfMVC.cxx
diff --git a/src/FairCurve/FairCurve_EnergyOfMVC.cxx b/src/FairCurve/FairCurve_EnergyOfMVC.cxx
new file mode 100755 (executable)
index 0000000..5e13aa5
--- /dev/null
@@ -0,0 +1,142 @@
+// File:       FairCurve_EnergyOfMVC.cxx
+// Created:    Mon Apr  1 09:10:45 1996
+// Author:     Philippe MANGIN
+
+#include <FairCurve_EnergyOfMVC.ixx>
+
+#include <math_IntegerVector.hxx>
+#include <math_GaussSetIntegration.hxx>
+#include <TColgp_HArray1OfPnt2d.hxx>
+
+//=====================================================================================
+FairCurve_EnergyOfMVC::FairCurve_EnergyOfMVC(const Standard_Integer BSplOrder,
+                                            const Handle(TColStd_HArray1OfReal)& FlatKnots,
+                                            const Handle(TColgp_HArray1OfPnt2d)& Poles,
+                                            const Standard_Integer ContrOrder1,
+                                            const Standard_Integer ContrOrder2,
+                                            const FairCurve_BattenLaw& Law,
+                                            const Standard_Real PhysicalRatio,
+                                            const Standard_Real LengthSliding,
+                                            const Standard_Boolean FreeSliding,
+                                            const Standard_Real Angle1,
+                                            const Standard_Real Angle2,
+                                            const Standard_Real Curvature1,
+                                            const Standard_Real Curvature2 )
+//=====================================================================================
+                         : FairCurve_Energy( Poles, ContrOrder1,  ContrOrder2,
+                                            FreeSliding,  Angle1, Angle2, 
+                                            BSplOrder-1, Curvature1, Curvature2),
+                           MyLengthSliding(LengthSliding),
+                          OriginalSliding(LengthSliding),
+                          MyFreeSliding(FreeSliding),
+                           MyBattenLaw(Law), 
+                           MyPhysicalRatio(PhysicalRatio),
+                           MyTension(BSplOrder, FlatKnots, Poles, 1, LengthSliding,  Law, FreeSliding, Standard_True),
+                           MySagging(BSplOrder, FlatKnots, Poles, 1, Law, FreeSliding),
+                          MyJerk(   BSplOrder, FlatKnots, Poles, 1, Law, FreeSliding)
+{
+  Standard_DomainError_Raise_if(PhysicalRatio < 0 || PhysicalRatio > 1, 
+                               "FairCurve_EnergyOfMVC: PhysicalRatio error" );
+}
+
+
+//=====================================================================================
+void FairCurve_EnergyOfMVC::ComputePoles(const math_Vector& X)
+//=====================================================================================
+{
+ FairCurve_Energy::ComputePoles(X);
+ if (MyWithAuxValue) { MyLengthSliding = X(X.Upper()); }
+}
+
+
+//=====================================================================================
+Standard_Boolean FairCurve_EnergyOfMVC::Variable(math_Vector& X) const 
+//=====================================================================================
+{
+ Standard_Boolean Ok;
+ Ok = FairCurve_Energy::Variable(X);
+ if (MyWithAuxValue) { X(X.Upper()) = MyLengthSliding; }
+ return Ok;
+}
+
+
+//=====================================================================================
+Standard_Boolean FairCurve_EnergyOfMVC::Compute(const Standard_Integer DerivativeOrder,
+                                                     math_Vector& Result)
+//=====================================================================================
+{
+  math_Vector Debut(1, 1, 0.),  Fin(1, 1, 1.);
+  math_IntegerVector MyOrder(1, 1, 24);
+  Standard_Boolean Ok=Standard_False;
+
+// Blindage contre les longueur de glissement trop exotique
+  MyStatus = FairCurve_OK;
+  if ( MyLengthSliding > 10*OriginalSliding ) {
+    MyStatus =  FairCurve_InfiniteSliding;
+    return Standard_False;
+}
+   if ( MyLengthSliding < OriginalSliding/100  )  {
+     MyLengthSliding =  OriginalSliding/100;
+   }
+
+// Mise a jour des objets sous-fonction
+  MyTension.SetDerivativeOrder(DerivativeOrder);
+  MyTension.SetLengthSliding(MyLengthSliding);
+  MySagging.SetDerivativeOrder(DerivativeOrder);
+  MyJerk.SetDerivativeOrder(DerivativeOrder);
+  MyBattenLaw.SetSliding(MyLengthSliding);
+
+//  Integrations
+  
+  // on decoupe afin d'avoir au moins 2 points d'integration par poles
+  // 24 points de Gauss => 12 poles maximum.
+
+  Standard_Integer NbInterv = (MyPoles->Length()-1) / 12 + 1, ii;
+  Standard_Real Delta = 1./ NbInterv;
+  Result.Init(0);
+
+  if (MyPhysicalRatio <= 1.e-12) {
+
+ // Cas purement non physique --------------------------
+
+    for (ii=1; ii<=NbInterv; ii++) {
+      Debut(1) = (ii-1)*Delta;
+      Fin(1) = ii*Delta;
+    
+      math_GaussSetIntegration SumTension(MyTension, Debut, Fin, MyOrder); 
+      Ok = SumTension.IsDone();
+      if (!Ok) return Ok;
+
+      math_GaussSetIntegration SumJerk(MyJerk, Debut, Fin, MyOrder);
+      Ok = SumJerk.IsDone();
+      if (!Ok) return Ok;
+
+      Result += SumJerk.Value() + SumTension.Value(); // Cas purement non physique
+    }
+  }
+  else {
+ // Cas mixte  --------------------------
+    for (ii=1; ii<=NbInterv; ii++) {
+      Debut(1) = (ii-1)*Delta;
+      Fin(1) = ii*Delta;
+    
+      math_GaussSetIntegration SumTension(MyTension, Debut, Fin, MyOrder); 
+      Ok = SumTension.IsDone();
+      if (!Ok) return Ok;
+
+      math_GaussSetIntegration SumSagging(MySagging, Debut, Fin, MyOrder);
+      Ok = SumSagging.IsDone();
+      if (!Ok) return Ok;
+
+      math_GaussSetIntegration SumJerk(MyJerk, Debut, Fin, MyOrder);
+      Ok = SumJerk.IsDone();
+      if (!Ok) return Ok;
+
+      Result += SumJerk.Value()    * (1-MyPhysicalRatio) 
+             + SumSagging.Value() *   MyPhysicalRatio
+             + SumTension.Value();
+    }
+  }
+   
+  return Ok;
+}