1 // Created on: 1997-05-28
2 // Created by: Sergey SOKOLOV
3 // Copyright (c) 1997-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
22 #include <PLib_DoubleJacobiPolynomial.ixx>
23 #include <PLib_JacobiPolynomial.hxx>
24 #include <math_Vector.hxx>
26 //=======================================================================
27 //function : PLib_DoubleJacobiPolynomial
29 //=======================================================================
31 PLib_DoubleJacobiPolynomial::PLib_DoubleJacobiPolynomial()
36 //=======================================================================
37 //function : PLib_DoubleJacobiPolynomial
39 //=======================================================================
41 PLib_DoubleJacobiPolynomial::PLib_DoubleJacobiPolynomial(const Handle(PLib_JacobiPolynomial)& JacPolU,
42 const Handle(PLib_JacobiPolynomial)& JacPolV) :
46 Handle (TColStd_HArray1OfReal) TabMaxU =
47 new TColStd_HArray1OfReal (0,JacPolU->WorkDegree()-2*(JacPolU->NivConstr()+1));
48 JacPolU->MaxValue(TabMaxU->ChangeArray1());
51 Handle (TColStd_HArray1OfReal) TabMaxV =
52 new TColStd_HArray1OfReal (0,JacPolV->WorkDegree()-2*(JacPolV->NivConstr()+1));
53 JacPolV->MaxValue(TabMaxV->ChangeArray1());
57 //=======================================================================
58 //function : MaxErrorU
60 //=======================================================================
63 PLib_DoubleJacobiPolynomial::MaxErrorU(const Standard_Integer Dimension,
64 const Standard_Integer DegreeU,
65 const Standard_Integer DegreeV,
66 const Standard_Integer dJacCoeff,
67 const TColStd_Array1OfReal& JacCoeff) const
69 Standard_Integer ii,idim,dJac,MinU,MinV,WorkDegreeU,WorkDegreeV;
72 math_Vector MaxErrDim(1,Dimension,0.);
74 MinU = 2*(myJacPolU->NivConstr()+1);
75 MinV = 2*(myJacPolV->NivConstr()+1);
76 WorkDegreeU = myJacPolU->WorkDegree();
77 WorkDegreeV = myJacPolV->WorkDegree();
79 Bid0 = myTabMaxV->Value(DegreeV-MinV);
80 for (idim=1; idim<=Dimension; idim++) {
81 dJac = dJacCoeff + (idim-1)*(WorkDegreeU+1)*(WorkDegreeV+1);
82 for (ii=MinU; ii<=DegreeU; ii++) {
83 MaxErrDim(idim) += (Abs(JacCoeff(ii + DegreeV*(WorkDegreeU+1) + dJac)) *
84 myTabMaxU->Value(ii-MinU) * Bid0);
87 return (MaxErrDim.Norm());
90 //=======================================================================
91 //function : MaxErrorV
93 //=======================================================================
96 PLib_DoubleJacobiPolynomial::MaxErrorV(const Standard_Integer Dimension,
97 const Standard_Integer DegreeU,
98 const Standard_Integer DegreeV,
99 const Standard_Integer dJacCoeff,
100 const TColStd_Array1OfReal& JacCoeff) const
102 Standard_Integer jj,idim,dJac,MinU,MinV,WorkDegreeU,WorkDegreeV;
105 math_Vector MaxErrDim(1,Dimension,0.);
107 MinU = 2*(myJacPolU->NivConstr()+1);
108 MinV = 2*(myJacPolV->NivConstr()+1);
109 WorkDegreeU = myJacPolU->WorkDegree();
110 WorkDegreeV = myJacPolV->WorkDegree();
112 Bid0 = myTabMaxU->Value(DegreeU-MinU);
113 for (idim=1; idim<=Dimension; idim++) {
114 dJac = dJacCoeff + (idim-1)*(WorkDegreeU+1)*(WorkDegreeV+1);
115 for (jj=MinV; jj<=DegreeV; jj++) {
116 MaxErrDim(idim) += (Abs(JacCoeff(DegreeU + jj*(WorkDegreeU+1) + dJac)) *
117 myTabMaxV->Value(jj-MinV) * Bid0);
120 return (MaxErrDim.Norm());
123 //=======================================================================
124 //function : MaxError
126 //=======================================================================
129 PLib_DoubleJacobiPolynomial::MaxError(const Standard_Integer Dimension,
130 const Standard_Integer MinDegreeU,
131 const Standard_Integer MaxDegreeU,
132 const Standard_Integer MinDegreeV,
133 const Standard_Integer MaxDegreeV,
134 const Standard_Integer dJacCoeff,
135 const TColStd_Array1OfReal& JacCoeff,
136 const Standard_Real Error) const
138 Standard_Integer ii,jj,idim,dJac,MinU,MinV,WorkDegreeU,WorkDegreeV;
139 Standard_Real Bid0,Bid1;
141 math_Vector MaxErrDim(1,Dimension,0.);
143 MinU = 2*(myJacPolU->NivConstr()+1);
144 MinV = 2*(myJacPolV->NivConstr()+1);
145 WorkDegreeU = myJacPolU->WorkDegree();
146 WorkDegreeV = myJacPolV->WorkDegree();
148 //------------------- Calcul du majorant de l'erreur max ---------------
149 //----- lorsque sont enleves les coeff. d'indices MinDegreeU a MaxDegreeU ------
150 //---------------- en U et d'indices MinDegreeV a MaxDegreeV en V --------------
152 for (idim=1; idim<=Dimension; idim++) {
153 dJac = dJacCoeff + (idim-1)*(WorkDegreeU+1)*(WorkDegreeV+1);
155 for (jj=MinDegreeV; jj<=MaxDegreeV; jj++) {
157 for (ii=MinDegreeU; ii<=MaxDegreeU; ii++) {
158 Bid0 += fabs(JacCoeff(ii + jj*(WorkDegreeU+1) + dJac)) * myTabMaxU->Value(ii-MinU);
160 Bid1 += Bid0 * myTabMaxV->Value(jj-MinV);
162 MaxErrDim(idim) = Bid1;
165 //----------------------- Calcul de l' erreur max ----------------------
167 math_Vector MaxErr2(1,2);
169 MaxErr2(2) = MaxErrDim.Norm();
170 return (MaxErr2.Norm());
173 //=======================================================================
174 //function : ReduceDegree
176 //=======================================================================
178 void PLib_DoubleJacobiPolynomial::ReduceDegree(const Standard_Integer Dimension,
179 const Standard_Integer MinDegreeU,
180 const Standard_Integer MaxDegreeU,
181 const Standard_Integer MinDegreeV,
182 const Standard_Integer MaxDegreeV,
183 const Standard_Integer dJacCoeff,
184 const TColStd_Array1OfReal& JacCoeff,
185 const Standard_Real EpmsCut,
186 Standard_Real& MaxError,
187 Standard_Integer& NewDegreeU,
188 Standard_Integer& NewDegreeV) const
190 Standard_Integer NewU,NewV;
191 Standard_Real ErrU,ErrV;
195 math_Vector MaxErr2(1,2);
197 //**********************************************************************
198 //-------------------- Coupure des coefficients ------------------------
199 //**********************************************************************
203 //------------------- Calcul du majorant de l'erreur max ---------------
204 //----- lorsque sont enleves les coeff. d'indices MinU a NewU ------
205 //---------------- en U, le degre en V etant fixe a NewV -----------------
206 if (NewV > MinDegreeV)
207 ErrV = MaxErrorU(Dimension,NewU,NewV,dJacCoeff,JacCoeff);
212 //------------------- Calcul du majorant de l'erreur max ---------------
213 //----- lorsque sont enleves les coeff. d'indices MinV a NewV ------
214 //---------------- en V, le degre en U etant fixe a NewU -----------------
215 if (NewU > MinDegreeU)
216 ErrU = MaxErrorV(Dimension,NewU,NewV,dJacCoeff,JacCoeff);
221 //----------------------- Calcul de l' erreur max ----------------------
222 MaxErr2(1) = MaxError;
224 ErrU = MaxErr2.Norm();
226 ErrV = MaxErr2.Norm();
229 if (ErrV < EpmsCut) {
235 if (ErrU < EpmsCut) {
241 while (ErrU > ErrV && ErrV <= EpmsCut || ErrV >= ErrU && ErrU <= EpmsCut);
243 //-------------------------- Recuperation des degres -------------------
245 NewDegreeU = Max(NewU,1);
246 NewDegreeV = Max(NewV,1);
249 //=======================================================================
250 //function : AverageError
252 //=======================================================================
255 PLib_DoubleJacobiPolynomial::AverageError(const Standard_Integer Dimension,
256 const Standard_Integer DegreeU,
257 const Standard_Integer DegreeV,
258 const Standard_Integer dJacCoeff,
259 const TColStd_Array1OfReal& JacCoeff) const
261 Standard_Integer ii,jj,idim,dJac,IDebU,IDebV,MinU,MinV,WorkDegreeU,WorkDegreeV;
262 Standard_Real Bid0,Bid1,AverageErr;
264 //----------------------------- Initialisations ------------------------
266 IDebU = 2*(myJacPolU->NivConstr()+1);
267 IDebV = 2*(myJacPolV->NivConstr()+1);
268 MinU = Max(IDebU,DegreeU);
269 MinV = Max(IDebV,DegreeV);
270 WorkDegreeU = myJacPolU->WorkDegree();
271 WorkDegreeV = myJacPolV->WorkDegree();
274 //------------------ Calcul du majorant de l'erreur moyenne ------------
275 //----- lorsque sont enleves les coeff. d'indices DegreeU a WorkDegreeU ------
276 //---------------- en U et d'indices DegreeV a WorkDegreeV en V --------------
278 for (idim=1; idim<=Dimension; idim++) {
279 dJac = dJacCoeff + (idim-1)*(WorkDegreeU+1)*(WorkDegreeV+1);
280 for (jj=MinV; jj<=WorkDegreeV; jj++) {
281 for (ii=IDebU; ii<=WorkDegreeU; ii++) {
282 Bid1 = JacCoeff(ii + jj*(WorkDegreeU+1) + dJac);
286 for (jj=IDebV; jj<=MinV-1; jj++) {
287 for (ii=MinU; ii<=WorkDegreeU; ii++) {
288 Bid1 = JacCoeff(ii + jj*(WorkDegreeU+1) + dJac);
293 AverageErr = sqrt(Bid0/4);
297 //=======================================================================
298 //function : WDoubleJacobiToCoefficients
300 //=======================================================================
302 void PLib_DoubleJacobiPolynomial::WDoubleJacobiToCoefficients(const Standard_Integer Dimension,
303 const Standard_Integer DegreeU,
304 const Standard_Integer DegreeV,
305 const TColStd_Array1OfReal& JacCoeff,
306 TColStd_Array1OfReal& Coefficients) const
308 Standard_Integer iu,iv,idim,WorkDegreeU,WorkDegreeV;
310 Coefficients.Init(0.);
312 WorkDegreeU = myJacPolU->WorkDegree();
313 WorkDegreeV = myJacPolV->WorkDegree();
315 TColStd_Array1OfReal Aux1(0, (DegreeU+1)*(DegreeV+1)*Dimension-1);
316 TColStd_Array1OfReal Aux2(0, (DegreeU+1)*(DegreeV+1)*Dimension-1);
318 for (iu=0; iu<=DegreeU; iu++) {
319 for (iv=0; iv<=DegreeV; iv++) {
320 for (idim=1; idim<=Dimension; idim++) {
321 Aux1(idim-1 + iv*Dimension + iu*Dimension*(DegreeV+1)) =
322 JacCoeff(iu + iv*(WorkDegreeU+1) + (idim-1)*(WorkDegreeU+1)*(WorkDegreeV+1));
326 // Passage dans canonique en u.
327 myJacPolU->ToCoefficients(Dimension*(DegreeV+1),DegreeU,Aux1,Aux2);
329 // Permutation des u et des v.
330 for (iu=0; iu<=DegreeU; iu++) {
331 for (iv=0; iv<=DegreeV; iv++) {
332 for (idim=1; idim<=Dimension; idim++) {
333 Aux1(idim-1 + iu*Dimension + iv*Dimension*(DegreeU+1)) =
334 Aux2(idim-1 + iv*Dimension + iu*Dimension*(DegreeV+1));
338 // Passage dans canonique en v.
339 myJacPolV->ToCoefficients(Dimension*(DegreeU+1),DegreeV,Aux1,Aux2);
341 // Permutation des u et des v.
342 for (iu=0; iu<=DegreeU; iu++) {
343 for (iv=0; iv<=DegreeV; iv++) {
344 for (idim=1; idim<=Dimension; idim++) {
345 Coefficients(iu + iv*(DegreeU+1) + (idim-1)*(DegreeU+1)*(DegreeV+1)) =
346 Aux2(idim-1 + iu*Dimension + iv*Dimension*(DegreeU+1));