1aaa7dc30SBarry Smith #include <../src/tao/complementarity/impls/ssls/ssls.h> 2a7e14dcfSSatish Balay 3a7e14dcfSSatish Balay /*------------------------------------------------------------*/ 44416b707SBarry Smith PetscErrorCode TaoSetFromOptions_SSLS(PetscOptionItems *PetscOptionsObject,Tao tao) 5a7e14dcfSSatish Balay { 6a7e14dcfSSatish Balay TAO_SSLS *ssls = (TAO_SSLS *)tao->data; 7a7e14dcfSSatish Balay 8a7e14dcfSSatish Balay PetscFunctionBegin; 9*d0609cedSBarry Smith PetscOptionsHeadBegin(PetscOptionsObject,"Semismooth method with a linesearch for complementarity problems"); 109566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-ssls_delta", "descent test fraction", "",ssls->delta, &ssls->delta, NULL)); 119566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-ssls_rho", "descent test power", "",ssls->rho, &ssls->rho, NULL)); 129566063dSJacob Faibussowitsch PetscCall(TaoLineSearchSetFromOptions(tao->linesearch)); 139566063dSJacob Faibussowitsch PetscCall(KSPSetFromOptions(tao->ksp)); 14*d0609cedSBarry Smith PetscOptionsHeadEnd(); 15a7e14dcfSSatish Balay PetscFunctionReturn(0); 16a7e14dcfSSatish Balay } 17a7e14dcfSSatish Balay 18a7e14dcfSSatish Balay /*------------------------------------------------------------*/ 19441846f8SBarry Smith PetscErrorCode TaoView_SSLS(Tao tao, PetscViewer pv) 20a7e14dcfSSatish Balay { 21a7e14dcfSSatish Balay PetscFunctionBegin; 22a7e14dcfSSatish Balay PetscFunctionReturn(0); 23a7e14dcfSSatish Balay } 24a7e14dcfSSatish Balay 25a7e14dcfSSatish Balay /*------------------------------------------------------------*/ 26a7e14dcfSSatish Balay PetscErrorCode Tao_SSLS_Function(TaoLineSearch ls, Vec X, PetscReal *fcn, void *ptr) 27a7e14dcfSSatish Balay { 28441846f8SBarry Smith Tao tao = (Tao)ptr; 29a7e14dcfSSatish Balay TAO_SSLS *ssls = (TAO_SSLS *)tao->data; 30a7e14dcfSSatish Balay 31a7e14dcfSSatish Balay PetscFunctionBegin; 329566063dSJacob Faibussowitsch PetscCall(TaoComputeConstraints(tao, X, tao->constraints)); 339566063dSJacob Faibussowitsch PetscCall(VecFischer(X,tao->constraints,tao->XL,tao->XU,ssls->ff)); 349566063dSJacob Faibussowitsch PetscCall(VecNorm(ssls->ff,NORM_2,&ssls->merit)); 35a7e14dcfSSatish Balay *fcn = 0.5*ssls->merit*ssls->merit; 36a7e14dcfSSatish Balay PetscFunctionReturn(0); 37a7e14dcfSSatish Balay } 38a7e14dcfSSatish Balay 39a7e14dcfSSatish Balay /*------------------------------------------------------------*/ 40a7e14dcfSSatish Balay PetscErrorCode Tao_SSLS_FunctionGradient(TaoLineSearch ls, Vec X, PetscReal *fcn, Vec G, void *ptr) 41a7e14dcfSSatish Balay { 42441846f8SBarry Smith Tao tao = (Tao)ptr; 43a7e14dcfSSatish Balay TAO_SSLS *ssls = (TAO_SSLS *)tao->data; 44a7e14dcfSSatish Balay 45a7e14dcfSSatish Balay PetscFunctionBegin; 469566063dSJacob Faibussowitsch PetscCall(TaoComputeConstraints(tao, X, tao->constraints)); 479566063dSJacob Faibussowitsch PetscCall(VecFischer(X,tao->constraints,tao->XL,tao->XU,ssls->ff)); 489566063dSJacob Faibussowitsch PetscCall(VecNorm(ssls->ff,NORM_2,&ssls->merit)); 49a7e14dcfSSatish Balay *fcn = 0.5*ssls->merit*ssls->merit; 50a7e14dcfSSatish Balay 519566063dSJacob Faibussowitsch PetscCall(TaoComputeJacobian(tao,tao->solution,tao->jacobian,tao->jacobian_pre)); 52a7e14dcfSSatish Balay 539566063dSJacob Faibussowitsch PetscCall(MatDFischer(tao->jacobian, tao->solution, tao->constraints,tao->XL, tao->XU, ssls->t1, ssls->t2,ssls->da, ssls->db)); 549566063dSJacob Faibussowitsch PetscCall(MatDiagonalScale(tao->jacobian,ssls->db,NULL)); 559566063dSJacob Faibussowitsch PetscCall(MatDiagonalSet(tao->jacobian,ssls->da,ADD_VALUES)); 569566063dSJacob Faibussowitsch PetscCall(MatMultTranspose(tao->jacobian,ssls->ff,G)); 57a7e14dcfSSatish Balay PetscFunctionReturn(0); 58a7e14dcfSSatish Balay } 59