55 ClassImp(TQpLinSolverBase);
60 TQpLinSolverBase::TQpLinSolverBase()
76 TQpLinSolverBase::TQpLinSolverBase(TQpProbBase *factory,TQpDataBase *data)
84 fXloIndex.ResizeTo(data->fXloIndex); fXloIndex = data->fXloIndex;
85 fXupIndex.ResizeTo(data->fXupIndex); fXupIndex = data->fXupIndex;
86 fCloIndex.ResizeTo(data->fCloIndex); fCloIndex = data->fCloIndex;
87 fCupIndex.ResizeTo(data->fCupIndex); fCupIndex = data->fCupIndex;
89 fNxlo = fXloIndex.NonZeros();
90 fNxup = fXupIndex.NonZeros();
91 fMclo = fCloIndex.NonZeros();
92 fMcup = fCupIndex.NonZeros();
94 if (fNxup+fNxlo > 0) {
97 data->GetDiagonalOfQ(fDq);
99 fNomegaInv.ResizeTo(fMz);
100 fRhs .ResizeTo(fNx+fMy+fMz);
107 TQpLinSolverBase::TQpLinSolverBase(
const TQpLinSolverBase &another) : TObject(another),
108 fFactory(another.fFactory)
119 void TQpLinSolverBase::Factor(TQpDataBase * ,TQpVar *vars)
121 R__ASSERT(vars->ValidNonZeroPattern());
123 if (fNxlo+fNxup > 0) {
127 this->ComputeDiagonals(fDd,fNomegaInv,
128 vars->fT,vars->fLambda,vars->fU,vars->fPi,
129 vars->fV,vars->fGamma,vars->fW,vars->fPhi);
130 if (fNxlo+fNxup > 0) this->PutXDiagonal(fDd);
135 if (fMclo+fMcup > 0) this->PutZDiagonal(fNomegaInv);
142 void TQpLinSolverBase::ComputeDiagonals(TVectorD &dd,TVectorD &omega,
143 TVectorD &t, TVectorD &lambda,
144 TVectorD &u, TVectorD &pi,
145 TVectorD &v, TVectorD &gamma,
146 TVectorD &w, TVectorD &phi)
148 if (fNxup+fNxlo > 0) {
149 if (fNxlo > 0) AddElemDiv(dd,1.0,gamma,v,fXloIndex);
150 if (fNxup > 0) AddElemDiv(dd,1.0,phi ,w,fXupIndex);
153 if (fMclo > 0) AddElemDiv(omega,1.0,lambda,t,fCloIndex);
154 if (fMcup > 0) AddElemDiv(omega,1.0,pi, u,fCupIndex);
164 void TQpLinSolverBase::Solve(TQpDataBase *prob,TQpVar *vars,TQpResidual *res,TQpVar *step)
166 R__ASSERT(vars->ValidNonZeroPattern());
167 R__ASSERT(res ->ValidNonZeroPattern());
169 (step->fX).ResizeTo(res->fRQ); step->fX = res->fRQ;
171 TVectorD &vInvGamma = step->fV;
172 vInvGamma.ResizeTo(vars->fGamma); vInvGamma = vars->fGamma;
173 ElementDiv(vInvGamma,vars->fV,fXloIndex);
175 AddElemMult(step->fX,1.0,vInvGamma,res->fRv);
176 AddElemDiv (step->fX,1.0,res->fRgamma,vars->fV,fXloIndex);
180 TVectorD &wInvPhi = step->fW;
181 wInvPhi.ResizeTo(vars->fPhi); wInvPhi = vars->fPhi;
182 ElementDiv(wInvPhi,vars->fW,fXupIndex);
184 AddElemMult(step->fX,1.0,wInvPhi,res->fRw);
185 AddElemDiv (step->fX,-1.0,res->fRphi,vars->fW,fXupIndex);
189 (step->fS).ResizeTo(res->fRz); step->fS = res->fRz;
191 TVectorD &tInvLambda = step->fT;
192 tInvLambda.ResizeTo(vars->fLambda); tInvLambda = vars->fLambda;
193 ElementDiv(tInvLambda,vars->fT,fCloIndex);
195 AddElemMult(step->fS,1.0,tInvLambda,res->fRt);
196 AddElemDiv (step->fS,1.0,res->fRlambda,vars->fT,fCloIndex);
200 TVectorD &uInvPi = step->fU;
202 uInvPi.ResizeTo(vars->fPi); uInvPi = vars->fPi;
203 ElementDiv(uInvPi,vars->fU,fCupIndex);
205 AddElemMult(step->fS,1.0,uInvPi,res->fRu);
206 AddElemDiv (step->fS,-1.0,res->fRpi,vars->fU,fCupIndex);
209 (step->fY).ResizeTo(res->fRA); step->fY = res->fRA;
210 (step->fZ).ResizeTo(res->fRC); step->fZ = res->fRC;
213 this->SolveXYZS(step->fX,step->fY,step->fZ,step->fS,step->fLambda,prob);
215 this->SolveXYZS(step->fX,step->fY,step->fZ,step->fS,step->fPi,prob);
218 (step->fT).ResizeTo(step->fS); step->fT = step->fS;
219 Add(step->fT,-1.0,res->fRt);
220 (step->fT).SelectNonZeros(fCloIndex);
222 (step->fLambda).ResizeTo(res->fRlambda); step->fLambda = res->fRlambda;
223 AddElemMult(step->fLambda,-1.0,vars->fLambda,step->fT);
224 ElementDiv(step->fLambda,vars->fT,fCloIndex);
228 (step->fU).ResizeTo(res->fRu); step->fU = res->fRu;
229 Add(step->fU,-1.0,step->fS);
230 (step->fU).SelectNonZeros(fCupIndex);
232 (step->fPi).ResizeTo(res->fRpi); step->fPi = res->fRpi;
233 AddElemMult(step->fPi,-1.0,vars->fPi,step->fU);
234 ElementDiv(step->fPi,vars->fU,fCupIndex);
238 (step->fV).ResizeTo(step->fX); step->fV = step->fX;
239 Add(step->fV,-1.0,res->fRv);
240 (step->fV).SelectNonZeros(fXloIndex);
242 (step->fGamma).ResizeTo(res->fRgamma); step->fGamma = res->fRgamma;
243 AddElemMult(step->fGamma,-1.0,vars->fGamma,step->fV);
244 ElementDiv(step->fGamma,vars->fV,fXloIndex);
248 (step->fW).ResizeTo(res->fRw); step->fW = res->fRw;
249 Add(step->fW,-1.0,step->fX);
250 (step->fW).SelectNonZeros(fXupIndex);
252 (step->fPhi).ResizeTo(res->fRphi); step->fPhi = res->fRphi;
253 AddElemMult(step->fPhi,-1.0,vars->fPhi,step->fW);
254 ElementDiv(step->fPhi,vars->fW,fXupIndex);
256 R__ASSERT(step->ValidNonZeroPattern());
263 void TQpLinSolverBase::SolveXYZS(TVectorD &stepx,TVectorD &stepy,
264 TVectorD &stepz,TVectorD &steps,
265 TVectorD & , TQpDataBase * )
267 AddElemMult(stepz,-1.0,fNomegaInv,steps);
268 this->JoinRHS(fRhs,stepx,stepy,stepz);
270 this->SolveCompressed(fRhs);
272 this->SeparateVars(stepx,stepy,stepz,fRhs);
277 Add(steps,-1.0,stepz);
278 ElementMult(steps,fNomegaInv);
290 void TQpLinSolverBase::JoinRHS(TVectorD &rhs_out, TVectorD &rhs1_in,
291 TVectorD &rhs2_in,TVectorD &rhs3_in)
293 fFactory->JoinRHS(rhs_out,rhs1_in,rhs2_in,rhs3_in);
304 void TQpLinSolverBase::SeparateVars(TVectorD &x_in,TVectorD &y_in,
305 TVectorD &z_in,TVectorD &vars_in)
307 fFactory->SeparateVars(x_in,y_in,z_in,vars_in);
314 TQpLinSolverBase &TQpLinSolverBase::operator=(
const TQpLinSolverBase &source)
316 if (
this != &source) {
317 TObject::operator=(source);
322 fNxup = source.fNxup;
323 fNxlo = source.fNxlo;
324 fMcup = source.fMcup;
325 fMclo = source.fMclo;
327 fNomegaInv.ResizeTo(source.fNomegaInv); fNomegaInv = source.fNomegaInv;
328 fRhs .ResizeTo(source.fRhs); fRhs = source.fRhs;
330 fDd .ResizeTo(source.fDd); fDd = source.fDd;
331 fDq .ResizeTo(source.fDq); fDq = source.fDq;
333 fXupIndex .ResizeTo(source.fXupIndex); fXupIndex = source.fXupIndex;
334 fCupIndex .ResizeTo(source.fCupIndex); fCupIndex = source.fCupIndex;
335 fXloIndex .ResizeTo(source.fXloIndex); fXloIndex = source.fXloIndex;
336 fCloIndex .ResizeTo(source.fCloIndex); fCloIndex = source.fCloIndex;
339 fFactory = source.fFactory;