1aaa7dc30SBarry Smith #include <../src/tao/complementarity/impls/ssls/ssls.h> 2a7e14dcfSSatish Balay 3a7e14dcfSSatish Balay /*------------------------------------------------------------*/ 4d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetFromOptions_SSLS(Tao tao, PetscOptionItems *PetscOptionsObject) 5d71ae5a4SJacob Faibussowitsch { 6a7e14dcfSSatish Balay TAO_SSLS *ssls = (TAO_SSLS *)tao->data; 7a7e14dcfSSatish Balay 8a7e14dcfSSatish Balay PetscFunctionBegin; 9d0609cedSBarry 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)); 14d0609cedSBarry Smith PetscOptionsHeadEnd(); 15*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 16a7e14dcfSSatish Balay } 17a7e14dcfSSatish Balay 18a7e14dcfSSatish Balay /*------------------------------------------------------------*/ 19d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoView_SSLS(Tao tao, PetscViewer pv) 20d71ae5a4SJacob Faibussowitsch { 21a7e14dcfSSatish Balay PetscFunctionBegin; 22*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23a7e14dcfSSatish Balay } 24a7e14dcfSSatish Balay 25a7e14dcfSSatish Balay /*------------------------------------------------------------*/ 26d71ae5a4SJacob Faibussowitsch PetscErrorCode Tao_SSLS_Function(TaoLineSearch ls, Vec X, PetscReal *fcn, void *ptr) 27d71ae5a4SJacob Faibussowitsch { 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; 36*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 37a7e14dcfSSatish Balay } 38a7e14dcfSSatish Balay 39a7e14dcfSSatish Balay /*------------------------------------------------------------*/ 40d71ae5a4SJacob Faibussowitsch PetscErrorCode Tao_SSLS_FunctionGradient(TaoLineSearch ls, Vec X, PetscReal *fcn, Vec G, void *ptr) 41d71ae5a4SJacob Faibussowitsch { 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)); 57*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 58a7e14dcfSSatish Balay } 59