0024002: Overall code and build procedure refactoring -- automatic
[occt.git] / src / AdvApp2Var / AdvApp2Var_Context.cxx
CommitLineData
b311480e 1// Created on: 1996-07-02
2// Created by: Joelle CHAUVET
3// Copyright (c) 1996-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 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
973c2be1 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.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
42cf5bc1 17
7fd59977 18#include <AdvApp2Var_ApproxF2var.hxx>
42cf5bc1 19#include <AdvApp2Var_Context.hxx>
20#include <Standard_ConstructionError.hxx>
7fd59977 21
0d969553 22// Calculaton of parameters
7fd59977 23static Standard_Boolean lesparam(const Standard_Integer iordre,
24 const Standard_Integer ncflim,
25 const Standard_Integer icodeo,
26 Standard_Integer& nbpnts,
27 Standard_Integer& ndgjac)
28{
0d969553
Y
29 // jacobi degree
30 ndgjac = ncflim; // it always keeps a reserve coefficient
7fd59977 31 if (icodeo< 0) return Standard_False;
32 if (icodeo > 0) {
0d969553 33 ndgjac += (9 - (iordre+1)); //iordre rescales the frequences upwards
7fd59977 34 ndgjac += (icodeo-1)*10;
35 }
0d969553 36 // ---> Min Number of required pointss.
7fd59977 37 if (ndgjac < 8) { nbpnts = 8; }
38 else if (ndgjac < 10) { nbpnts = 10; }
0d969553 39 // else if (ndgjac < 15) { nbpnt = 15; } Bug Uneven number
7fd59977 40 else if (ndgjac < 20) { nbpnts = 20;}
0d969553 41 // else if (ndgjac < 25) { nbpnt = 25; } Bug Uneven number
7fd59977 42 else if (ndgjac < 30) { nbpnts = 30;}
43 else if (ndgjac < 40) { nbpnts = 40;}
44 else if (ndgjac < 50) { nbpnts = 50;}
0d969553 45 // else if (*ndgjac < 61) { nbpnt = 61;} Bug Uneven number
7fd59977 46 else {
47 nbpnts = 50;
0797d9d3 48#ifdef OCCT_DEBUG
0d969553 49 cout << "F(U, V) : Not enough points of discretization" << endl;
7fd59977 50#endif
51 }
52
0d969553 53 // If constraints are on borders, this adds 2 points
7fd59977 54 if (iordre>-1) { nbpnts += 2;}
55
56 return Standard_True;
57}
58//============================================================================
59//function : AdvApp2Var_Context
60//purpose :
61//============================================================================
62
63 AdvApp2Var_Context::
64AdvApp2Var_Context()
65{
66}
67
68//============================================================================
69//function : AdvApp2Var_Context
70//purpose :
71//============================================================================
72
73 AdvApp2Var_Context::
74AdvApp2Var_Context(const Standard_Integer ifav,
75 const Standard_Integer iu,
76 const Standard_Integer iv,
77 const Standard_Integer nlimu,
78 const Standard_Integer nlimv,
79 const Standard_Integer iprecis,
80 const Standard_Integer nb1Dss,
81 const Standard_Integer nb2Dss,
82 const Standard_Integer nb3Dss,
83 const Handle(TColStd_HArray1OfReal)& tol1D,
84 const Handle(TColStd_HArray1OfReal)& tol2D,
85 const Handle(TColStd_HArray1OfReal)& tol3D,
86 const Handle(TColStd_HArray2OfReal)& tof1D,
87 const Handle(TColStd_HArray2OfReal)& tof2D,
88 const Handle(TColStd_HArray2OfReal)& tof3D) :
89myFav(ifav),
90myOrdU(iu),
91myOrdV(iv),
92myLimU(nlimu),
93myLimV(nlimv),
94myNb1DSS(nb1Dss),
95myNb2DSS(nb2Dss),
96myNb3DSS(nb3Dss)
97{
98Standard_Integer ErrorCode=0,NbPntU=0,JDegU=0,NbPntV=0,JDegV=0;
99Standard_Integer ncfl;
100
101// myNbURoot,myJDegU
102ncfl = nlimu;
103if (ncfl<2*iu+2) ncfl = 2*iu+2;
104if (!lesparam(iu,ncfl,iprecis,NbPntU,JDegU) )
105 { Standard_ConstructionError::Raise("AdvApp2Var_Context");}
106myNbURoot = NbPntU;
107myJDegU = JDegU;
108if (iu>-1) NbPntU = myNbURoot - 2;
109
110// myJMaxU
111Standard_Integer i,j,size = JDegU-2*iu-1;
112Handle (TColStd_HArray1OfReal) JMaxU =
113 new TColStd_HArray1OfReal(1,size);
114Standard_Real *JU_array =
115 (Standard_Real *) &JMaxU->ChangeArray1()(JMaxU->Lower());
116AdvApp2Var_ApproxF2var::mma2jmx_(&JDegU,(integer *)&iu,JU_array);
117myJMaxU = JMaxU;
118
119// myNbVRoot,myJDegV
120ncfl = nlimv;
121if (ncfl<2*iv+2) ncfl = 2*iv+2;
122//Ma1nbp(&iv,&ncfl,&iprec,&NbPntV,&JDegV,&ErrorCode);
123if (!lesparam(iv, ncfl, iprecis, NbPntV, JDegV) )
124 { Standard_ConstructionError::Raise("AdvApp2Var_Context");}
125myNbVRoot = NbPntV;
126myJDegV = JDegV;
127if (iv>-1) NbPntV = myNbVRoot - 2;
128
129// myJMaxV
130size = JDegV-2*iv-1;
131Handle (TColStd_HArray1OfReal) JMaxV =
132 new TColStd_HArray1OfReal(1,size);
133Standard_Real *JV_array =
134 (Standard_Real *) &JMaxV->ChangeArray1()(JMaxV->Lower());
135AdvApp2Var_ApproxF2var::mma2jmx_(&JDegV,(integer *)&iv,JV_array);
136myJMaxV = JMaxV;
137
138// myURoots, myVRoots
139Handle (TColStd_HArray1OfReal) URoots =
140 new TColStd_HArray1OfReal(1,myNbURoot);
141Standard_Real *U_array =
142 (Standard_Real *) &URoots->ChangeArray1()(URoots->Lower());
143Handle (TColStd_HArray1OfReal) VRoots =
144 new TColStd_HArray1OfReal(1,myNbVRoot);
145Standard_Real *V_array =
146 (Standard_Real *) &VRoots->ChangeArray1()(VRoots->Lower());
147AdvApp2Var_ApproxF2var::mma2roo_(&NbPntU,&NbPntV,U_array,V_array);
148myURoots = URoots;
149myVRoots = VRoots;
150
151// myUGauss
152size = (NbPntU/2+1)*(myJDegU-2*iu-1);
153Handle (TColStd_HArray1OfReal) UGauss =
154 new TColStd_HArray1OfReal(1,size);
155Standard_Real *UG_array =
156 (Standard_Real *) &UGauss->ChangeArray1()(UGauss->Lower());
157AdvApp2Var_ApproxF2var::mmapptt_(&JDegU,&NbPntU,&iu,UG_array,&ErrorCode);
158if (ErrorCode != 0 ) {
159 Standard_ConstructionError::Raise("AdvApp2Var_Context : Error in FORTRAN");
160}
161myUGauss = UGauss;
162
163// myVGauss
164size = (NbPntV/2+1)*(myJDegV-2*iv-1);
165Handle (TColStd_HArray1OfReal) VGauss =
166 new TColStd_HArray1OfReal(1,size);
167Standard_Real *VG_array =
168 (Standard_Real *) &VGauss->ChangeArray1()(VGauss->Lower());
169AdvApp2Var_ApproxF2var::mmapptt_(&JDegV,&NbPntV,&iv,VG_array,&ErrorCode);
170if (ErrorCode != 0 ) {
171 Standard_ConstructionError::Raise("AdvApp2Var_Context : Error in FORTRAN");
172}
173myVGauss = VGauss;
174
175//myInternalTol, myFrontierTol, myCuttingTol
176Standard_Integer nbss = nb1Dss + nb2Dss + nb3Dss;
177Handle (TColStd_HArray1OfReal) ITol =
178 new TColStd_HArray1OfReal(1,nbss);
179for (i=1;i<=nb1Dss;i++) {
180 ITol->SetValue(i,tol1D->Value(i));
181}
182for (i=1;i<=nb2Dss;i++) {
183 ITol->SetValue(i+nb1Dss,tol2D->Value(i));
184}
185for (i=1;i<=nb3Dss;i++) {
186 ITol->SetValue(i+nb1Dss+nb2Dss,tol3D->Value(i));
187}
188if (iu>-1||iv>-1) {
189 for (i=1;i<=nbss;i++) { ITol->SetValue(i,ITol->Value(i)/2); }
190}
191Handle (TColStd_HArray2OfReal) FTol =
192 new TColStd_HArray2OfReal(1,nbss,1,4);
193Handle (TColStd_HArray2OfReal) CTol =
194 new TColStd_HArray2OfReal(1,nbss,1,4);
195for (i=1;i<=nb1Dss;i++) {
196for (j=1;j<=4;j++) {
197 FTol->SetValue(i,j,tof1D->Value(i,j));
198 CTol->SetValue(i,j,0);
199}
200}
201for (i=1;i<=nb2Dss;i++) {
202for (j=1;j<=4;j++) {
203 FTol->SetValue(nb1Dss+i,j,tof2D->Value(i,j));
204 CTol->SetValue(nb1Dss+i,j,0);
205}
206}
207for (i=1;i<=nb3Dss;i++) {
208for (j=1;j<=4;j++) {
209 FTol->SetValue(nb1Dss+nb2Dss+i,j,tof3D->Value(i,j));
210 CTol->SetValue(nb1Dss+nb2Dss+i,j,0);
211}
212}
213if (iu>-1||iv>-1) {
214 Standard_Real tolmin, poids, hmax[4];
215 hmax[0] = 0;
216 hmax[1] = 1;
217 hmax[2] = 1.5;
218 hmax[3] = 1.75;
219 poids = hmax[iu+1]*hmax[iv+1] + hmax[iu+1] + hmax[iv+1];
220 for (i=1;i<=nbss;i++) {
221 for (j=1;j<=4;j++) {
222 tolmin = (ITol->Value(i))/poids;
223 if (tolmin<FTol->Value(i,j)) FTol->SetValue(i,j,tolmin);
224 CTol->SetValue(i,j,tolmin);
225 }
226 }
227}
228myInternalTol = ITol;
229myFrontierTol = FTol;
230myCuttingTol = CTol;
231}
232
233//============================================================================
234//function : TotalDimension
235//purpose :
236//============================================================================
237
238Standard_Integer AdvApp2Var_Context::TotalDimension() const
239{
240 return myNb1DSS + 2*myNb2DSS + 3*myNb3DSS;
241}
242
243//============================================================================
244//function : TotalNumberSSP
245//purpose :
246//============================================================================
247
248Standard_Integer AdvApp2Var_Context::TotalNumberSSP() const
249{
250 return myNb1DSS + myNb2DSS + myNb3DSS;
251}
252
253//============================================================================
254//function : FavorIso
255//purpose : return 1 for IsoU, 2 for IsoV, 2 by default
256//============================================================================
257
258Standard_Integer AdvApp2Var_Context::FavorIso() const
259{
260 return myFav;
261}
262
263//============================================================================
264//function : UOrder
265//purpose : return the order of continuity requested in U
266//============================================================================
267
268Standard_Integer AdvApp2Var_Context::UOrder() const
269{
270 return myOrdU;
271}
272
273//============================================================================
274//function : VOrder
275//purpose : return the order of continuity requested in V
276//============================================================================
277
278Standard_Integer AdvApp2Var_Context::VOrder() const
279{
280 return myOrdV;
281}
282
283//============================================================================
284//function : ULimit
285//purpose : return the max number of coeff. in U of the polynomial approx.
286//============================================================================
287
288Standard_Integer AdvApp2Var_Context::ULimit() const
289{
290 return myLimU;
291}
292
293//============================================================================
294//function : VLimit
295//purpose : return the max number of coeff. in V of the polynomial approx.
296//============================================================================
297
298Standard_Integer AdvApp2Var_Context::VLimit() const
299{
300 return myLimV;
301}
302
303//============================================================================
304//function : UJacDeg
305//purpose : return the max degree of the Jacobi functions for U parameter
306//============================================================================
307
308Standard_Integer AdvApp2Var_Context::UJacDeg() const
309{
310 return myJDegU;
311}
312
313//============================================================================
314//function : VJacDeg
315//purpose : return the max degree of the Jacobi functions for V parameter
316//============================================================================
317
318Standard_Integer AdvApp2Var_Context::VJacDeg() const
319{
320 return myJDegV;
321}
322
323//============================================================================
324//function : UJacMax
325//purpose : return the max value of the Jacobi functions for U parameter
326//============================================================================
327
328Handle(TColStd_HArray1OfReal) AdvApp2Var_Context::UJacMax() const
329{
330 return myJMaxU;
331}
332
333//============================================================================
334//function : VJacMax
335//purpose : return the max value of the Jacobi functions for V parameter
336//============================================================================
337
338Handle(TColStd_HArray1OfReal) AdvApp2Var_Context::VJacMax() const
339{
340 return myJMaxV;
341}
342
343//============================================================================
344//function : URoots
345//purpose : return Legendre roots for U parameter
346//============================================================================
347
348Handle(TColStd_HArray1OfReal) AdvApp2Var_Context::URoots() const
349{
350 return myURoots;
351}
352
353//============================================================================
354//function : VRoots
355//purpose : return Legendre roots for V parameter
356//============================================================================
357
358Handle(TColStd_HArray1OfReal) AdvApp2Var_Context::VRoots() const
359{
360 return myVRoots;
361}
362
363//============================================================================
364//function : UGauss
365//purpose : return Gauss roots for U parameter
366//============================================================================
367
368Handle(TColStd_HArray1OfReal) AdvApp2Var_Context::UGauss() const
369{
370 return myUGauss;
371}
372
373//============================================================================
374//function : VGauss
375//purpose : return Gauss roots for V parameter
376//============================================================================
377
378Handle(TColStd_HArray1OfReal) AdvApp2Var_Context::VGauss() const
379{
380 return myVGauss;
381}
382
383//============================================================================
384//function : IToler
385//purpose : return tolerances for the approximation of patches
386//============================================================================
387
388Handle(TColStd_HArray1OfReal) AdvApp2Var_Context::IToler() const
389{
390 return myInternalTol;
391}
392
393//============================================================================
394//function : FToler
395//purpose : return tolerances for the approximation of frontiers
396//============================================================================
397
398Handle(TColStd_HArray2OfReal) AdvApp2Var_Context::FToler() const
399{
400 return myFrontierTol;
401}
402
403//============================================================================
404//function : CToler
405//purpose : return tolerances for the approximation of cutting lines
406//============================================================================
407
408Handle(TColStd_HArray2OfReal) AdvApp2Var_Context::CToler() const
409{
410 return myCuttingTol;
411}
412