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