0031004: Coding - eliminate warnings issued by gcc 9.1.0
[occt.git] / src / AdvApp2Var / AdvApp2Var_Iso.cxx
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
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 #include <AdvApp2Var_Iso.hxx>
18
19 #include <AdvApp2Var_ApproxF2var.hxx>
20 #include <AdvApp2Var_Context.hxx>
21 #include <AdvApp2Var_Node.hxx>
22 #include <gp_Pnt.hxx>
23 #include <TColStd_HArray1OfInteger.hxx>
24 #include <TColStd_HArray1OfReal.hxx>
25 #include <TColStd_HArray2OfReal.hxx>
26
27 IMPLEMENT_STANDARD_RTTIEXT(AdvApp2Var_Iso, Standard_Transient)
28
29 //=======================================================================
30 //function : AdvApp2Var_Iso
31 //purpose  : 
32 //=======================================================================
33 AdvApp2Var_Iso::AdvApp2Var_Iso()  :
34 myType(GeomAbs_IsoU),
35 myConstPar(0.5),
36 myU0(0.),
37 myU1(1.),
38 myV0(0.),
39 myV1(1.),
40 myPosition(0),
41 myExtremOrder(2),
42 myDerivOrder(2),
43 myNbCoeff(0),
44 myApprIsDone(Standard_False),
45 myHasResult(Standard_False)
46 {
47 }
48
49 //=======================================================================
50 //function : AdvApp2Var_Iso
51 //purpose  : 
52 //=======================================================================
53
54 AdvApp2Var_Iso::AdvApp2Var_Iso(const GeomAbs_IsoType type,
55                                const Standard_Real cte,
56                                const Standard_Real Ufirst,
57                                const Standard_Real Ulast,
58                                const Standard_Real Vfirst,
59                                const Standard_Real Vlast,
60                                const Standard_Integer pos,
61                                const Standard_Integer iu,
62                                const Standard_Integer iv) :
63 myType(type),
64 myConstPar(cte),
65 myU0(Ufirst),
66 myU1(Ulast),
67 myV0(Vfirst),
68 myV1(Vlast),
69 myPosition(pos),
70 myNbCoeff(0),
71 myApprIsDone(Standard_False),
72 myHasResult(Standard_False)
73 {
74   if (myType==GeomAbs_IsoU) {
75     myExtremOrder = iv;
76     myDerivOrder = iu;
77   }
78   else {
79     myExtremOrder = iu;
80     myDerivOrder = iv;
81   }
82 }
83
84 //=======================================================================
85 //function : IsApproximated
86 //purpose  : 
87 //=======================================================================
88
89 Standard_Boolean AdvApp2Var_Iso::IsApproximated() const
90 {
91   return myApprIsDone;
92 }
93
94 //=======================================================================
95 //function : HasResult
96 //purpose  : 
97 //=======================================================================
98
99 Standard_Boolean AdvApp2Var_Iso::HasResult() const
100 {
101   return myHasResult;
102 }
103
104 //=======================================================================
105 //function : MakeApprox
106 //purpose  : 
107 //=======================================================================
108
109 void AdvApp2Var_Iso::MakeApprox(const AdvApp2Var_Context& Conditions,
110                                 const Standard_Real U0, 
111                                 const Standard_Real U1, 
112                                 const Standard_Real V0, 
113                                 const Standard_Real V1, 
114                                 const AdvApp2Var_EvaluatorFunc2Var& Func,
115                                 AdvApp2Var_Node& NodeBegin,
116                                 AdvApp2Var_Node& NodeEnd)
117 {
118 // fixed values
119   Standard_Integer NBCRMX=1, NBCRBE;
120 // data stored in the Context
121   Standard_Integer NDIMEN, NBSESP, NDIMSE;
122   NDIMEN = Conditions.TotalDimension();
123   NBSESP = Conditions.TotalNumberSSP();
124 // Attention : works only in 3D
125   NDIMSE = 3;
126 // the domain of the grid
127   Standard_Real UVFONC[4];
128   UVFONC[0] = U0;
129   UVFONC[1] = U1;
130   UVFONC[2] = V0;
131   UVFONC[3] = V1;
132
133 // data related to the processed iso
134   Standard_Integer IORDRE = myExtremOrder, IDERIV = myDerivOrder;
135   Standard_Real TCONST = myConstPar;
136
137 // data related to the type of the iso
138   Standard_Integer ISOFAV = 0,NBROOT = 0,NDGJAC = 0,NCFLIM = 1;
139   Standard_Real TABDEC[2];
140   Handle (TColStd_HArray1OfReal) HUROOT  = Conditions.URoots();
141   Handle (TColStd_HArray1OfReal) HVROOT  = Conditions.VRoots();
142   Standard_Real * ROOTLG=NULL;
143   switch(myType) {
144    case GeomAbs_IsoV : 
145     ISOFAV = 2;
146     TABDEC[0] = myU0;
147     TABDEC[1] = myU1;
148     UVFONC[0] = myU0;
149     UVFONC[1] = myU1;
150     NBROOT = (Conditions.URoots())->Length();
151     if (myExtremOrder>-1) NBROOT -= 2;
152     ROOTLG =  (Standard_Real *) &HUROOT ->ChangeArray1()(HUROOT ->Lower());
153     NDGJAC = Conditions.UJacDeg();
154     NCFLIM = Conditions.ULimit();
155     break;
156    case GeomAbs_IsoU : 
157     ISOFAV = 1;
158     TABDEC[0] = myV0;
159     TABDEC[1] = myV1;
160     UVFONC[2] = myV0;
161     UVFONC[3] = myV1;
162     NBROOT = (Conditions.VRoots())->Length();
163     if (myExtremOrder>-1) NBROOT -= 2;
164     ROOTLG =  (Standard_Real *) &HVROOT ->ChangeArray1()(HVROOT ->Lower());
165     NDGJAC = Conditions.VJacDeg();
166     NCFLIM = Conditions.VLimit();
167     break;
168     //#ifndef OCCT_DEBUG
169     //pkv f
170   case GeomAbs_NoneIso:
171     //pkv t
172   default:
173     break;
174     //#endif
175   }
176
177 // data relative to the position of iso (front or cut line)
178   Handle (TColStd_HArray1OfReal) HEPSAPR = new TColStd_HArray1OfReal(1,NBSESP);
179   Standard_Integer iesp;
180   switch(myPosition) {
181    case 0 :
182     for (iesp=1;iesp<=NBSESP;iesp++) {
183       HEPSAPR->SetValue(iesp,(Conditions.CToler())->Value(iesp,1));
184     }
185     break;
186    case 1 : 
187     for (iesp=1;iesp<=NBSESP;iesp++) {
188       HEPSAPR->SetValue(iesp,(Conditions.FToler())->Value(iesp,1));
189     }
190     break;
191    case 2 : 
192     for (iesp=1;iesp<=NBSESP;iesp++) {
193       HEPSAPR->SetValue(iesp,(Conditions.FToler())->Value(iesp,2));
194     }
195     break;
196    case 3 : 
197     for (iesp=1;iesp<=NBSESP;iesp++) {
198       HEPSAPR->SetValue(iesp,(Conditions.FToler())->Value(iesp,3));
199     }
200     break;
201    case 4 : 
202     for (iesp=1;iesp<=NBSESP;iesp++) {
203       HEPSAPR->SetValue(iesp,(Conditions.FToler())->Value(iesp,4));
204     }
205     break;
206   }
207   Standard_Real *EPSAPR  
208     =  (Standard_Real *) &HEPSAPR ->ChangeArray1()(HEPSAPR ->Lower());
209
210 // the tables of approximations
211   Standard_Integer SZCRB = NDIMEN*NCFLIM;
212   Handle (TColStd_HArray1OfReal) HCOURBE  =
213     new TColStd_HArray1OfReal(1,SZCRB*(IDERIV+1));
214   Standard_Real *COURBE  =  
215     (Standard_Real *) &HCOURBE ->ChangeArray1()(HCOURBE ->Lower());
216   Standard_Real *CRBAPP = COURBE;
217   Standard_Integer SZTAB = (1+NBROOT/2)*NDIMEN;
218   Handle (TColStd_HArray1OfReal) HSOMTAB  =
219     new TColStd_HArray1OfReal(1,SZTAB*(IDERIV+1));
220   Standard_Real *SOMTAB  =  
221     (Standard_Real *) &HSOMTAB ->ChangeArray1()(HSOMTAB ->Lower());
222   Standard_Real *SOMAPP = SOMTAB;
223   Handle (TColStd_HArray1OfReal) HDIFTAB  =
224     new TColStd_HArray1OfReal(1,SZTAB*(IDERIV+1));
225   Standard_Real *DIFTAB  =  
226     (Standard_Real *) &HDIFTAB ->ChangeArray1()(HDIFTAB ->Lower());
227   Standard_Real *DIFAPP = DIFTAB;
228   Handle (TColStd_HArray1OfReal) HCONTR1 = 
229     new TColStd_HArray1OfReal(1,(IORDRE+2)*NDIMEN);
230   Standard_Real *CONTR1 = 
231     (Standard_Real *) &HCONTR1->ChangeArray1()(HCONTR1->Lower()); 
232   Handle (TColStd_HArray1OfReal) HCONTR2 = 
233     new TColStd_HArray1OfReal(1,(IORDRE+2)*NDIMEN);
234   Standard_Real *CONTR2 = 
235     (Standard_Real *) &HCONTR2->ChangeArray1()(HCONTR2->Lower()); 
236   Handle (TColStd_HArray2OfReal) HERRMAX  =  
237     new TColStd_HArray2OfReal(1,NBSESP,1,IDERIV+1);
238   Standard_Real *EMXAPP = new Standard_Real[NBSESP];
239   Handle (TColStd_HArray2OfReal) HERRMOY  =  
240     new TColStd_HArray2OfReal(1,NBSESP,1,IDERIV+1);
241   //#ifdef OCCT_DEBUG
242   //Standard_Real *ERRMOY =
243   //#endif
244   //  (Standard_Real *) &HERRMOY->ChangeArray2()(HERRMOY ->LowerRow(),HERRMOY ->LowerCol());
245   Standard_Real *EMYAPP = new Standard_Real[NBSESP];
246 //
247 // the approximations
248 //
249   Standard_Integer IERCOD=0, NCOEFF=0;
250   Standard_Integer iapp,ncfapp,ierapp;
251 //  Standard_Integer id,ic,ideb;
252   for (iapp=0;iapp<=IDERIV;iapp++) {
253 //   approximation of the derivative of order iapp
254     ncfapp = 0;
255     ierapp = 0;
256     // GCC 3.0 would not accept this line without the void
257     // pointer cast.  Perhaps the real problem is a definition
258     // somewhere that has a void * in it.
259     AdvApp2Var_ApproxF2var::mma2fnc_(&NDIMEN,
260                                      &NBSESP,
261                                      &NDIMSE,
262                                      UVFONC,
263                                      /*(void *)*/Func,
264                                      &TCONST,
265                                      &ISOFAV,
266                                      &NBROOT,
267                                      ROOTLG,
268                                      &IORDRE,
269                                      &iapp,
270                                      &NDGJAC,
271                                      &NBCRMX,
272                                      &NCFLIM,
273                                      EPSAPR,
274                                      &ncfapp,
275                                      CRBAPP,
276                                      &NBCRBE,
277                                      SOMAPP,
278                                      DIFAPP,
279                                      CONTR1,
280                                      CONTR2,
281                                      TABDEC,
282                                      EMXAPP,
283                                      EMYAPP,
284                                      &ierapp);
285 //   error and coefficient management.
286     if (ierapp>0) {
287       myApprIsDone = Standard_False;
288       myHasResult  = Standard_False;
289       goto FINISH;
290     }
291     if (NCOEFF<=ncfapp) NCOEFF=ncfapp;
292     if (ierapp==-1) IERCOD = -1;
293 //   return constraints of order 0 to IORDRE of extremities
294     Standard_Integer ider, jpos=HCONTR1->Lower();
295     for (ider=0; ider<=IORDRE;ider++) {
296       gp_Pnt pt(HCONTR1->Value(jpos),
297                 HCONTR1->Value(jpos+1),
298                 HCONTR1->Value(jpos+2));
299       if (ISOFAV==2) {
300         NodeBegin.SetPoint(ider,iapp, pt);
301       }
302       else {
303         NodeBegin.SetPoint(iapp,ider, pt);
304       }
305       jpos+=3;
306     }
307     jpos=HCONTR2->Lower();
308     for (ider=0; ider<=IORDRE;ider++) {
309       gp_Pnt pt(HCONTR2->Value(jpos),
310                 HCONTR2->Value(jpos+1),
311                 HCONTR2->Value(jpos+2));
312       if (ISOFAV==2) {
313         NodeEnd.SetPoint(ider,iapp, pt);
314       }
315       else {
316         NodeEnd.SetPoint(iapp,ider, pt);
317       }
318       jpos+=3;
319     }
320 //   return errors
321     for (iesp=1; iesp<=NBSESP;iesp++) {
322       HERRMAX->SetValue(iesp,iapp+1,EMXAPP[iesp-1]);
323       HERRMOY->SetValue(iesp,iapp+1,EMYAPP[iesp-1]);
324     }
325 // passage to the approximation of higher order
326     CRBAPP += SZCRB;
327     SOMAPP += SZTAB;
328     DIFAPP += SZTAB;
329   }
330
331 // management of results
332   if (IERCOD == 0) {
333 //   all approximations are correct
334     myApprIsDone = Standard_True;
335     myHasResult  = Standard_True;
336   }
337   else if (IERCOD == -1) {
338 //   at least one approximation is not correct
339     myApprIsDone = Standard_False;
340     myHasResult  = Standard_True;
341   } 
342   else { 
343     myApprIsDone = Standard_False;
344     myHasResult  = Standard_False;
345   } 
346   if ( myHasResult ) {
347     myEquation = HCOURBE;
348     myNbCoeff  = NCOEFF;
349     myMaxErrors = HERRMAX;
350     myMoyErrors = HERRMOY;
351     mySomTab = HSOMTAB;
352     myDifTab = HDIFTAB;
353   }
354   FINISH:
355   delete []EMXAPP;
356   delete []EMYAPP;
357 }
358
359 //=======================================================================
360 //function : ChangeDomain
361 //purpose  : 
362 //=======================================================================
363
364 void AdvApp2Var_Iso::ChangeDomain(const Standard_Real a, const Standard_Real b)
365 {
366   if (myType==GeomAbs_IsoU) {
367     myV0 = a;
368     myV1 = b;
369   }
370   else {
371     myU0 = a;
372     myU1 = b;
373   }
374 }
375
376 //=======================================================================
377 //function : ChangeDomain
378 //purpose  : 
379 //=======================================================================
380
381 void AdvApp2Var_Iso::ChangeDomain(const Standard_Real a,
382                                   const Standard_Real b,
383                                   const Standard_Real c,
384                                   const Standard_Real d)
385 {
386   myU0 = a;
387   myU1 = b;
388   myV0 = c;
389   myV1 = d;
390 }
391
392 //=======================================================================
393 //function : SetConstante
394 //purpose  : 
395 //=======================================================================
396
397 void AdvApp2Var_Iso::SetConstante(const Standard_Real newcte)
398 {
399   myConstPar = newcte;
400 }
401
402 //=======================================================================
403 //function : SetPosition
404 //purpose  : 
405 //=======================================================================
406
407 void AdvApp2Var_Iso::SetPosition(const Standard_Integer newpos)
408 {
409   myPosition = newpos;
410 }
411
412 //=======================================================================
413 //function : ResetApprox
414 //purpose  : 
415 //=======================================================================
416
417 void AdvApp2Var_Iso::ResetApprox()
418 {
419   myApprIsDone = Standard_False;
420   myHasResult = Standard_False;
421 }
422
423 //=======================================================================
424 //function : OverwriteApprox
425 //purpose  : 
426 //=======================================================================
427
428 void AdvApp2Var_Iso::OverwriteApprox()
429 {
430   if (myHasResult) myApprIsDone = Standard_True;
431 }
432
433 //=======================================================================
434 //function : Type
435 //purpose  : 
436 //=======================================================================
437
438 GeomAbs_IsoType AdvApp2Var_Iso::Type() const 
439 {
440   return myType;
441 }
442
443 //=======================================================================
444 //function : Constante
445 //purpose  : 
446 //=======================================================================
447
448 Standard_Real AdvApp2Var_Iso::Constante() const 
449 {
450   return myConstPar;
451 }
452
453 //=======================================================================
454 //function : T0
455 //purpose  : 
456 //=======================================================================
457
458 Standard_Real AdvApp2Var_Iso::T0() const 
459 {
460   if (myType==GeomAbs_IsoU) {
461     return myV0;
462   }
463   else {
464     return myU0;
465   }
466 }
467
468 //=======================================================================
469 //function : T1
470 //purpose  : 
471 //=======================================================================
472
473 Standard_Real AdvApp2Var_Iso::T1() const 
474 {
475   if (myType==GeomAbs_IsoU) {
476     return myV1;
477   }
478   else {
479     return myU1;
480   }
481 }
482
483 //=======================================================================
484 //function : U0
485 //purpose  : 
486 //=======================================================================
487
488 Standard_Real AdvApp2Var_Iso::U0() const 
489 {
490   return myU0;
491 }
492
493 //=======================================================================
494 //function : U1
495 //purpose  : 
496 //=======================================================================
497
498 Standard_Real AdvApp2Var_Iso::U1() const 
499 {
500   return myU1;
501 }
502
503 //=======================================================================
504 //function : V0
505 //purpose  : 
506 //=======================================================================
507
508 Standard_Real AdvApp2Var_Iso::V0() const 
509 {
510   return myV0;
511 }
512
513 //=======================================================================
514 //function : V1
515 //purpose  : 
516 //=======================================================================
517
518 Standard_Real AdvApp2Var_Iso::V1() const 
519 {
520   return myV1;
521 }
522
523 //=======================================================================
524 //function : UOrder
525 //purpose  : 
526 //=======================================================================
527
528 Standard_Integer AdvApp2Var_Iso::UOrder() const 
529 {
530   if (Type()==GeomAbs_IsoU) return myDerivOrder;
531   else return myExtremOrder;
532 }
533
534
535 //=======================================================================
536 //function : VOrder
537 //purpose  : 
538 //=======================================================================
539
540 Standard_Integer AdvApp2Var_Iso::VOrder() const 
541 {
542   if (Type()==GeomAbs_IsoV) return myDerivOrder;
543   else return myExtremOrder;
544 }
545
546 //=======================================================================
547 //function : Position
548 //purpose  : 
549 //=======================================================================
550
551 Standard_Integer AdvApp2Var_Iso::Position() const 
552 {
553   return myPosition;
554 }
555
556 //=======================================================================
557 //function : NbCoeff
558 //purpose  : 
559 //=======================================================================
560
561
562 Standard_Integer AdvApp2Var_Iso::NbCoeff() const 
563 {
564   return myNbCoeff;
565 }
566
567 //=======================================================================
568 //function : Polynom
569 //purpose  : 
570 //=======================================================================
571
572 const Handle(TColStd_HArray1OfReal)& AdvApp2Var_Iso::Polynom() const 
573 {
574   return myEquation;
575 }
576
577 Handle(TColStd_HArray1OfReal) AdvApp2Var_Iso::SomTab() const 
578 {
579   return mySomTab;
580 }
581
582 Handle(TColStd_HArray1OfReal) AdvApp2Var_Iso::DifTab() const 
583 {
584   return myDifTab;
585 }
586
587 Handle(TColStd_HArray2OfReal) AdvApp2Var_Iso::MaxErrors() const 
588 {
589   return myMaxErrors;
590 }
591
592 Handle(TColStd_HArray2OfReal) AdvApp2Var_Iso::MoyErrors() const 
593 {
594   return myMoyErrors;
595 }
596
597
598
599
600
601
602
603
604
605