}
Extrema_ExtCS::Extrema_ExtCS(const Adaptor3d_Curve& C,
- const Adaptor3d_Surface& S,
- const Standard_Real TolC,
- const Standard_Real TolS)
+ const Adaptor3d_Surface& S,
+ const Standard_Real TolC,
+ const Standard_Real TolS)
{
Initialize(S, S.FirstUParameter(), S.LastUParameter(),
- S.FirstVParameter(), S.LastVParameter(),
- TolC, TolS);
+ S.FirstVParameter(), S.LastVParameter(),
+ TolC, TolS);
Perform(C, C.FirstParameter(), C.LastParameter());
}
Extrema_ExtCS::Extrema_ExtCS(const Adaptor3d_Curve& C,
- const Adaptor3d_Surface& S,
- const Standard_Real UCinf,
- const Standard_Real UCsup,
- const Standard_Real Uinf,
- const Standard_Real Usup,
- const Standard_Real Vinf,
- const Standard_Real Vsup,
- const Standard_Real TolC,
- const Standard_Real TolS)
+ const Adaptor3d_Surface& S,
+ const Standard_Real UCinf,
+ const Standard_Real UCsup,
+ const Standard_Real Uinf,
+ const Standard_Real Usup,
+ const Standard_Real Vinf,
+ const Standard_Real Vsup,
+ const Standard_Real TolC,
+ const Standard_Real TolS)
{
Initialize(S, Uinf, Usup, Vinf, Vsup, TolC, TolS);
void Extrema_ExtCS::Initialize(const Adaptor3d_Surface& S,
- const Standard_Real Uinf,
- const Standard_Real Usup,
- const Standard_Real Vinf,
- const Standard_Real Vsup,
- const Standard_Real TolC,
- const Standard_Real TolS)
+ const Standard_Real Uinf,
+ const Standard_Real Usup,
+ const Standard_Real Vinf,
+ const Standard_Real Vsup,
+ const Standard_Real TolC,
+ const Standard_Real TolS)
{
myS = (Adaptor3d_SurfacePtr)&S;
myIsPar = Standard_False;
myStype = myS->GetType();
}
-
+
void Extrema_ExtCS::Perform(const Adaptor3d_Curve& C,
- const Standard_Real Uinf,
- const Standard_Real Usup)
+ const Standard_Real Uinf,
+ const Standard_Real Usup)
{
myucinf = Uinf;
myucsup = Usup;
case GeomAbs_Line:
{
-
+
switch(myStype) {
case GeomAbs_Sphere:
- myExtElCS.Perform(C.Line(), myS->Sphere());
- break;
+ myExtElCS.Perform(C.Line(), myS->Sphere());
+ break;
case GeomAbs_Cylinder:
- myExtElCS.Perform(C.Line(), myS->Cylinder());
- break;
+ myExtElCS.Perform(C.Line(), myS->Cylinder());
+ break;
case GeomAbs_Plane:
- myExtElCS.Perform(C.Line(), myS->Plane());
- if (myExtElCS.IsParallel()) break;
+ myExtElCS.Perform(C.Line(), myS->Plane());
+ if (myExtElCS.IsParallel()) break;
case GeomAbs_Torus:
case GeomAbs_Cone:
case GeomAbs_SurfaceOfExtrusion:
case GeomAbs_OffsetSurface:
case GeomAbs_OtherSurface:
- {
- Standard_Real cfirst = myucinf, clast = myucsup;
- Standard_Real ufirst = myS->FirstUParameter(), ulast = myS->LastUParameter(),
- vfirst = myS->FirstVParameter(), vlast = myS->LastVParameter();
+ {
+ Standard_Real cfirst = myucinf, clast = myucsup;
+ Standard_Real ufirst = myS->FirstUParameter(), ulast = myS->LastUParameter(),
+ vfirst = myS->FirstVParameter(), vlast = myS->LastVParameter();
- if(Precision::IsInfinite(Abs(cfirst)) || Precision::IsInfinite(Abs(clast))) {
+ if(Precision::IsInfinite(Abs(cfirst)) || Precision::IsInfinite(Abs(clast))) {
- Bnd_Box aSurfBox;
+ Bnd_Box aSurfBox;
BndLib_AddSurface::Add(*myS, ufirst, ulast, vfirst, vlast, Precision::Confusion(), aSurfBox);
- Standard_Real xmin, ymin, zmin, xmax, ymax, zmax;
- aSurfBox.Get(xmin, ymin, zmin, xmax, ymax, zmax);
- Standard_Real tmin = Precision::Infinite(), tmax = -tmin;
- gp_Lin aLin = C.Line();
-
-
- if(!( Precision::IsInfinite(Abs(xmin)) || Precision::IsInfinite(Abs(xmax)) ||
- Precision::IsInfinite(Abs(ymin)) || Precision::IsInfinite(Abs(ymax)) ||
- Precision::IsInfinite(Abs(zmin)) || Precision::IsInfinite(Abs(zmax))) ) {
-
- Extrema_ExtPElC anExt;
- Extrema_POnCurv aPntOnLin;
- Standard_Real aParOnLin;
- Standard_Real lim = Precision::Infinite();
- gp_Pnt aLimPntArray[8];
-
- aLimPntArray[0].SetCoord(xmin, ymin, zmin);
- aLimPntArray[1].SetCoord(xmax, ymin, zmin);
- aLimPntArray[2].SetCoord(xmin, ymax, zmin);
- aLimPntArray[3].SetCoord(xmax, ymax, zmin);
- aLimPntArray[4].SetCoord(xmin, ymin, zmax);
- aLimPntArray[5].SetCoord(xmax, ymin, zmax);
- aLimPntArray[6].SetCoord(xmin, ymax, zmax);
- aLimPntArray[7].SetCoord(xmax, ymax, zmax);
-
- for(i = 0; i <= 7; i++) {
- anExt.Perform(aLimPntArray[i], aLin, Precision::Confusion(), -lim, lim);
- aPntOnLin = anExt.Point(1);
- aParOnLin = aPntOnLin.Parameter();
- tmin = Min(aParOnLin, tmin);
- tmax = Max(aParOnLin, tmax);
- }
-
- }
- else {
- tmin = -1.e+50;
- tmax = 1.e+50;
- }
-
-
- cfirst = Max(cfirst, tmin);
- clast = Min(clast, tmax);
-
- }
-
-
-
- Extrema_GenExtCS Ext(C, *myS, NbT, NbU, NbV, cfirst, clast, ufirst, ulast,
- vfirst, vlast, mytolC, mytolS);
-
- myDone = Ext.IsDone();
- if (myDone) {
- Standard_Integer NbExt = Ext.NbExt();
- Standard_Real T,U,V;
- Extrema_POnCurv PC;
- Extrema_POnSurf PS;
- for (i = 1; i <= NbExt; i++) {
- PC = Ext.PointOnCurve(i);
- PS = Ext.PointOnSurface(i);
- T = PC.Parameter();
- PS.Parameter(U, V);
+ Standard_Real xmin, ymin, zmin, xmax, ymax, zmax;
+ aSurfBox.Get(xmin, ymin, zmin, xmax, ymax, zmax);
+ Standard_Real tmin = Precision::Infinite(), tmax = -tmin;
+ gp_Lin aLin = C.Line();
+
+
+ if(!( Precision::IsInfinite(Abs(xmin)) || Precision::IsInfinite(Abs(xmax)) ||
+ Precision::IsInfinite(Abs(ymin)) || Precision::IsInfinite(Abs(ymax)) ||
+ Precision::IsInfinite(Abs(zmin)) || Precision::IsInfinite(Abs(zmax))) ) {
+
+ Extrema_ExtPElC anExt;
+ Extrema_POnCurv aPntOnLin;
+ Standard_Real aParOnLin;
+ Standard_Real lim = Precision::Infinite();
+ gp_Pnt aLimPntArray[8];
+
+ aLimPntArray[0].SetCoord(xmin, ymin, zmin);
+ aLimPntArray[1].SetCoord(xmax, ymin, zmin);
+ aLimPntArray[2].SetCoord(xmin, ymax, zmin);
+ aLimPntArray[3].SetCoord(xmax, ymax, zmin);
+ aLimPntArray[4].SetCoord(xmin, ymin, zmax);
+ aLimPntArray[5].SetCoord(xmax, ymin, zmax);
+ aLimPntArray[6].SetCoord(xmin, ymax, zmax);
+ aLimPntArray[7].SetCoord(xmax, ymax, zmax);
+
+ for(i = 0; i <= 7; i++) {
+ anExt.Perform(aLimPntArray[i], aLin, Precision::Confusion(), -lim, lim);
+ aPntOnLin = anExt.Point(1);
+ aParOnLin = aPntOnLin.Parameter();
+ tmin = Min(aParOnLin, tmin);
+ tmax = Max(aParOnLin, tmax);
+ }
+
+ }
+ else {
+ tmin = -1.e+50;
+ tmax = 1.e+50;
+ }
+
+
+ cfirst = Max(cfirst, tmin);
+ clast = Min(clast, tmax);
+
+ }
+
+
+
+ Extrema_GenExtCS Ext(C, *myS, NbT, NbU, NbV, cfirst, clast, ufirst, ulast,
+ vfirst, vlast, mytolC, mytolS);
+
+ myDone = Ext.IsDone();
+ if (myDone) {
+ Standard_Integer NbExt = Ext.NbExt();
+ Standard_Real T,U,V;
+ Extrema_POnCurv PC;
+ Extrema_POnSurf PS;
+ for (i = 1; i <= NbExt; i++) {
+ PC = Ext.PointOnCurve(i);
+ PS = Ext.PointOnSurface(i);
+ T = PC.Parameter();
+ PS.Parameter(U, V);
AddSolution(C, T, U, V, PC.Value(), PS.Value(), Ext.SquareDistance(i));
- }
- }
- return;
-
- }
+ }
+ }
+ return;
+
+ }
}
break;
}
-// Modified by skv - Thu Jul 7 12:29:34 2005 OCC9134 Begin
+ // Modified by skv - Thu Jul 7 12:29:34 2005 OCC9134 Begin
case GeomAbs_Circle:
{
if(myStype == GeomAbs_Cylinder) {
- myExtElCS.Perform(C.Circle(), myS->Cylinder());
- break;
+ myExtElCS.Perform(C.Circle(), myS->Cylinder());
+ break;
}
}
case GeomAbs_Hyperbola:
{
if(myCtype == GeomAbs_Hyperbola && myStype == GeomAbs_Plane) {
-// Modified by skv - Thu Jul 7 12:29:34 2005 OCC9134 End
- myExtElCS.Perform(C.Hyperbola(), myS->Plane());
- break;
+ // Modified by skv - Thu Jul 7 12:29:34 2005 OCC9134 End
+ myExtElCS.Perform(C.Hyperbola(), myS->Plane());
+ break;
}
}
default:
Extrema_GenExtCS Ext;
Ext.Initialize(*myS, NbU, NbV, mytolS);
if(myCtype == GeomAbs_Hyperbola) {
- Standard_Real tmin = Max(-20., C.FirstParameter());
- Standard_Real tmax = Min(20., C.LastParameter());
- Ext.Perform(C, NbT, tmin, tmax, mytolC); // to avoid overflow
+ Standard_Real tmin = Max(-20., C.FirstParameter());
+ Standard_Real tmax = Min(20., C.LastParameter());
+ Ext.Perform(C, NbT, tmin, tmax, mytolC); // to avoid overflow
}
else {
- if(myCtype == GeomAbs_Circle && NbT < 13) {
- NbT = 13;
- }
- Ext.Perform(C, NbT, mytolC);
+ if(myCtype == GeomAbs_Circle && NbT < 13) {
+ NbT = 13;
+ }
+ Ext.Perform(C, NbT, mytolC);
}
-
+
myDone = Ext.IsDone();
if (myDone) {
- Standard_Integer NbExt = Ext.NbExt();
- Standard_Real T,U,V;
- Extrema_POnCurv PC;
- Extrema_POnSurf PS;
- for (i = 1; i <= NbExt; i++) {
- PC = Ext.PointOnCurve(i);
- PS = Ext.PointOnSurface(i);
- T = PC.Parameter();
- PS.Parameter(U, V);
+ Standard_Integer NbExt = Ext.NbExt();
+ Standard_Real T,U,V;
+ Extrema_POnCurv PC;
+ Extrema_POnSurf PS;
+ for (i = 1; i <= NbExt; i++) {
+ PC = Ext.PointOnCurve(i);
+ PS = Ext.PointOnSurface(i);
+ T = PC.Parameter();
+ PS.Parameter(U, V);
AddSolution(C, T, U, V, PC.Value(), PS.Value(), Ext.SquareDistance(i));
- }
+ }
//Add sharp points
Standard_Integer SolNumber = mySqDist.Length();
{
ProjPS.Point(jmin).Parameter(U,V);
AddSolution(C, T, U, V,
- aPnt, ProjPS.Point(jmin).Value(), MinSqDist);
+ aPnt, ProjPS.Point(jmin).Value(), MinSqDist);
}
}
//Cut sharp solutions to keep only minimum and maximum
Extrema_POnCurv MaxPC = myPOnC(imax);
Extrema_POnSurf MinPS = myPOnS(imin);
Extrema_POnSurf MaxPS = myPOnS(imax);
-
+
mySqDist.Remove(SolNumber + 1, mySqDist.Length());
myPOnC.Remove(SolNumber + 1, myPOnC.Length());
myPOnS.Remove(SolNumber + 1, myPOnS.Length());
}
break;
}
-
+
myDone = myExtElCS.IsDone();
if (myDone) {
myIsPar = myExtElCS.IsParallel();
Standard_Integer NbExt = myExtElCS.NbExt();
Standard_Real U, V;
for (i = 1; i <= NbExt; i++) {
- Extrema_POnCurv PC;
- Extrema_POnSurf PS;
- myExtElCS.Points(i, PC, PS);
- Standard_Real Ucurve = PC.Parameter();
- PS.Parameter(U, V);
+ Extrema_POnCurv PC;
+ Extrema_POnSurf PS;
+ myExtElCS.Points(i, PC, PS);
+ Standard_Real Ucurve = PC.Parameter();
+ PS.Parameter(U, V);
AddSolution(C, Ucurve, U, V, PC.Value(), PS.Value(), myExtElCS.SquareDistance(i));
}
}
}
-
+
}
void Extrema_ExtCS::Points(const Standard_Integer N,
- Extrema_POnCurv& P1,
- Extrema_POnSurf& P2) const
+ Extrema_POnCurv& P1,
+ Extrema_POnSurf& P2) const
{
if(!myDone) StdFail_NotDone::Raise();
P1 = myPOnC.Value(N);
}
Standard_Boolean Extrema_ExtCS::AddSolution(const Adaptor3d_Curve& theCurve,
- const Standard_Real aT,
- const Standard_Real aU,
- const Standard_Real aV,
- const gp_Pnt& PointOnCurve,
- const gp_Pnt& PointOnSurf,
- const Standard_Real SquareDist)
+ const Standard_Real aT,
+ const Standard_Real aU,
+ const Standard_Real aV,
+ const gp_Pnt& PointOnCurve,
+ const gp_Pnt& PointOnSurf,
+ const Standard_Real SquareDist)
{
Standard_Boolean Added = Standard_False;
Standard_Real T = aT, U = aU, V = aV;
-
+
if (theCurve.IsPeriodic())
T = ElCLib::InPeriod(T, myucinf, myucinf + theCurve.Period());
if (myS->IsUPeriodic())
Extrema_POnCurv aPC;
Extrema_POnSurf aPS;
if ((myucinf-T) <= mytolC && (T-myucsup) <= mytolC &&
- (myuinf-U) <= mytolS && (U-myusup) <= mytolS &&
- (myvinf-V) <= mytolS && (V-myvsup) <= mytolS)
+ (myuinf-U) <= mytolS && (U-myusup) <= mytolS &&
+ (myvinf-V) <= mytolS && (V-myvsup) <= mytolS)
{
Standard_Boolean IsNewSolution = Standard_True;
for (Standard_Integer j = 1; j <= mySqDist.Length(); j++)
Standard_Real Uj, Vj;
aPS.Parameter(Uj, Vj);
if (Abs(T - Tj) <= mytolC &&
- Abs(U - Uj) <= mytolS &&
- Abs(V - Vj) <= mytolS)
+ Abs(U - Uj) <= mytolS &&
+ Abs(V - Vj) <= mytolS)
{
IsNewSolution = Standard_False;
break;
//purpose :
//=======================================================================
- Extrema_GenExtCS::Extrema_GenExtCS(const Adaptor3d_Curve& C,
- const Adaptor3d_Surface& S,
- const Standard_Integer NbT,
- const Standard_Integer NbU,
- const Standard_Integer NbV,
- const Standard_Real Tol1,
- const Standard_Real Tol2)
+Extrema_GenExtCS::Extrema_GenExtCS(const Adaptor3d_Curve& C,
+ const Adaptor3d_Surface& S,
+ const Standard_Integer NbT,
+ const Standard_Integer NbU,
+ const Standard_Integer NbV,
+ const Standard_Real Tol1,
+ const Standard_Real Tol2)
{
Initialize(S, NbU, NbV, Tol2);
Perform(C, NbT, Tol1);
//purpose :
//=======================================================================
- Extrema_GenExtCS::Extrema_GenExtCS(const Adaptor3d_Curve& C,
- const Adaptor3d_Surface& S,
- const Standard_Integer NbT,
- const Standard_Integer NbU,
- const Standard_Integer NbV,
- const Standard_Real tmin,
- const Standard_Real tsup,
- const Standard_Real Umin,
- const Standard_Real Usup,
- const Standard_Real Vmin,
- const Standard_Real Vsup,
- const Standard_Real Tol1,
- const Standard_Real Tol2)
+Extrema_GenExtCS::Extrema_GenExtCS(const Adaptor3d_Curve& C,
+ const Adaptor3d_Surface& S,
+ const Standard_Integer NbT,
+ const Standard_Integer NbU,
+ const Standard_Integer NbV,
+ const Standard_Real tmin,
+ const Standard_Real tsup,
+ const Standard_Real Umin,
+ const Standard_Real Usup,
+ const Standard_Real Vmin,
+ const Standard_Real Vsup,
+ const Standard_Real Tol1,
+ const Standard_Real Tol2)
{
Initialize(S, NbU, NbV, Umin,Usup,Vmin,Vsup,Tol2);
Perform(C, NbT, tmin, tsup, Tol1);
//=======================================================================
void Extrema_GenExtCS::Initialize(const Adaptor3d_Surface& S,
- const Standard_Integer NbU,
- const Standard_Integer NbV,
- const Standard_Real Tol2)
+ const Standard_Integer NbU,
+ const Standard_Integer NbV,
+ const Standard_Real Tol2)
{
myumin = S.FirstUParameter();
myusup = S.LastUParameter();
//=======================================================================
void Extrema_GenExtCS::Initialize(const Adaptor3d_Surface& S,
- const Standard_Integer NbU,
- const Standard_Integer NbV,
- const Standard_Real Umin,
- const Standard_Real Usup,
- const Standard_Real Vmin,
- const Standard_Real Vsup,
- const Standard_Real Tol2)
+ const Standard_Integer NbU,
+ const Standard_Integer NbV,
+ const Standard_Real Umin,
+ const Standard_Real Usup,
+ const Standard_Real Vmin,
+ const Standard_Real Vsup,
+ const Standard_Real Tol2)
{
myS = (Adaptor3d_SurfacePtr)&S;
myusample = NbU;
//=======================================================================
void Extrema_GenExtCS::Perform(const Adaptor3d_Curve& C,
- const Standard_Integer NbT,
- const Standard_Real Tol1)
+ const Standard_Integer NbT,
+ const Standard_Real Tol1)
{
mytmin = C.FirstParameter();
mytsup = C.LastParameter();
//=======================================================================
void Extrema_GenExtCS::Perform(const Adaptor3d_Curve& C,
- const Standard_Integer NbT,
- const Standard_Real tmin,
- const Standard_Real tsup,
- const Standard_Real Tol1)
+ const Standard_Integer NbT,
+ const Standard_Real tmin,
+ const Standard_Real tsup,
+ const Standard_Real Tol1)
{
myDone = Standard_False;
myF.Initialize(C,*myS);
Standard_Real dfUFirst = aCurve->FirstParameter();
// Create iso line of U=U0
GeomAdaptor_Curve anAx(new Geom_Line(aCurve->Value(dfUFirst), aDir),
- trimvmin, trimvsup);
+ trimvmin, trimvsup);
Extrema_ExtCC aLocator(C, anAx);
if (aLocator.IsDone() && aLocator.NbExt()>0)
{
Extrema_POnCurv aP1, aP2;
for (iExt=1; iExt<=aLocator.NbExt(); iExt++)
{
- aLocator.Points (iExt, aP1, aP2);
- // Parameter on curve
- UV(1) = aP1.Parameter();
- // To find parameters on surf, try ExtPS
- Extrema_ExtPS aPreciser (aP1.Value(), *myS, mytol2, mytol2);
- if (aPreciser.IsDone())
- {
- // Managed to find extremas between point and surface
- Standard_Integer iPExt;
- for (iPExt=1; iPExt<=aPreciser.NbExt(); iPExt++)
- {
- aPreciser.Point(iPExt).Parameter(UV(2),UV(3));
- math_FunctionSetRoot S1 (myF,UV,Tol,UVinf,UVsup);
- }
- }
- else
- {
- // Failed... try the point on iso line
- UV(2) = dfUFirst;
- UV(3) = aP2.Parameter();
- math_FunctionSetRoot S1 (myF,UV,Tol,UVinf,UVsup);
- }
+ aLocator.Points (iExt, aP1, aP2);
+ // Parameter on curve
+ UV(1) = aP1.Parameter();
+ // To find parameters on surf, try ExtPS
+ Extrema_ExtPS aPreciser (aP1.Value(), *myS, mytol2, mytol2);
+ if (aPreciser.IsDone())
+ {
+ // Managed to find extremas between point and surface
+ Standard_Integer iPExt;
+ for (iPExt=1; iPExt<=aPreciser.NbExt(); iPExt++)
+ {
+ aPreciser.Point(iPExt).Parameter(UV(2),UV(3));
+ math_FunctionSetRoot S1 (myF,UV,Tol,UVinf,UVsup);
+ }
+ }
+ else
+ {
+ // Failed... try the point on iso line
+ UV(2) = dfUFirst;
+ UV(3) = aP2.Parameter();
+ math_FunctionSetRoot S1 (myF,UV,Tol,UVinf,UVsup);
+ }
} // for (iExt=1; iExt<=aLocator.NbExt(); iExt++)
} // if (aLocator.IsDone() && aLocator.NbExt()>0)
} // if (myS.Type() == GeomAbs_ExtrusionSurface)
Standard_Real aCUAdd = (mytsup - mytmin) / mytsample;
Standard_Real aSUAdd = (myusup - myumin) / myusample;
Standard_Real aSVAdd = (myvsup - myvmin) / myvsample;
+ Standard_Real tres = C.Resolution(1.);
+ Standard_Real ures = myS->UResolution(1.);
+ Standard_Real vres = myS->VResolution(1.);
+ tres = aCUAdd / tres;
+ ures = aSUAdd / ures;
+ vres = aSVAdd / vres;
+ Standard_Real minres = Min(tres, Min(ures, vres));
+ Standard_Real factor = 5.;
+ Standard_Integer maxnbs = 50;
+ minres *= factor;
+ if(minres > Epsilon(1.))
+ {
+ if(tres > minres)
+ {
+ Standard_Real rsample = mytsample * tres / minres;
+ if(rsample > maxnbs)
+ {
+ mytsample = maxnbs;
+ }
+ else
+ {
+ mytsample = RealToInt(rsample);
+ }
+ aCUAdd = (mytsup - mytmin) / mytsample;
+ }
+ if(ures > minres)
+ {
+ Standard_Real rsample = myusample * ures / minres;
+ if(rsample > maxnbs)
+ {
+ myusample = maxnbs;
+ }
+ else
+ {
+ myusample = RealToInt(rsample);
+ }
+ aSUAdd = (myusup - myumin) / myusample;
+ }
+ if(vres > minres)
+ {
+ Standard_Real rsample = myvsample * vres / minres;
+ if(rsample > maxnbs)
+ {
+ myvsample = maxnbs;
+ }
+ else
+ {
+ myvsample = RealToInt(rsample);
+ }
+ aSVAdd = (myvsup - myvmin) / myvsample;
+ }
+ }
+
TColgp_HArray1OfPnt aCPs(1, mytsample);
TColgp_HArray2OfPnt aSPs(1, myusample, 1, myvsample);
Standard_Integer aRestIterCount = 3;
- // The value is calculated by the bug CR23830.
+ // The value is calculated by the bug CR23830.
Standard_Integer aCUDen = 2, aSUDen = 2, aSVDen = 2;
Standard_Boolean anAreAvSqsInited = Standard_False;
Standard_Real aCUSq = 0, aSUSq = 0, aSVSq = 0;