1 // Created on: 1996-07-02
2 // Created by: Joelle CHAUVET
3 // Copyright (c) 1996-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
9 // under the terms of the GNU Lesser General Public 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 // Modified: Wed Jan 15 10:04:41 1997
19 // G1135 : Methods CutSense with criterion, Coefficients,
20 // CritValue, SetCritValue
21 // Modified: Tue May 19 10:22:44 1998
22 // by: Joelle CHAUVET / Jean-Marc LACHAUME
23 // Initialisation de myCritValue pour OSF
25 #include <AdvApp2Var_Patch.ixx>
26 #include <AdvApp2Var_Node.hxx>
27 #include <AdvApp2Var_Iso.hxx>
29 #include <TColgp_HArray2OfPnt.hxx>
30 #include <TColgp_Array2OfPnt.hxx>
31 #include <TColStd_HArray1OfInteger.hxx>
32 #include <TColStd_HArray1OfReal.hxx>
33 #include <TColStd_HArray2OfReal.hxx>
34 #include <TColStd_Array2OfReal.hxx>
35 #include <Convert_GridPolynomialToPoles.hxx>
36 #include <Standard_ConstructionError.hxx>
38 #include <AdvApp2Var_ApproxF2var.hxx>
39 #include <AdvApp2Var_MathBase.hxx>
42 //============================================================================
43 //function : AdvApp2Var_Patch
45 //============================================================================
47 AdvApp2Var_Patch::AdvApp2Var_Patch() :
56 myApprIsDone(Standard_False),
57 myHasResult(Standard_False),
59 myDiscIsDone(Standard_False),
64 //============================================================================
65 //function : AdvApp2Var_Patch
67 //============================================================================
69 AdvApp2Var_Patch::AdvApp2Var_Patch(const Standard_Real U0,
70 const Standard_Real U1,
71 const Standard_Real V0,
72 const Standard_Real V1,
73 const Standard_Integer iu,
74 const Standard_Integer iv) :
83 myApprIsDone(Standard_False),
84 myHasResult(Standard_False),
86 myDiscIsDone(Standard_False),
91 //============================================================================
92 //function : IsDiscretised
94 //============================================================================
96 Standard_Boolean AdvApp2Var_Patch::IsDiscretised() const
101 //============================================================================
102 //function : Discretise
104 //============================================================================
106 void AdvApp2Var_Patch::Discretise(const AdvApp2Var_Context& Conditions,
107 const AdvApp2Var_Framework& Constraints,
108 const AdvApp2Var_EvaluatorFunc2Var& Func)
111 // data stored in the Context
112 Standard_Integer NDIMEN, ISOFAV;
113 NDIMEN = Conditions.TotalDimension();
114 // Attention : works only for 3D
115 ISOFAV = Conditions.FavorIso();
117 // data related to the patch to be discretized
118 Standard_Integer NBPNTU, NBPNTV;
119 Standard_Integer IORDRU = myOrdInU, IORDRV = myOrdInV;
120 Handle (TColStd_HArray1OfReal) HUROOT = Conditions.URoots();
121 Handle (TColStd_HArray1OfReal) HVROOT = Conditions.VRoots();
122 Standard_Real * UROOT;
123 UROOT = (Standard_Real *) &HUROOT ->ChangeArray1()(HUROOT ->Lower());
124 NBPNTU = (Conditions.URoots())->Length();
125 if (myOrdInU>-1) NBPNTU -= 2;
126 Standard_Real * VROOT;
127 VROOT = (Standard_Real *) &HVROOT ->ChangeArray1()(HVROOT ->Lower());
128 NBPNTV = (Conditions.VRoots())->Length();
129 if (myOrdInV>-1) NBPNTV -= 2;
131 // data stored in the Framework Constraints cad Nodes and Isos
132 // C1, C2, C3 and C4 are dimensionnes in FORTRAN with (NDIMEN,IORDRU+2,IORDRV+2)
133 Standard_Integer SIZE=NDIMEN*(IORDRU+2)*(IORDRV+2);
134 Handle (TColStd_HArray1OfReal) HCOINS =
135 new TColStd_HArray1OfReal(1,SIZE*4);
138 Standard_Integer iu,iv;
139 Standard_Real du=(myU1-myU0)/2,dv=(myV1-myV0)/2,rho,valnorm;
141 for (iu=0;iu<=myOrdInU;iu++) {
142 for (iv=0;iv<=myOrdInV;iv++) {
143 // factor of normalization
144 rho = pow(du,iu)*pow(dv,iv);
146 // F(U0,V0) and its derivatives normalized on (-1,1)
147 valnorm = rho * ((Constraints.Node(myU0,myV0)).Point(iu,iv)).X();
148 HCOINS->SetValue( 1+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv , valnorm );
149 valnorm = rho * ((Constraints.Node(myU0,myV0)).Point(iu,iv)).Y();
150 HCOINS->SetValue( 2+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm );
151 valnorm = rho * ((Constraints.Node(myU0,myV0)).Point(iu,iv)).Z();
152 HCOINS->SetValue( 3+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm );
154 // F(U1,V0) and its derivatives normalized on (-1,1)
155 valnorm = rho * ((Constraints.Node(myU1,myV0)).Point(iu,iv)).X();
156 HCOINS->SetValue( SIZE+1+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm );
157 valnorm = rho * ((Constraints.Node(myU1,myV0)).Point(iu,iv)).Y();
158 HCOINS->SetValue( SIZE+2+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm );
159 valnorm = rho * ((Constraints.Node(myU1,myV0)).Point(iu,iv)).Z();
160 HCOINS->SetValue( SIZE+3+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm );
162 // F(U0,V1) and its derivatives normalized on (-1,1)
163 valnorm = rho * ((Constraints.Node(myU0,myV1)).Point(iu,iv)).X();
164 HCOINS->SetValue( 2*SIZE+1+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm );
165 valnorm = rho * ((Constraints.Node(myU0,myV1)).Point(iu,iv)).Y();
166 HCOINS->SetValue( 2*SIZE+2+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm );
167 valnorm = rho * ((Constraints.Node(myU0,myV1)).Point(iu,iv)).Z();
168 HCOINS->SetValue( 2*SIZE+3+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm );
170 // F(U1,V1) and its derivatives normalized on (-1,1)
171 valnorm = rho * ((Constraints.Node(myU1,myV1)).Point(iu,iv)).X();
172 HCOINS->SetValue( 3*SIZE+1+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm );
173 valnorm = rho * ((Constraints.Node(myU1,myV1)).Point(iu,iv)).Y();
174 HCOINS->SetValue( 3*SIZE+2+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm );
175 valnorm = rho * ((Constraints.Node(myU1,myV1)).Point(iu,iv)).Z();
176 HCOINS->SetValue( 3*SIZE+3+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm );
180 (Standard_Real *) &HCOINS ->ChangeArray1()(HCOINS ->Lower());
181 Standard_Real *C2 = C1 + SIZE;
182 Standard_Real *C3 = C2 + SIZE;
183 Standard_Real *C4 = C3 + SIZE;
185 // tables SomTab and Diftab of discretization of isos U=U0 and U=U1
186 // SU0, SU1, DU0 and DU1 are dimensioned in FORTRAN to
187 // (1+NBPNTV/2)*NDIMEN*(IORDRU+1)
189 SIZE = (1+NBPNTV/2)*NDIMEN;
191 Handle (TColStd_HArray1OfReal) HSU0
192 = new TColStd_HArray1OfReal(1,SIZE*(IORDRU+1));
193 HSU0 ->ChangeArray1() =
194 ( (Constraints.IsoU(myU0,myV0,myV1)).SomTab() ) ->Array1();
196 Handle (TColStd_HArray1OfReal) HDU0
197 = new TColStd_HArray1OfReal(1,SIZE*(IORDRU+1));
198 HDU0 ->ChangeArray1() =
199 ( (Constraints.IsoU(myU0,myV0,myV1)).DifTab() ) ->Array1();
201 Handle (TColStd_HArray1OfReal) HSU1
202 = new TColStd_HArray1OfReal(1,SIZE*(IORDRU+1));
203 HSU1 ->ChangeArray1() =
204 ( (Constraints.IsoU(myU1,myV0,myV1)).SomTab() ) ->Array1();
206 Handle (TColStd_HArray1OfReal) HDU1
207 = new TColStd_HArray1OfReal(1,SIZE*(IORDRU+1));
208 HDU1 ->ChangeArray1() =
209 ( (Constraints.IsoU(myU1,myV0,myV1)).DifTab() ) ->Array1();
212 Standard_Integer ideb1,ideb2,ideb3,ideb4,jj;
213 for (iu=1;iu<=IORDRU;iu++) {
215 ideb1 = HSU0->Lower() + iu*SIZE -1;
216 ideb2 = HDU0->Lower() + iu*SIZE -1;
217 ideb3 = HSU1->Lower() + iu*SIZE -1;
218 ideb4 = HDU1->Lower() + iu*SIZE -1;
219 for (jj=1;jj<=SIZE;jj++) {
220 HSU0 ->SetValue(ideb1+jj,rho*HSU0->Value(ideb1+jj));
221 HDU0 ->SetValue(ideb2+jj,rho*HDU0->Value(ideb2+jj));
222 HSU1 ->SetValue(ideb3+jj,rho*HSU1->Value(ideb3+jj));
223 HDU1 ->SetValue(ideb4+jj,rho*HDU1->Value(ideb4+jj));
228 (Standard_Real *) &HSU0 ->ChangeArray1()(HSU0 ->Lower());
230 (Standard_Real *) &HDU0 ->ChangeArray1()(HDU0 ->Lower());
232 (Standard_Real *) &HSU1 ->ChangeArray1()(HSU1 ->Lower());
234 (Standard_Real *) &HDU1 ->ChangeArray1()(HDU1 ->Lower());
236 // tables SomTab and Diftab of discretization of isos V=V0 and V=V1
237 // SU0, SU1, DU0 and DU1 are dimensioned in FORTRAN at
238 // (1+NBPNTU/2)*NDIMEN*(IORDRV+1)
240 SIZE = (1+NBPNTU/2)*NDIMEN;
242 Handle (TColStd_HArray1OfReal) HSV0
243 = new TColStd_HArray1OfReal(1,SIZE*(IORDRV+1));
244 HSV0 ->ChangeArray1() =
245 ( (Constraints.IsoV(myU0,myU1,myV0)).SomTab() ) ->Array1();
247 Handle (TColStd_HArray1OfReal) HDV0
248 = new TColStd_HArray1OfReal(1,SIZE*(IORDRV+1));
249 HDV0 ->ChangeArray1() =
250 ( (Constraints.IsoV(myU0,myU1,myV0)).DifTab() ) ->Array1();
252 Handle (TColStd_HArray1OfReal) HSV1
253 = new TColStd_HArray1OfReal(1,SIZE*(IORDRV+1));
254 HSV1 ->ChangeArray1() =
255 ( (Constraints.IsoV(myU0,myU1,myV1)).SomTab() ) ->Array1();
257 Handle (TColStd_HArray1OfReal) HDV1
258 = new TColStd_HArray1OfReal(1,SIZE*(IORDRV+1));
259 HDV1 ->ChangeArray1() =
260 ( (Constraints.IsoV(myU0,myU1,myV1)).DifTab() ) ->Array1();
263 for (iv=1;iv<=IORDRV;iv++) {
265 ideb1 = HSV0->Lower() + iv*SIZE -1;
266 ideb2 = HDV0->Lower() + iv*SIZE -1;
267 ideb3 = HSV1->Lower() + iv*SIZE -1;
268 ideb4 = HDV1->Lower() + iv*SIZE -1;
269 for (jj=1;jj<=SIZE;jj++) {
270 HSV0 ->SetValue(ideb1+jj,rho*HSV0->Value(ideb1+jj));
271 HDV0 ->SetValue(ideb2+jj,rho*HDV0->Value(ideb2+jj));
272 HSV1 ->SetValue(ideb3+jj,rho*HSV1->Value(ideb3+jj));
273 HDV1 ->SetValue(ideb4+jj,rho*HDV1->Value(ideb4+jj));
278 (Standard_Real *) &HSV0 ->ChangeArray1()(HSV0 ->Lower());
280 (Standard_Real *) &HDV0 ->ChangeArray1()(HDV0 ->Lower());
282 (Standard_Real *) &HSV1 ->ChangeArray1()(HSV1 ->Lower());
284 (Standard_Real *) &HDV1 ->ChangeArray1()(HDV1 ->Lower());
286 // SOSOTB and DIDITB are dimensioned in FORTRAN at
287 // (0:NBPNTU/2,0:NBPNTV/2,NDIMEN)
289 SIZE=(1+NBPNTU/2)*(1+NBPNTV/2)*NDIMEN;
291 Handle (TColStd_HArray1OfReal) HSOSO =
292 new TColStd_HArray1OfReal(1,SIZE);
293 Standard_Real *SOSOTB =
294 (Standard_Real *) &HSOSO ->ChangeArray1()(HSOSO ->Lower());
296 Handle (TColStd_HArray1OfReal) HDIDI =
297 new TColStd_HArray1OfReal(1,SIZE);
298 Standard_Real *DIDITB =
299 (Standard_Real *) &HDIDI ->ChangeArray1()(HDIDI ->Lower());
302 // SODITB and DISOTB are dimensioned in FORTRAN at
303 // (1:NBPNTU/2,1:NBPNTV/2,NDIMEN)
305 SIZE=(NBPNTU/2)*(NBPNTV/2)*NDIMEN;
307 Handle (TColStd_HArray1OfReal) HSODI =
308 new TColStd_HArray1OfReal(1,SIZE);
309 Standard_Real *SODITB =
310 (Standard_Real *) &HSODI ->ChangeArray1()(HSODI ->Lower());
312 Handle (TColStd_HArray1OfReal) HDISO =
313 new TColStd_HArray1OfReal(1,SIZE);
314 Standard_Real *DISOTB =
315 (Standard_Real *) &HDISO ->ChangeArray1()(HDISO ->Lower());
318 Standard_Integer IERCOD=0;
320 // discretization of polynoms of interpolation
321 AdvApp2Var_ApproxF2var::mma2cdi_(&NDIMEN,&NBPNTU,UROOT,&NBPNTV,VROOT,&IORDRU,&IORDRV,
322 C1,C2,C3,C4,SU0,SU1,DU0,DU1,SV0,SV1,DV0,DV1,
323 SOSOTB,SODITB,DISOTB,DIDITB,&IERCOD);
325 // discretization of the square
326 Standard_Real UDBFN[2],VDBFN[2];
332 SIZE = Max(NBPNTU,NBPNTV);
333 Handle (TColStd_HArray1OfReal) HTABLE =
334 new TColStd_HArray1OfReal(1,SIZE);
336 (Standard_Real *) &HTABLE ->ChangeArray1()(HTABLE ->Lower());
338 Handle (TColStd_HArray1OfReal) HPOINTS =
339 new TColStd_HArray1OfReal(1,SIZE*NDIMEN);
341 (Standard_Real *) &HPOINTS ->ChangeArray1()(HPOINTS ->Lower());
343 // GCC 3.0 would not accept this line without the void
344 // pointer cast. Perhaps the real problem is a definition
345 // somewhere that has a void * in it.
346 AdvApp2Var_ApproxF2var::mma2ds1_(&NDIMEN,
363 // the results are stored
365 myDiscIsDone = Standard_True;
372 myDiscIsDone = Standard_False;
376 //============================================================================
377 //function : HasResult
379 //============================================================================
381 Standard_Boolean AdvApp2Var_Patch::HasResult() const
386 //============================================================================
387 //function : IsApproximated
389 //============================================================================
391 Standard_Boolean AdvApp2Var_Patch::IsApproximated() const
396 //============================================================================
397 //function : AddConstraints
399 //============================================================================
401 void AdvApp2Var_Patch::AddConstraints(const AdvApp2Var_Context& Conditions,
402 const AdvApp2Var_Framework& Constraints)
404 // data stored in the Context
405 Standard_Integer NDIMEN;
406 Standard_Integer IERCOD, NCFLMU, NCFLMV, NDegU, NDegV;
407 NDIMEN = Conditions.TotalDimension();
408 // Attention : works only for 3D
409 NCFLMU = Conditions.ULimit();
410 NCFLMV = Conditions.VLimit();
414 // data relative to the patch
415 Standard_Integer IORDRU = myOrdInU, IORDRV = myOrdInV;
416 Standard_Real *PATCAN =
417 (Standard_Real *) &myEquation ->ChangeArray1()(myEquation ->Lower());
419 // curves of approximation of Isos U
420 Standard_Integer SIZE = NCFLMV*NDIMEN;
421 Handle (TColStd_HArray1OfReal) HIsoU0
422 = new TColStd_HArray1OfReal(1,SIZE*(IORDRU+1));
423 HIsoU0 -> ChangeArray1() =
424 (Constraints.IsoU(myU0,myV0,myV1)).Polynom() -> Array1();
425 Standard_Real *IsoU0 =
426 (Standard_Real *) &HIsoU0 ->ChangeArray1()(HIsoU0 ->Lower());
427 Handle (TColStd_HArray1OfInteger) HCFU0
428 = new TColStd_HArray1OfInteger(1,IORDRU+1);
429 Standard_Integer *NCFU0 =
430 (Standard_Integer *) &HCFU0 ->ChangeArray1()(HCFU0 ->Lower());
431 HCFU0->Init( (Constraints.IsoU(myU0,myV0,myV1)).NbCoeff() );
433 Handle (TColStd_HArray1OfReal) HIsoU1
434 = new TColStd_HArray1OfReal(1,SIZE*(IORDRU+1));
435 HIsoU1 -> ChangeArray1() =
436 (Constraints.IsoU(myU1,myV0,myV1)).Polynom() -> Array1();
437 Standard_Real *IsoU1 =
438 (Standard_Real *) &HIsoU1 ->ChangeArray1()(HIsoU1 ->Lower());
439 Handle (TColStd_HArray1OfInteger) HCFU1
440 = new TColStd_HArray1OfInteger(1,IORDRU+1);
441 Standard_Integer *NCFU1 =
442 (Standard_Integer *) &HCFU1 ->ChangeArray1()(HCFU1 ->Lower());
443 HCFU1->Init( (Constraints.IsoU(myU1,myV0,myV1)).NbCoeff() );
445 // normalization of Isos U
446 Standard_Integer iu,iv;
447 Standard_Real du=(myU1-myU0)/2,dv=(myV1-myV0)/2,rho,valnorm;
448 Standard_Integer ideb0,ideb1,jj;
450 for (iu=1;iu<=IORDRU;iu++) {
452 ideb0 = HIsoU0->Lower() + iu*SIZE -1;
453 ideb1 = HIsoU1->Lower() + iu*SIZE -1;
454 for (jj=1;jj<=SIZE;jj++) {
455 HIsoU0->SetValue(ideb0+jj,rho*HIsoU0->Value(ideb0+jj));
456 HIsoU1->SetValue(ideb1+jj,rho*HIsoU1->Value(ideb1+jj));
460 // curves of approximation of Isos V
461 SIZE = NCFLMU*NDIMEN;
462 Handle (TColStd_HArray1OfReal) HIsoV0
463 = new TColStd_HArray1OfReal(1,SIZE*(IORDRV+1));
464 HIsoV0 -> ChangeArray1() =
465 (Constraints.IsoV(myU0,myU1,myV0)).Polynom() -> Array1();
466 Standard_Real *IsoV0 =
467 (Standard_Real *) &HIsoV0 ->ChangeArray1()(HIsoV0 ->Lower());
468 Handle (TColStd_HArray1OfInteger) HCFV0
469 = new TColStd_HArray1OfInteger(1,IORDRV+1);
470 Standard_Integer *NCFV0 =
471 (Standard_Integer *) &HCFV0 ->ChangeArray1()(HCFV0 ->Lower());
472 HCFV0->Init( (Constraints.IsoV(myU0,myU1,myV0)).NbCoeff() );
474 Handle (TColStd_HArray1OfReal) HIsoV1
475 = new TColStd_HArray1OfReal(1,SIZE*(IORDRV+1));
476 HIsoV1 -> ChangeArray1() =
477 (Constraints.IsoV(myU0,myU1,myV1)).Polynom() -> Array1();
478 Standard_Real *IsoV1 =
479 (Standard_Real *) &HIsoV1 ->ChangeArray1()(HIsoV1 ->Lower());
480 Handle (TColStd_HArray1OfInteger) HCFV1
481 = new TColStd_HArray1OfInteger(1,IORDRV+1);
482 Standard_Integer *NCFV1 =
483 (Standard_Integer *) &HCFV1 ->ChangeArray1()(HCFV1 ->Lower());
484 HCFV1->Init( (Constraints.IsoV(myU0,myU1,myV1)).NbCoeff() );
486 // normalization of Isos V
487 for (iv=1;iv<=IORDRV;iv++) {
489 ideb0 = HIsoV0->Lower() + iv*SIZE -1;
490 ideb1 = HIsoV1->Lower() + iv*SIZE -1;
491 for (jj=1;jj<=SIZE;jj++) {
492 HIsoV0 ->SetValue(ideb0+jj,rho*HIsoV0->Value(ideb0+jj));
493 HIsoV1->SetValue(ideb1+jj,rho*HIsoV1->Value(ideb1+jj));
497 // add constraints to constant V
498 Handle (TColStd_HArray1OfReal) HHERMV
499 = new TColStd_HArray1OfReal(1,(2*IORDRV+2)*(2*IORDRV+2));
500 Standard_Real *HermV =
501 (Standard_Real *) &HHERMV ->ChangeArray1()(HHERMV ->Lower());
503 AdvApp2Var_ApproxF2var::mma1her_(&IORDRV,HermV,&IERCOD);
505 Standard_ConstructionError::Raise
506 ("AdvApp2Var_Patch::AddConstraints : Error in FORTRAN");
508 AdvApp2Var_ApproxF2var::mma2ac2_(&NDIMEN,
521 // add constraints to constant U
522 Handle (TColStd_HArray1OfReal) HHERMU
523 = new TColStd_HArray1OfReal(1,(2*IORDRU+2)*(2*IORDRU+2));
524 Standard_Real *HermU =
525 (Standard_Real *) &HHERMU ->ChangeArray1()(HHERMU ->Lower());
527 AdvApp2Var_ApproxF2var::mma1her_(&IORDRU,HermU,&IERCOD);
529 Standard_ConstructionError::Raise
530 ("AdvApp2Var_Patch::AddConstraints : Error in FORTRAN");
532 AdvApp2Var_ApproxF2var::mma2ac3_(&NDIMEN,&NDegU,&NDegV,&IORDRU,&NCFLMV,
533 NCFU0,IsoU0,NCFU1,IsoU1,HermU,PATCAN);
536 // add constraints at the corners
537 Standard_Integer ideb;
538 SIZE=NDIMEN*(IORDRU+2)*(IORDRV+2);
539 Handle (TColStd_HArray1OfReal) HCOINS =
540 new TColStd_HArray1OfReal(1,SIZE*4);
542 for (iu=0;iu<=myOrdInU;iu++) {
543 for (iv=0;iv<=myOrdInV;iv++) {
544 rho = pow(du,iu)*pow(dv,iv);
546 // -F(U0,V0) and its derivatives normalized on (-1,1)
547 ideb = HCOINS->Lower() + NDIMEN*iu+NDIMEN*(IORDRU+2)*iv - 1;
548 valnorm = -rho * ((Constraints.Node(myU0,myV0)).Point(iu,iv)).X();
549 HCOINS->SetValue( 1+ideb , valnorm );
550 valnorm = -rho * ((Constraints.Node(myU0,myV0)).Point(iu,iv)).Y();
551 HCOINS->SetValue( 2+ideb , valnorm );
552 valnorm = -rho * ((Constraints.Node(myU0,myV0)).Point(iu,iv)).Z();
553 HCOINS->SetValue( 3+ideb , valnorm );
555 // -F(U1,V0) and its derivatives normalized on (-1,1)
557 valnorm = -rho * ((Constraints.Node(myU1,myV0)).Point(iu,iv)).X();
558 HCOINS->SetValue( 1+ideb , valnorm );
559 valnorm = -rho * ((Constraints.Node(myU1,myV0)).Point(iu,iv)).Y();
560 HCOINS->SetValue( 2+ideb , valnorm );
561 valnorm = -rho * ((Constraints.Node(myU1,myV0)).Point(iu,iv)).Z();
562 HCOINS->SetValue( 3+ideb , valnorm );
564 // -F(U0,V1) and its derivatives normalized on (-1,1)
566 valnorm = -rho * ((Constraints.Node(myU0,myV1)).Point(iu,iv)).X();
567 HCOINS->SetValue( 1+ideb , valnorm );
568 valnorm = -rho * ((Constraints.Node(myU0,myV1)).Point(iu,iv)).Y();
569 HCOINS->SetValue( 2+ideb , valnorm );
570 valnorm = -rho * ((Constraints.Node(myU0,myV1)).Point(iu,iv)).Z();
571 HCOINS->SetValue( 3+ideb , valnorm );
573 // -F(U1,V1) and its derivatives normalized on (-1,1)
575 valnorm = -rho * ((Constraints.Node(myU1,myV1)).Point(iu,iv)).X();
576 HCOINS->SetValue( 1+ideb , valnorm );
577 valnorm = -rho * ((Constraints.Node(myU1,myV1)).Point(iu,iv)).Y();
578 HCOINS->SetValue( 2+ideb , valnorm );
579 valnorm = -rho * ((Constraints.Node(myU1,myV1)).Point(iu,iv)).Z();
580 HCOINS->SetValue( 3+ideb , valnorm );
584 // tables required for FORTRAN
585 Standard_Integer IORDMX = Max(IORDRU,IORDRV);
586 Handle (TColStd_HArray1OfReal) HEXTR =
587 new TColStd_HArray1OfReal(1,2*IORDMX+2);
588 Standard_Real *EXTR =
589 (Standard_Real *) &HEXTR ->ChangeArray1()(HEXTR ->Lower());
590 Handle (TColStd_HArray1OfReal) HFACT =
591 new TColStd_HArray1OfReal(1,IORDMX+1);
592 Standard_Real *FACT =
593 (Standard_Real *) &HFACT ->ChangeArray1()(HFACT ->Lower());
595 Standard_Integer idim,ncf0,ncf1,iun=1;
598 // add extremities of isos U
599 for (iu=1;iu<=IORDRU+1;iu++) {
600 ncf0 = HCFU0->Value(HCFU0->Lower()+iu-1);
601 ncf1 = HCFU1->Value(HCFU1->Lower()+iu-1);
602 for (idim=1;idim<=NDIMEN;idim++) {
603 Is = IsoU0 + NCFLMV*(idim-1) + NCFLMV*NDIMEN*(iu-1);
604 AdvApp2Var_MathBase::mmdrc11_(&IORDRV,&iun,&ncf0,Is,EXTR,FACT);
605 for (iv=1;iv<=IORDRV+1;iv++) {
606 ideb = HCOINS->Lower() + NDIMEN*(iu-1)+NDIMEN*(IORDRU+2)*(iv-1) - 1;
607 HCOINS->ChangeValue(idim+ideb) += HEXTR->Value(1+2*(iv-1));
608 HCOINS->ChangeValue(2*SIZE+idim+ideb) += HEXTR->Value(2+2*(iv-1));
610 Is = IsoU1 + NCFLMV*(idim-1) + NCFLMV*NDIMEN*(iu-1);
611 AdvApp2Var_MathBase::mmdrc11_(&IORDRV,&iun,&ncf1,Is,EXTR,FACT);
612 for (iv=1;iv<=IORDRV+1;iv++) {
613 ideb = HCOINS->Lower() + NDIMEN*(iu-1)+NDIMEN*(IORDRU+2)*(iv-1) - 1;
614 HCOINS->ChangeValue(SIZE+idim+ideb) += HEXTR->Value(1+2*(iv-1));
615 HCOINS->ChangeValue(3*SIZE+idim+ideb) += HEXTR->Value(2+2*(iv-1));
620 // add extremities of isos V
621 for (iv=1;iv<=IORDRV+1;iv++) {
622 ncf0 = HCFV0->Value(HCFV0->Lower()+iv-1);
623 ncf1 = HCFV1->Value(HCFV1->Lower()+iv-1);
624 for (idim=1;idim<=NDIMEN;idim++) {
625 Is = IsoV0 + NCFLMU*(idim-1) + NCFLMU*NDIMEN*(iv-1);
626 AdvApp2Var_MathBase::mmdrc11_(&IORDRU,&iun,&ncf0,Is,EXTR,FACT);
627 for (iu=1;iu<=IORDRU+1;iu++) {
628 ideb = HCOINS->Lower() + NDIMEN*(iu-1)+NDIMEN*(IORDRU+2)*(iv-1) - 1;
629 HCOINS->ChangeValue(idim+ideb) += HEXTR->Value(1+2*(iu-1));
630 HCOINS->ChangeValue(SIZE+idim+ideb) += HEXTR->Value(2+2*(iu-1));
632 Is = IsoV1 + NCFLMU*(idim-1) + NCFLMU*NDIMEN*(iv-1);
633 AdvApp2Var_MathBase::mmdrc11_(&IORDRU,&iun,&ncf1,Is,EXTR,FACT);
634 for (iu=1;iu<=IORDRU+1;iu++) {
635 ideb = HCOINS->Lower() + NDIMEN*(iu-1)+NDIMEN*(IORDRU+2)*(iv-1) - 1;
636 HCOINS->ChangeValue(2*SIZE+idim+ideb) += HEXTR->Value(1+2*(iu-1));
637 HCOINS->ChangeValue(3*SIZE+idim+ideb) += HEXTR->Value(2+2*(iu-1));
644 (Standard_Real *) &HCOINS ->ChangeArray1()(HCOINS ->Lower());
645 Standard_Real *C2 = C1 + SIZE;
646 Standard_Real *C3 = C2 + SIZE;
647 Standard_Real *C4 = C3 + SIZE;
648 if ( IORDRU>=0 && IORDRV>=0 ) {
649 AdvApp2Var_ApproxF2var::mma2ac1_(&NDIMEN,&NDegU,&NDegV,&IORDRU,&IORDRV,
650 C1,C2,C3,C4,HermU,HermV,PATCAN);
654 //============================================================================
655 //function : AddErrors
657 //============================================================================
659 void AdvApp2Var_Patch::AddErrors(const AdvApp2Var_Framework& Constraints)
661 Standard_Integer NBSESP = 1, iesp;
662 Standard_Integer iu,iv;
664 Standard_Real errU,errV,error,hmax[4];
670 for (iesp=1;iesp<=NBSESP;iesp++) {
671 // error max in sub-space iesp
673 for (iv=1;iv<=myOrdInV+1;iv++) {
674 error = ((Constraints.IsoV(myU0,myU1,myV0)).MaxErrors())->Value(iesp,iv);
675 errU = Max(errU,error);
676 error = ((Constraints.IsoV(myU0,myU1,myV1)).MaxErrors())->Value(iesp,iv);
677 errU = Max(errU,error);
680 for (iu=1;iu<=myOrdInU+1;iu++) {
681 error = ((Constraints.IsoU(myU0,myV0,myV1)).MaxErrors())->Value(iesp,iu);
682 errV = Max(errV,error);
683 error = ((Constraints.IsoU(myU1,myV0,myV1)).MaxErrors())->Value(iesp,iu);
684 errV = Max(errV,error);
686 myMaxErrors->ChangeValue(iesp) +=
687 errU * hmax[myOrdInV+1] + errV * hmax[myOrdInU+1];
689 // average error in sub-space iesp
691 for (iv=1;iv<=myOrdInV+1;iv++) {
692 error = ((Constraints.IsoV(myU0,myU1,myV0)).MoyErrors())->Value(iesp,iv);
693 errU = Max(errU,error);
694 error = ((Constraints.IsoV(myU0,myU1,myV1)).MoyErrors())->Value(iesp,iv);
695 errU = Max(errU,error);
698 for (iu=1;iu<=myOrdInU+1;iu++) {
699 error = ((Constraints.IsoU(myU0,myV0,myV1)).MoyErrors())->Value(iesp,iu);
700 errV = Max(errV,error);
701 error = ((Constraints.IsoU(myU1,myV0,myV1)).MoyErrors())->Value(iesp,iu);
702 errV = Max(errV,error);
704 error = myMoyErrors->Value(iesp);
706 error += errU*hmax[myOrdInV+1] * errU*hmax[myOrdInV+1]
707 + errV*hmax[myOrdInU+1] * errV*hmax[myOrdInU+1];
708 myMoyErrors->SetValue(iesp,Sqrt(error));
710 // max errors at iso-borders
711 Handle (TColStd_HArray2OfReal) HERISO
712 = new TColStd_HArray2OfReal(1,NBSESP,1,4);
713 HERISO->SetValue(iesp,1,
714 ((Constraints.IsoV(myU0,myU1,myV0)).MaxErrors())->Value(iesp,1));
715 HERISO->SetValue(iesp,2,
716 ((Constraints.IsoV(myU0,myU1,myV1)).MaxErrors())->Value(iesp,1));
717 HERISO->SetValue(iesp,3,
718 ((Constraints.IsoU(myU0,myV0,myV1)).MaxErrors())->Value(iesp,1));
719 HERISO->SetValue(iesp,4,
720 ((Constraints.IsoU(myU1,myV0,myV1)).MaxErrors())->Value(iesp,1));
722 // calculate max errors at the corners
723 Standard_Real emax1=0.,emax2=0.,emax3=0.,emax4=0.,err1,err2,err3,err4;
724 for (iu=0;iu<=myOrdInU;iu++) {
725 for (iv=0;iv<=myOrdInV;iv++) {
726 error = (Constraints.Node(myU0,myV0)).Error(iu,iv);
727 emax1 = Max(emax1,error);
728 error = (Constraints.Node(myU1,myV0)).Error(iu,iv);
729 emax2 = Max(emax2,error);
730 error = (Constraints.Node(myU0,myV1)).Error(iu,iv);
731 emax3 = Max(emax3,error);
732 error = (Constraints.Node(myU1,myV1)).Error(iu,iv);
733 emax4 = Max(emax4,error);
737 // calculate max errors on borders
738 err1 = Max(emax1,emax2);
739 err2 = Max(emax3,emax4);
740 err3 = Max(emax1,emax3);
741 err4 = Max(emax2,emax4);
743 // calculate final errors on internal isos
744 if ( (Constraints.IsoV(myU0,myU1,myV0)).Position() == 0 ) {
745 HERISO ->ChangeValue(iesp,1) += err1*hmax[myOrdInU+1];
747 if ( (Constraints.IsoV(myU0,myU1,myV1)).Position() == 0 ) {
748 HERISO ->ChangeValue(iesp,2) += err2*hmax[myOrdInU+1];
750 if ( (Constraints.IsoU(myU0,myV0,myV1)).Position() == 0 ) {
751 HERISO ->ChangeValue(iesp,3) += err3*hmax[myOrdInV+1];
753 if ( (Constraints.IsoU(myU1,myV0,myV1)).Position() == 0 ) {
754 HERISO ->ChangeValue(iesp,4) += err4*hmax[myOrdInV+1];
756 myIsoErrors = HERISO;
760 //============================================================================
761 //function : MakeApprox
763 //============================================================================
765 void AdvApp2Var_Patch::MakeApprox(const AdvApp2Var_Context& Conditions,
766 const AdvApp2Var_Framework& Constraints,
767 const Standard_Integer NumDec)
770 // data stored in the Context
771 Standard_Integer NDIMEN, NBSESP, NDIMSE;
772 Standard_Integer NBPNTU, NBPNTV, NCFLMU, NCFLMV, NDJACU, NDJACV;
773 Standard_Integer NDegU, NDegV, NJacU, NJacV;
774 NDIMEN = Conditions.TotalDimension();
775 NBSESP = Conditions.TotalNumberSSP();
777 NBPNTU = (Conditions.URoots())->Length();
778 if (myOrdInU>-1) NBPNTU -= 2;
779 NBPNTV = (Conditions.VRoots())->Length();
780 if (myOrdInV>-1) NBPNTV -= 2;
781 NCFLMU = Conditions.ULimit();
782 NCFLMV = Conditions.VLimit();
785 NDJACU = Conditions.UJacDeg();
786 NDJACV = Conditions.VJacDeg();
790 // data relative to the processed patch
791 Standard_Integer IORDRU = myOrdInU, IORDRV = myOrdInV,
792 NDMINU = 1, NDMINV = 1, NCOEFU, NCOEFV;
793 // NDMINU and NDMINV depend on the nb of coeff of neighboring isos
794 // and of the required order of continuity
795 NDMINU = Max(1,2*IORDRU+1);
796 NCOEFU = (Constraints.IsoV(myU0,myU1,myV0)).NbCoeff()-1;
797 NDMINU = Max(NDMINU,NCOEFU);
798 NCOEFU = (Constraints.IsoV(myU0,myU1,myV1)).NbCoeff()-1;
799 NDMINU = Max(NDMINU,NCOEFU);
801 NDMINV = Max(1,2*IORDRV+1);
802 NCOEFV = (Constraints.IsoU(myU0,myV0,myV1)).NbCoeff()-1;
803 NDMINV = Max(NDMINV,NCOEFV);
804 NCOEFV = (Constraints.IsoU(myU1,myV0,myV1)).NbCoeff()-1;
805 NDMINV = Max(NDMINV,NCOEFV);
807 // tables of approximations
808 Handle (TColStd_HArray1OfReal) HEPSAPR =
809 new TColStd_HArray1OfReal(1,NBSESP);
810 Handle (TColStd_HArray1OfReal) HEPSFRO =
811 new TColStd_HArray1OfReal(1,NBSESP*8);
812 Standard_Integer iesp;
813 for (iesp=1;iesp<=NBSESP;iesp++) {
814 HEPSAPR->SetValue(iesp,(Conditions.IToler())->Value(iesp));
815 HEPSFRO->SetValue(iesp,(Conditions.FToler())->Value(iesp,1));
816 HEPSFRO->SetValue(iesp+NBSESP,(Conditions.FToler())->Value(iesp,2));
817 HEPSFRO->SetValue(iesp+2*NBSESP,(Conditions.FToler())->Value(iesp,3));
818 HEPSFRO->SetValue(iesp+3*NBSESP,(Conditions.FToler())->Value(iesp,4));
819 HEPSFRO->SetValue(iesp+4*NBSESP,(Conditions.CToler())->Value(iesp,1));
820 HEPSFRO->SetValue(iesp+5*NBSESP,(Conditions.CToler())->Value(iesp,2));
821 HEPSFRO->SetValue(iesp+6*NBSESP,(Conditions.CToler())->Value(iesp,3));
822 HEPSFRO->SetValue(iesp+7*NBSESP,(Conditions.CToler())->Value(iesp,4));
824 Standard_Real *EPSAPR =
825 (Standard_Real *) &HEPSAPR ->ChangeArray1()(HEPSAPR ->Lower());
826 Standard_Real *EPSFRO =
827 (Standard_Real *) &HEPSFRO ->ChangeArray1()(HEPSFRO ->Lower());
829 Standard_Integer SIZE=(1+NDJACU)*(1+NDJACV)*NDIMEN;
830 Handle (TColStd_HArray1OfReal) HPJAC =
831 new TColStd_HArray1OfReal(1,SIZE);
832 Standard_Real *PATJAC =
833 (Standard_Real *) &HPJAC ->ChangeArray1()(HPJAC ->Lower());
835 Handle (TColStd_HArray1OfReal) HPAUX =
836 new TColStd_HArray1OfReal(1,SIZE);
837 Standard_Real *PATAUX =
838 (Standard_Real *) &HPAUX ->ChangeArray1()(HPAUX ->Lower());
839 SIZE=NCFLMU*NCFLMV*NDIMEN;
840 Handle (TColStd_HArray1OfReal) HPCAN =
841 new TColStd_HArray1OfReal(1,SIZE);
842 Standard_Real *PATCAN =
843 (Standard_Real *) &HPCAN ->ChangeArray1()(HPCAN ->Lower());
844 Handle (TColStd_HArray1OfReal) HERRMAX =
845 new TColStd_HArray1OfReal(1,NBSESP);
846 Standard_Real *ERRMAX =
847 (Standard_Real *) &HERRMAX ->ChangeArray1()(HERRMAX ->Lower());
848 Handle (TColStd_HArray1OfReal) HERRMOY =
849 new TColStd_HArray1OfReal(1,NBSESP);
850 Standard_Real *ERRMOY =
851 (Standard_Real *) &HERRMOY ->ChangeArray1()(HERRMOY ->Lower());
853 // tables of discretization of the square
854 Standard_Real *SOSOTB =
855 (Standard_Real *) &mySosoTab ->ChangeArray1()(mySosoTab ->Lower());
856 Standard_Real *DISOTB =
857 (Standard_Real *) &myDisoTab ->ChangeArray1()(myDisoTab ->Lower());
858 Standard_Real *SODITB =
859 (Standard_Real *) &mySodiTab ->ChangeArray1()(mySodiTab ->Lower());
860 Standard_Real *DIDITB =
861 (Standard_Real *) &myDidiTab ->ChangeArray1()(myDidiTab ->Lower());
864 Standard_Integer ITYDEC=0, IERCOD=0;
865 Standard_Integer iun=1,itrois=3;
868 AdvApp2Var_ApproxF2var::mma2ce1_((integer *)&NumDec,
897 if (ITYDEC == 0 && IERCOD<=0) {
898 myHasResult = Standard_True;
899 myApprIsDone = (IERCOD==0);
900 myNbCoeffInU = NCOEFU+1;
901 myNbCoeffInV = NCOEFV+1;
902 myMaxErrors = HERRMAX;
903 myMoyErrors = HERRMOY;
905 // Passage to canonic on [-1,1]
906 AdvApp2Var_MathBase::mmfmca9_(&NJacU,&NJacV,&NDIMEN,&myNbCoeffInU,&myNbCoeffInV,
907 &NDIMEN,PATJAC,PATJAC);
908 AdvApp2Var_ApproxF2var::mma2can_(&NCFLMU,&NCFLMV,&NDIMEN,
909 &myOrdInU,&myOrdInV,&myNbCoeffInU,
911 PATJAC,PATAUX,PATCAN,&IERCOD);
913 Standard_ConstructionError::Raise
914 ("AdvApp2Var_Patch::MakeApprox : Error in FORTRAN");
918 // Add constraints and errors
919 AddConstraints(Conditions,Constraints);
920 AddErrors(Constraints);
922 // Reduction of degrees if possible
923 PATCAN = (Standard_Real *)
924 &myEquation->ChangeArray1()(myEquation ->Lower());
926 AdvApp2Var_ApproxF2var::mma2fx6_(&NCFLMU,
942 // transposition (NCFLMU,NCFLMV,NDIMEN)Fortran-C++
943 Standard_Integer aIU, aIN, dim, ii, jj;
944 for (dim=1; dim<=NDIMEN; dim++){
945 aIN = (dim-1)*NCFLMU*NCFLMV;
946 for (ii=1; ii<=NCFLMU; ii++) {
947 aIU = (ii-1)*NDIMEN*NCFLMV;
948 for (jj=1; jj<=NCFLMV; jj++) {
949 HPAUX->SetValue(dim+NDIMEN*(jj-1)+aIU ,
950 myEquation->Value(ii+NCFLMU*(jj-1)+aIN) );
957 myApprIsDone = Standard_False;
958 myHasResult = Standard_False;
962 //============================================================================
963 //function : ChangeDomain
965 //============================================================================
967 void AdvApp2Var_Patch::ChangeDomain(const Standard_Real a,
968 const Standard_Real b,
969 const Standard_Real c,
970 const Standard_Real d)
978 //============================================================================
979 //function : ResetApprox
980 //purpose : allows removing a result when it is necessary to cut
981 //============================================================================
983 void AdvApp2Var_Patch::ResetApprox()
985 myApprIsDone = Standard_False;
986 myHasResult = Standard_False;
989 //============================================================================
990 //function : OverwriteApprox
991 //purpose : allows preserving a result even if the precision is not satisfactory
992 //============================================================================
994 void AdvApp2Var_Patch::OverwriteApprox()
996 if (myHasResult) myApprIsDone = Standard_True;
999 //============================================================================
1002 //============================================================================
1004 Standard_Real AdvApp2Var_Patch::U0() const
1009 //============================================================================
1012 //============================================================================
1014 Standard_Real AdvApp2Var_Patch::U1() const
1019 //============================================================================
1022 //============================================================================
1024 Standard_Real AdvApp2Var_Patch::V0() const
1029 //============================================================================
1032 //============================================================================
1034 Standard_Real AdvApp2Var_Patch::V1() const
1039 //============================================================================
1042 //============================================================================
1044 Standard_Integer AdvApp2Var_Patch::UOrder() const
1050 //============================================================================
1053 //============================================================================
1055 Standard_Integer AdvApp2Var_Patch::VOrder() const
1061 //============================================================================
1062 //function : CutSense without Critere
1063 //purpose : 0 : OK; 1 : required cut by U;
1064 // 2 : required cut by V; 3 : required cut by U and by V
1065 //============================================================================
1067 Standard_Integer AdvApp2Var_Patch::CutSense() const
1073 //============================================================================
1074 //function : CutSense with critere
1075 //purpose : 0 : OK; 1 : required cut by U;
1076 // 2 : required cut by V; 3 : required cut by U and by V
1077 //============================================================================
1079 Standard_Integer AdvApp2Var_Patch::CutSense(const AdvApp2Var_Criterion& Crit,
1080 const Standard_Integer NumDec) const
1082 Standard_Boolean CritRel = (Crit.Type() == AdvApp2Var_Relative);
1083 if ( CritRel && !IsApproximated()) {
1087 if (Crit.IsSatisfied(*this)) {
1097 //============================================================================
1098 //function : NbCoeffInU
1100 //============================================================================
1102 Standard_Integer AdvApp2Var_Patch::NbCoeffInU() const
1104 return myNbCoeffInU;
1107 //============================================================================
1108 //function : NbCoeffInV
1110 //============================================================================
1112 Standard_Integer AdvApp2Var_Patch::NbCoeffInV() const
1114 return myNbCoeffInV;
1117 //============================================================================
1118 //function : ChangeNbCoeff
1119 //purpose : allows increasing the nb of coeff (cf Network)
1120 //============================================================================
1122 void AdvApp2Var_Patch::ChangeNbCoeff(const Standard_Integer NbCoeffU,
1123 const Standard_Integer NbCoeffV)
1125 if (myNbCoeffInU<NbCoeffU) myNbCoeffInU = NbCoeffU;
1126 if (myNbCoeffInV<NbCoeffV) myNbCoeffInV = NbCoeffV;
1129 //============================================================================
1130 //function : MaxErrors
1131 //purpose : returns max errors of polynomial approximation
1132 //============================================================================
1134 Handle(TColStd_HArray1OfReal)
1135 AdvApp2Var_Patch::MaxErrors() const
1140 //============================================================================
1141 //function : AverageErrors
1142 //purpose : returns average errors of polynomial approximation
1143 //============================================================================
1145 Handle(TColStd_HArray1OfReal)
1146 AdvApp2Var_Patch::AverageErrors() const
1151 //============================================================================
1152 //function : IsoErrors
1153 //purpose : returns max errors on borders of polynomial approximation
1154 //============================================================================
1156 Handle(TColStd_HArray2OfReal)
1157 AdvApp2Var_Patch::IsoErrors() const
1162 //============================================================================
1164 //purpose : returns poles of the polynomial approximation
1165 //============================================================================
1167 Handle(TColgp_HArray2OfPnt)
1168 AdvApp2Var_Patch::Poles(const Standard_Integer SSPIndex,
1169 const AdvApp2Var_Context & Cond) const
1171 Handle(TColStd_HArray1OfReal) SousEquation;
1172 if ( Cond.TotalNumberSSP( ) == 1 && SSPIndex == 1 ) {
1173 SousEquation = myEquation;
1176 Standard_ConstructionError::Raise
1177 ("AdvApp2Var_Patch::Poles : SSPIndex out of range");
1179 Handle(TColStd_HArray1OfReal) Intervalle =
1180 new (TColStd_HArray1OfReal) (1,2);
1181 Intervalle->SetValue(1, -1);
1182 Intervalle->SetValue(2, 1);
1185 Handle(TColStd_HArray1OfInteger) NbCoeff =
1186 new (TColStd_HArray1OfInteger) (1,2);
1187 NbCoeff->SetValue(1, myNbCoeffInU);
1188 NbCoeff->SetValue(2, myNbCoeffInV);
1191 Convert_GridPolynomialToPoles
1192 Conv (Cond.ULimit()-1,
1199 return Conv.Poles();
1203 //============================================================================
1204 //function : Coefficients
1205 //purpose : returns coeff. of the equation of polynomial approximation
1206 //============================================================================
1208 Handle(TColStd_HArray1OfReal)
1209 AdvApp2Var_Patch::Coefficients(const Standard_Integer SSPIndex,
1210 const AdvApp2Var_Context & Cond) const
1212 Handle(TColStd_HArray1OfReal) SousEquation;
1213 if ( Cond.TotalNumberSSP( ) == 1 && SSPIndex == 1 ) {
1214 SousEquation = myEquation;
1217 Standard_ConstructionError::Raise
1218 ("AdvApp2Var_Patch::Poles : SSPIndex out of range");
1220 return SousEquation;
1224 //============================================================================
1225 //function : CritValue
1227 //============================================================================
1229 Standard_Real AdvApp2Var_Patch::CritValue() const
1235 //============================================================================
1236 //function : SetCritValue
1238 //============================================================================
1240 void AdvApp2Var_Patch::SetCritValue(const Standard_Real dist)