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