0024002: Overall code and build procedure refactoring -- automatic
[occt.git] / src / AdvApp2Var / AdvApp2Var_Context.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
18 #include <AdvApp2Var_ApproxF2var.hxx>
19 #include <AdvApp2Var_Context.hxx>
20 #include <Standard_ConstructionError.hxx>
21
22 // Calculaton of parameters
23 static 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 {
29   // jacobi degree
30   ndgjac = ncflim; // it always keeps a reserve coefficient
31   if (icodeo< 0) return Standard_False;
32   if (icodeo > 0) {
33     ndgjac += (9 - (iordre+1)); //iordre rescales the frequences upwards
34     ndgjac += (icodeo-1)*10;
35   }
36   // ---> Min Number of required pointss.
37   if (ndgjac < 8) { nbpnts = 8;  } 
38   else if (ndgjac < 10) { nbpnts = 10; }
39   //  else if (ndgjac < 15) { nbpnt = 15; } Bug Uneven number
40   else if (ndgjac < 20) { nbpnts = 20;}
41   //  else if (ndgjac < 25) { nbpnt = 25; } Bug Uneven number
42   else if (ndgjac < 30) { nbpnts = 30;}
43   else if (ndgjac < 40) { nbpnts = 40;}
44   else if (ndgjac < 50) { nbpnts = 50;}
45   //  else if (*ndgjac < 61) { nbpnt = 61;} Bug Uneven number
46   else {
47     nbpnts = 50;
48 #ifdef OCCT_DEBUG
49     cout << "F(U, V) : Not enough points of discretization" << endl; 
50 #endif
51   }
52
53   // If constraints are on borders, this adds 2 points
54   if (iordre>-1) {  nbpnts += 2;}
55
56   return Standard_True;
57 }
58 //============================================================================
59 //function : AdvApp2Var_Context
60 //purpose  :
61 //============================================================================
62
63  AdvApp2Var_Context::
64 AdvApp2Var_Context()
65 {
66 }
67
68 //============================================================================
69 //function : AdvApp2Var_Context
70 //purpose  :
71 //============================================================================
72
73  AdvApp2Var_Context::
74 AdvApp2Var_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) :
89 myFav(ifav),
90 myOrdU(iu),
91 myOrdV(iv),
92 myLimU(nlimu),
93 myLimV(nlimv),
94 myNb1DSS(nb1Dss),
95 myNb2DSS(nb2Dss),
96 myNb3DSS(nb3Dss)
97 {
98 Standard_Integer ErrorCode=0,NbPntU=0,JDegU=0,NbPntV=0,JDegV=0;
99 Standard_Integer ncfl;
100
101 // myNbURoot,myJDegU
102 ncfl = nlimu;
103 if (ncfl<2*iu+2) ncfl = 2*iu+2;
104 if (!lesparam(iu,ncfl,iprecis,NbPntU,JDegU) )
105   { Standard_ConstructionError::Raise("AdvApp2Var_Context");}
106 myNbURoot = NbPntU;
107 myJDegU = JDegU;
108 if (iu>-1) NbPntU = myNbURoot - 2;
109
110 // myJMaxU
111 Standard_Integer i,j,size = JDegU-2*iu-1;
112 Handle (TColStd_HArray1OfReal) JMaxU =
113   new TColStd_HArray1OfReal(1,size);
114 Standard_Real *JU_array =
115   (Standard_Real *) &JMaxU->ChangeArray1()(JMaxU->Lower());
116 AdvApp2Var_ApproxF2var::mma2jmx_(&JDegU,(integer *)&iu,JU_array);
117 myJMaxU = JMaxU;
118
119 // myNbVRoot,myJDegV
120 ncfl = nlimv;
121 if (ncfl<2*iv+2) ncfl = 2*iv+2;
122 //Ma1nbp(&iv,&ncfl,&iprec,&NbPntV,&JDegV,&ErrorCode);
123 if (!lesparam(iv, ncfl, iprecis, NbPntV, JDegV) )
124   { Standard_ConstructionError::Raise("AdvApp2Var_Context");}
125 myNbVRoot = NbPntV;
126 myJDegV = JDegV;
127 if (iv>-1) NbPntV = myNbVRoot - 2;
128
129 // myJMaxV
130 size = JDegV-2*iv-1;
131 Handle (TColStd_HArray1OfReal) JMaxV =
132   new TColStd_HArray1OfReal(1,size);
133 Standard_Real *JV_array =
134   (Standard_Real *) &JMaxV->ChangeArray1()(JMaxV->Lower());
135 AdvApp2Var_ApproxF2var::mma2jmx_(&JDegV,(integer *)&iv,JV_array);
136 myJMaxV = JMaxV;
137
138 // myURoots, myVRoots
139 Handle (TColStd_HArray1OfReal) URoots =
140   new TColStd_HArray1OfReal(1,myNbURoot);
141 Standard_Real *U_array =
142   (Standard_Real *) &URoots->ChangeArray1()(URoots->Lower());
143 Handle (TColStd_HArray1OfReal) VRoots =
144   new TColStd_HArray1OfReal(1,myNbVRoot);
145 Standard_Real *V_array =
146   (Standard_Real *) &VRoots->ChangeArray1()(VRoots->Lower());
147 AdvApp2Var_ApproxF2var::mma2roo_(&NbPntU,&NbPntV,U_array,V_array);
148 myURoots = URoots;
149 myVRoots = VRoots;
150
151 // myUGauss
152 size = (NbPntU/2+1)*(myJDegU-2*iu-1);
153 Handle (TColStd_HArray1OfReal) UGauss =
154   new TColStd_HArray1OfReal(1,size);
155 Standard_Real *UG_array =
156   (Standard_Real *) &UGauss->ChangeArray1()(UGauss->Lower());
157 AdvApp2Var_ApproxF2var::mmapptt_(&JDegU,&NbPntU,&iu,UG_array,&ErrorCode);
158 if (ErrorCode != 0 ) {
159   Standard_ConstructionError::Raise("AdvApp2Var_Context : Error in FORTRAN");
160 }
161 myUGauss = UGauss;
162
163 // myVGauss
164 size = (NbPntV/2+1)*(myJDegV-2*iv-1);
165 Handle (TColStd_HArray1OfReal) VGauss =
166   new TColStd_HArray1OfReal(1,size);
167 Standard_Real *VG_array =
168   (Standard_Real *) &VGauss->ChangeArray1()(VGauss->Lower());
169 AdvApp2Var_ApproxF2var::mmapptt_(&JDegV,&NbPntV,&iv,VG_array,&ErrorCode);
170 if (ErrorCode != 0 ) {
171   Standard_ConstructionError::Raise("AdvApp2Var_Context : Error in FORTRAN");
172 }
173 myVGauss = VGauss;
174
175 //myInternalTol, myFrontierTol, myCuttingTol
176 Standard_Integer nbss = nb1Dss + nb2Dss + nb3Dss;
177 Handle (TColStd_HArray1OfReal) ITol =
178   new TColStd_HArray1OfReal(1,nbss);
179 for (i=1;i<=nb1Dss;i++) {
180   ITol->SetValue(i,tol1D->Value(i));
181 }
182 for (i=1;i<=nb2Dss;i++) {
183   ITol->SetValue(i+nb1Dss,tol2D->Value(i));
184 }
185 for (i=1;i<=nb3Dss;i++) {
186   ITol->SetValue(i+nb1Dss+nb2Dss,tol3D->Value(i));
187 }
188 if (iu>-1||iv>-1) {
189   for (i=1;i<=nbss;i++) { ITol->SetValue(i,ITol->Value(i)/2); }
190 }
191 Handle (TColStd_HArray2OfReal) FTol =
192   new TColStd_HArray2OfReal(1,nbss,1,4);
193 Handle (TColStd_HArray2OfReal) CTol =
194   new TColStd_HArray2OfReal(1,nbss,1,4);
195 for (i=1;i<=nb1Dss;i++) {
196 for (j=1;j<=4;j++) {
197   FTol->SetValue(i,j,tof1D->Value(i,j));
198   CTol->SetValue(i,j,0);
199 }
200 }
201 for (i=1;i<=nb2Dss;i++) {
202 for (j=1;j<=4;j++) {
203   FTol->SetValue(nb1Dss+i,j,tof2D->Value(i,j));
204   CTol->SetValue(nb1Dss+i,j,0);
205 }
206 }
207 for (i=1;i<=nb3Dss;i++) {
208 for (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 }
213 if (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 }
228 myInternalTol = ITol;
229 myFrontierTol = FTol;
230 myCuttingTol = CTol;
231 }
232
233 //============================================================================
234 //function : TotalDimension
235 //purpose  : 
236 //============================================================================
237
238 Standard_Integer AdvApp2Var_Context::TotalDimension() const 
239 {
240   return myNb1DSS + 2*myNb2DSS + 3*myNb3DSS; 
241 }
242
243 //============================================================================
244 //function : TotalNumberSSP
245 //purpose  :
246 //============================================================================
247
248 Standard_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
258 Standard_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
268 Standard_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
278 Standard_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
288 Standard_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
298 Standard_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
308 Standard_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
318 Standard_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
328 Handle(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
338 Handle(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
348 Handle(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
358 Handle(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
368 Handle(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
378 Handle(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
388 Handle(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
398 Handle(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
408 Handle(TColStd_HArray2OfReal) AdvApp2Var_Context::CToler() const 
409 {
410   return myCuttingTol;
411 }
412