1aaa7dc30SBarry Smith #include <../src/tao/complementarity/impls/ssls/ssls.h> 2a7e14dcfSSatish Balay 3a7e14dcfSSatish Balay /*------------------------------------------------------------*/ 4a7e14dcfSSatish Balay #undef __FUNCT__ 5a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetFromOptions_SSLS" 6441846f8SBarry Smith PetscErrorCode TaoSetFromOptions_SSLS(Tao tao) 7a7e14dcfSSatish Balay { 8a7e14dcfSSatish Balay TAO_SSLS *ssls = (TAO_SSLS *)tao->data; 9a7e14dcfSSatish Balay PetscErrorCode ierr; 10a7e14dcfSSatish Balay PetscBool flg; 11a7e14dcfSSatish Balay 12a7e14dcfSSatish Balay PetscFunctionBegin; 1353506e15SBarry Smith ierr = PetscOptionsHead("Semismooth method with a linesearch for complementarity problems");CHKERRQ(ierr); 1453506e15SBarry Smith ierr = PetscOptionsReal("-ssls_delta", "descent test fraction", "",ssls->delta, &(ssls->delta), &flg);CHKERRQ(ierr); 1553506e15SBarry Smith ierr = PetscOptionsReal("-ssls_rho", "descent test power", "",ssls->rho, &(ssls->rho), &flg);CHKERRQ(ierr); 16a7e14dcfSSatish Balay ierr = TaoLineSearchSetFromOptions(tao->linesearch);CHKERRQ(ierr); 17a7e14dcfSSatish Balay ierr = KSPSetFromOptions(tao->ksp);CHKERRQ(ierr); 18a7e14dcfSSatish Balay ierr = PetscOptionsTail();CHKERRQ(ierr); 19a7e14dcfSSatish Balay PetscFunctionReturn(0); 20a7e14dcfSSatish Balay } 21a7e14dcfSSatish Balay 22a7e14dcfSSatish Balay /*------------------------------------------------------------*/ 23a7e14dcfSSatish Balay #undef __FUNCT__ 24a7e14dcfSSatish Balay #define __FUNCT__ "TaoView_SSLS" 25441846f8SBarry Smith PetscErrorCode TaoView_SSLS(Tao tao, PetscViewer pv) 26a7e14dcfSSatish Balay { 27a7e14dcfSSatish Balay PetscFunctionBegin; 28a7e14dcfSSatish Balay PetscFunctionReturn(0); 29a7e14dcfSSatish Balay } 30a7e14dcfSSatish Balay 31a7e14dcfSSatish Balay /*------------------------------------------------------------*/ 32a7e14dcfSSatish Balay #undef __FUNCT__ 33a7e14dcfSSatish Balay #define __FUNCT__ "Tao_SSLS_Function" 34a7e14dcfSSatish Balay PetscErrorCode Tao_SSLS_Function(TaoLineSearch ls, Vec X, PetscReal *fcn, void *ptr) 35a7e14dcfSSatish Balay { 36441846f8SBarry Smith Tao tao = (Tao)ptr; 37a7e14dcfSSatish Balay TAO_SSLS *ssls = (TAO_SSLS *)tao->data; 38a7e14dcfSSatish Balay PetscErrorCode ierr; 39a7e14dcfSSatish Balay 40a7e14dcfSSatish Balay PetscFunctionBegin; 41a7e14dcfSSatish Balay ierr = TaoComputeConstraints(tao, X, tao->constraints);CHKERRQ(ierr); 42a7e14dcfSSatish Balay ierr = VecFischer(X,tao->constraints,tao->XL,tao->XU,ssls->ff);CHKERRQ(ierr); 43a7e14dcfSSatish Balay ierr = VecNorm(ssls->ff,NORM_2,&ssls->merit);CHKERRQ(ierr); 44a7e14dcfSSatish Balay *fcn = 0.5*ssls->merit*ssls->merit; 45a7e14dcfSSatish Balay PetscFunctionReturn(0); 46a7e14dcfSSatish Balay } 47a7e14dcfSSatish Balay 48a7e14dcfSSatish Balay /*------------------------------------------------------------*/ 49a7e14dcfSSatish Balay #undef __FUNCT__ 50a7e14dcfSSatish Balay #define __FUNCT__ "Tao_SSLS_FunctionGradient" 51a7e14dcfSSatish Balay PetscErrorCode Tao_SSLS_FunctionGradient(TaoLineSearch ls, Vec X, PetscReal *fcn, Vec G, void *ptr) 52a7e14dcfSSatish Balay { 53441846f8SBarry Smith Tao tao = (Tao)ptr; 54a7e14dcfSSatish Balay TAO_SSLS *ssls = (TAO_SSLS *)tao->data; 55a7e14dcfSSatish Balay PetscErrorCode ierr; 56a7e14dcfSSatish Balay 57a7e14dcfSSatish Balay PetscFunctionBegin; 58a7e14dcfSSatish Balay ierr = TaoComputeConstraints(tao, X, tao->constraints);CHKERRQ(ierr); 59a7e14dcfSSatish Balay ierr = VecFischer(X,tao->constraints,tao->XL,tao->XU,ssls->ff);CHKERRQ(ierr); 60a7e14dcfSSatish Balay ierr = VecNorm(ssls->ff,NORM_2,&ssls->merit);CHKERRQ(ierr); 61a7e14dcfSSatish Balay *fcn = 0.5*ssls->merit*ssls->merit; 62a7e14dcfSSatish Balay 63*ffad9901SBarry Smith ierr = TaoComputeJacobian(tao,tao->solution,tao->jacobian,tao->jacobian_pre);CHKERRQ(ierr); 64a7e14dcfSSatish Balay 6553506e15SBarry Smith ierr = D_Fischer(tao->jacobian, tao->solution, tao->constraints,tao->XL, tao->XU, ssls->t1, ssls->t2,ssls->da, ssls->db);CHKERRQ(ierr); 666c23d075SBarry Smith ierr = MatDiagonalScale(tao->jacobian,ssls->db,NULL);CHKERRQ(ierr); 67a7e14dcfSSatish Balay ierr = MatDiagonalSet(tao->jacobian,ssls->da,ADD_VALUES);CHKERRQ(ierr); 68a7e14dcfSSatish Balay ierr = MatMultTranspose(tao->jacobian,ssls->ff,G);CHKERRQ(ierr); 69a7e14dcfSSatish Balay PetscFunctionReturn(0); 70a7e14dcfSSatish Balay } 71a7e14dcfSSatish Balay 72