1 // Created on: 1998-04-09
2 // Created by: Andre LIEUTIER
3 // Copyright (c) 1998-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
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.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <math_Matrix.hxx>
18 #include <math_Vector.hxx>
19 #include <math_Gauss.hxx>
23 #include <Plate_D1.hxx>
24 #include <Plate_D2.hxx>
25 #include <Plate_D3.hxx>
26 #include <Plate_Plate.hxx>
27 #include <Plate_PinpointConstraint.hxx>
28 #include <Plate_FreeGtoCConstraint.hxx>
30 #include <NLPlate_ListIteratorOfStackOfPlate.hxx>
32 #include <NLPlate_NLPlate.ixx>
35 NLPlate_NLPlate::NLPlate_NLPlate(const Handle(Geom_Surface)& InitialSurface) :
36 myInitialSurface(InitialSurface),OK(Standard_False) {}
37 //=======================================================================
39 void NLPlate_NLPlate::Load(const Handle(NLPlate_HGPPConstraint)& GConst)
41 if(!GConst.IsNull()) myHGPPConstraints.Append(GConst);
45 //=======================================================================
48 //=======================================================================
49 void NLPlate_NLPlate::Solve(const Standard_Integer ord, const Standard_Integer InitialConsraintOrder)
51 Standard_Integer maxOrder = MaxActiveConstraintOrder();
52 Standard_Integer ordre = ord;
53 if(ordre<maxOrder+2) ordre = maxOrder+2;
55 for(Standard_Integer iterOrder=InitialConsraintOrder;iterOrder<=maxOrder;iterOrder++)
57 if(!Iterate(iterOrder,ordre+iterOrder-maxOrder))
65 //=======================================================================
68 //=======================================================================
69 void NLPlate_NLPlate::Solve2(const Standard_Integer ord, const Standard_Integer InitialConsraintOrder)
71 Standard_Integer maxOrder = MaxActiveConstraintOrder();
72 Standard_Integer ordre = ord;
73 if(ordre<maxOrder+2) ordre = maxOrder+2;
76 mySOP.First().SetPolynomialPartOnly(Standard_True);
81 for(Standard_Integer iterOrder=InitialConsraintOrder;iterOrder<=maxOrder;iterOrder++)
83 if(!Iterate(iterOrder,ordre+iterOrder-maxOrder))
92 //=======================================================================
93 //function : IncrementalSolve
95 //=======================================================================
96 void NLPlate_NLPlate::IncrementalSolve(const Standard_Integer ord, const Standard_Integer /*InitialConsraintOrder*/,
97 const Standard_Integer NbIncrements, const Standard_Boolean UVSliding)
99 Standard_Integer maxOrder = MaxActiveConstraintOrder();
100 Standard_Integer ordre = ord;
101 if(ordre<maxOrder+2) ordre = maxOrder+2;
102 Standard_Real IncrementalLoad = 1.;
104 for(Standard_Integer increment=0;increment < NbIncrements;increment++)
106 IncrementalLoad = 1./Standard_Real(NbIncrements-increment);
107 // for(Standard_Integer iterOrder=InitialConsraintOrder;iterOrder<=maxOrder;iterOrder++)
108 Standard_Integer iterOrder=maxOrder;
110 if(!Iterate(iterOrder,ordre+iterOrder-maxOrder,IncrementalLoad))
116 if(UVSliding) ConstraintsSliding();
121 //=======================================================================
122 Standard_Boolean NLPlate_NLPlate::IsDone() const
126 //=======================================================================
128 void NLPlate_NLPlate::destroy()
132 //=======================================================================
134 void NLPlate_NLPlate::Init()
137 myHGPPConstraints.Clear();
139 //=======================================================================
141 gp_XYZ NLPlate_NLPlate::Evaluate(const gp_XY& point2d) const
143 return EvaluateDerivative(point2d,0,0);
145 //=======================================================================
147 gp_XYZ NLPlate_NLPlate::EvaluateDerivative(const gp_XY& point2d,const Standard_Integer iu,const Standard_Integer iv) const
149 gp_XYZ Value(0.,0.,0.);
151 Value = myInitialSurface->Value(point2d.X(),point2d.Y()).XYZ();
153 Value = myInitialSurface->DN(point2d.X(),point2d.Y(),iu,iv).XYZ();
155 for(NLPlate_ListIteratorOfStackOfPlate SI(mySOP);SI.More();SI.Next())
157 if(SI.Value().IsDone())
158 Value += SI.Value().EvaluateDerivative(point2d,iu,iv);
162 //=======================================================================
164 Standard_Integer NLPlate_NLPlate::Continuity() const
166 Standard_Integer cont ;
167 for( cont=-1; cont<10;cont++)
169 if(!(myInitialSurface->IsCNu(cont+1)&&myInitialSurface->IsCNv(cont+1)))break;
171 for(NLPlate_ListIteratorOfStackOfPlate SI(mySOP);SI.More();SI.Next())
173 if((SI.Value().IsDone())&&(cont > SI.Value().Continuity())) cont = SI.Value().Continuity();
177 //=======================================================================
179 Standard_Boolean NLPlate_NLPlate::Iterate(const Standard_Integer ConstraintOrder,
180 const Standard_Integer ResolutionOrder,
181 const Standard_Real IncrementalLoading)
183 Plate_Plate EmptyPlate;
184 mySOP.Prepend(EmptyPlate);
185 Plate_Plate &TopP = mySOP.First();
186 for(Standard_Integer index =1; index <= myHGPPConstraints.Length(); index++)
188 const Handle(NLPlate_HGPPConstraint) &HGPP = myHGPPConstraints(index);
189 Standard_Integer Order = HGPP->ActiveOrder();
190 if(ConstraintOrder<Order) Order = ConstraintOrder;
191 const gp_XY &UV = HGPP->UV();
193 if((Order >=0)&& HGPP->IsG0())
195 if(HGPP->IncrementalLoadAllowed())
196 TopP.Load(Plate_PinpointConstraint(UV, (HGPP->G0Target()-Evaluate(UV))*IncrementalLoading));
198 TopP.Load(Plate_PinpointConstraint(UV, HGPP->G0Target()-Evaluate(UV)));
201 if((IncrementalLoading != 1.) && HGPP->IncrementalLoadAllowed() && (Order>=1))
207 Plate_D1 D1S(EvaluateDerivative(UV,1,0),EvaluateDerivative(UV,0,1));
208 TopP.Load(Plate_FreeGtoCConstraint(UV,D1S,HGPP->G1Target(),IncrementalLoading,HGPP->Orientation()));
213 Plate_D1 D1S(EvaluateDerivative(UV,1,0),EvaluateDerivative(UV,0,1));
214 Plate_D2 D2S(EvaluateDerivative(UV,2,0),EvaluateDerivative(UV,1,1),EvaluateDerivative(UV,0,2));
215 TopP.Load(Plate_FreeGtoCConstraint(UV,D1S,HGPP->G1Target(),D2S,HGPP->G2Target(),
216 IncrementalLoading,HGPP->Orientation()));
221 Plate_D1 D1S(EvaluateDerivative(UV,1,0),EvaluateDerivative(UV,0,1));
222 Plate_D2 D2S(EvaluateDerivative(UV,2,0),EvaluateDerivative(UV,1,1),EvaluateDerivative(UV,0,2));
223 Plate_D3 D3S(EvaluateDerivative(UV,3,0),EvaluateDerivative(UV,2,1),
224 EvaluateDerivative(UV,1,2),EvaluateDerivative(UV,0,3));
225 TopP.Load(Plate_FreeGtoCConstraint(UV,D1S,HGPP->G1Target(),D2S,HGPP->G2Target(),D3S,HGPP->G3Target(),
226 IncrementalLoading,HGPP->Orientation()));
239 Plate_D1 D1S(EvaluateDerivative(UV,1,0),EvaluateDerivative(UV,0,1));
240 TopP.Load(Plate_FreeGtoCConstraint(UV,D1S,HGPP->G1Target()));
245 Plate_D1 D1S(EvaluateDerivative(UV,1,0),EvaluateDerivative(UV,0,1));
246 Plate_D2 D2S(EvaluateDerivative(UV,2,0),EvaluateDerivative(UV,1,1),EvaluateDerivative(UV,0,2));
247 TopP.Load(Plate_FreeGtoCConstraint(UV,D1S,HGPP->G1Target(),D2S,HGPP->G2Target()));
252 Plate_D1 D1S(EvaluateDerivative(UV,1,0),EvaluateDerivative(UV,0,1));
253 Plate_D2 D2S(EvaluateDerivative(UV,2,0),EvaluateDerivative(UV,1,1),EvaluateDerivative(UV,0,2));
254 Plate_D3 D3S(EvaluateDerivative(UV,3,0),EvaluateDerivative(UV,2,1),
255 EvaluateDerivative(UV,1,2),EvaluateDerivative(UV,0,3));
256 TopP.Load(Plate_FreeGtoCConstraint(UV,D1S,HGPP->G1Target(),D2S,HGPP->G2Target(),D3S,HGPP->G3Target()));
265 TopP.SolveTI(ResolutionOrder);
269 return Standard_False;
272 return Standard_True;
274 //=======================================================================
276 void NLPlate_NLPlate::ConstraintsSliding(const Standard_Integer NbIterations)
278 for(Standard_Integer index =1; index <= myHGPPConstraints.Length(); index++)
280 const Handle(NLPlate_HGPPConstraint) &HGPP = myHGPPConstraints(index);
281 if(HGPP->UVFreeSliding() && HGPP->IsG0())
283 gp_XY UV = HGPP->UV();
284 gp_XYZ P0 = Evaluate(UV);
285 const gp_XYZ P1 = HGPP->G0Target();
286 for(Standard_Integer iter=1;iter<=NbIterations;iter++)
288 // on itere au premier ordre, ce qui suffit si on est assez pres de la surface ??
290 gp_XYZ Du = EvaluateDerivative(UV,1,0);
291 gp_XYZ Dv = EvaluateDerivative(UV,0,1);
292 math_Matrix mat(0,1,0,1);
297 math_Gauss gauss(mat);
298 if(!gauss.IsDone()) break;
300 math_Vector vec(0,1);
303 math_Vector sol(0,1);
304 gauss.Solve(vec,sol);
305 UV.SetX(UV.X()+sol(0));
306 UV.SetY(UV.Y()+sol(1));
314 //=======================================================================
316 Standard_Integer NLPlate_NLPlate::MaxActiveConstraintOrder() const
318 Standard_Integer MaxOrder = -1;
319 for(Standard_Integer index =1; index <= myHGPPConstraints.Length(); index++)
321 Standard_Integer CAOrder = myHGPPConstraints(index)->ActiveOrder();
322 if(CAOrder > MaxOrder) MaxOrder = CAOrder;