1*aad13602SShrirang Abhyankar 2*aad13602SShrirang Abhyankar #ifndef __TAO_PDIPM_H 3*aad13602SShrirang Abhyankar #define __TAO_PDIPM_H 4*aad13602SShrirang Abhyankar #include <petsc/private/taoimpl.h> 5*aad13602SShrirang Abhyankar 6*aad13602SShrirang Abhyankar /* 7*aad13602SShrirang Abhyankar Context for Primal-Dual Interior-Point Method 8*aad13602SShrirang Abhyankar See the document pdipm.pdf 9*aad13602SShrirang Abhyankar */ 10*aad13602SShrirang Abhyankar 11*aad13602SShrirang Abhyankar typedef struct { 12*aad13602SShrirang Abhyankar /* Sizes (n = local, N = global) */ 13*aad13602SShrirang Abhyankar PetscInt nx,Nx; /* Decision variables nx = nxfixed + nxub + nxlb + nxbox + nxfree */ 14*aad13602SShrirang Abhyankar PetscInt nxfixed,Nxfixed; /* Fixed decision variables */ 15*aad13602SShrirang Abhyankar PetscInt nxlb,Nxlb; /* Decision variables with lower bounds only */ 16*aad13602SShrirang Abhyankar PetscInt nxub,Nxub; /* Decision variables with upper bounds only */ 17*aad13602SShrirang Abhyankar PetscInt nxbox,Nxbox; /* Decision variables with box constraints */ 18*aad13602SShrirang Abhyankar PetscInt nxfree,Nxfree; /* Free variables */ 19*aad13602SShrirang Abhyankar PetscInt ng,Ng; /* user equality constraints g(x) = 0. */ 20*aad13602SShrirang Abhyankar PetscInt nh,Nh; /* user inequality constraints h(x) >= 0. */ 21*aad13602SShrirang Abhyankar PetscInt nce,Nce; /* total equality constraints. nce = ng + nxfixed */ 22*aad13602SShrirang Abhyankar PetscInt nci,Nci; /* total inequality constraints nci = nh + nxlb + nxub + 2*nxbox */ 23*aad13602SShrirang Abhyankar PetscInt n,N; /* Big KKT system size n = nx + nce + 2*nci */ 24*aad13602SShrirang Abhyankar 25*aad13602SShrirang Abhyankar /* Vectors */ 26*aad13602SShrirang Abhyankar Vec X; /* R^n - Big KKT system vector [x; lambdae; lambdai; z] */ 27*aad13602SShrirang Abhyankar Vec x; /* R^nx - work vector, same layout as tao->solution */ 28*aad13602SShrirang Abhyankar Vec lambdae; /* R^nce - vector, shares local arrays with X */ 29*aad13602SShrirang Abhyankar Vec lambdai; /* R^nci - vector, shares local arrays with X */ 30*aad13602SShrirang Abhyankar Vec z; /* R^nci - vector, shares local arrays with X */ 31*aad13602SShrirang Abhyankar 32*aad13602SShrirang Abhyankar /* Work vectors */ 33*aad13602SShrirang Abhyankar Vec lambdae_xfixed; /* Equality constraints lagrangian multipler vector for fixed variables */ 34*aad13602SShrirang Abhyankar Vec lambdai_xb; /* User inequality constraints lagrangian multipler vector */ 35*aad13602SShrirang Abhyankar 36*aad13602SShrirang Abhyankar /* Lagrangian equality and inequality Vec */ 37*aad13602SShrirang Abhyankar Vec ce,ci; /* equality and inequality constraints */ 38*aad13602SShrirang Abhyankar 39*aad13602SShrirang Abhyankar /* Offsets for subvectors */ 40*aad13602SShrirang Abhyankar PetscInt off_lambdae,off_lambdai,off_z; 41*aad13602SShrirang Abhyankar 42*aad13602SShrirang Abhyankar /* Scalars */ 43*aad13602SShrirang Abhyankar PetscReal L; /* Lagrangian = f(x) - lambdae^T*ce(x) - lambdai^T*(ci(x) - z) - mu*sum_{i=1}^{Nci}(log(z_i)) */ 44*aad13602SShrirang Abhyankar PetscReal gradL; /* gradient of L w.r.t. x */ 45*aad13602SShrirang Abhyankar 46*aad13602SShrirang Abhyankar /* Matrices */ 47*aad13602SShrirang Abhyankar Mat Jce_xfixed; /* Jacobian of equality constraints cebound(x) = J(nxfixed) */ 48*aad13602SShrirang Abhyankar Mat Jci_xb; /* Jacobian of inequality constraints Jci = [tao->jacobian_inequality ; J(nxub); J(nxlb); J(nxbx)] */ 49*aad13602SShrirang Abhyankar Mat K; /* KKT matrix */ 50*aad13602SShrirang Abhyankar 51*aad13602SShrirang Abhyankar /* Parameters */ 52*aad13602SShrirang Abhyankar PetscReal mu; /* Barrier parameter */ 53*aad13602SShrirang Abhyankar PetscReal mu_update_factor; /* Multiplier for mu update */ 54*aad13602SShrirang Abhyankar 55*aad13602SShrirang Abhyankar /* Tolerances */ 56*aad13602SShrirang Abhyankar 57*aad13602SShrirang Abhyankar /* Index sets for types of bounds on variables */ 58*aad13602SShrirang Abhyankar IS isxub; /* Finite upper bound only -inf < x < ub */ 59*aad13602SShrirang Abhyankar IS isxlb; /* Finite lower bound only lb <= x < inf */ 60*aad13602SShrirang Abhyankar IS isxfixed; /* Fixed variables lb = x = ub */ 61*aad13602SShrirang Abhyankar IS isxbox; /* Boxed variables lb <= x <= ub */ 62*aad13602SShrirang Abhyankar IS isxfree; /* Free variables -inf <= x <= inf */ 63*aad13602SShrirang Abhyankar 64*aad13602SShrirang Abhyankar /* Index sets for PC fieldsplit */ 65*aad13602SShrirang Abhyankar IS is1,is2; 66*aad13602SShrirang Abhyankar 67*aad13602SShrirang Abhyankar /* Options */ 68*aad13602SShrirang Abhyankar PetscBool monitorkkt; /* Monitor KKT */ 69*aad13602SShrirang Abhyankar PetscReal push_init_slack; /* Push initial slack variables (z) away from bounds */ 70*aad13602SShrirang Abhyankar PetscReal push_init_lambdai; /* Push initial inequality variables (lambdai) away from bounds */ 71*aad13602SShrirang Abhyankar PetscBool solve_reduced_kkt; /* Solve Reduced KKT with fieldsplit */ 72*aad13602SShrirang Abhyankar 73*aad13602SShrirang Abhyankar SNES snes; /* Nonlinear solver */ 74*aad13602SShrirang Abhyankar Mat jac_equality_trans,jac_inequality_trans; /* working matrices */ 75*aad13602SShrirang Abhyankar 76*aad13602SShrirang Abhyankar PetscReal obj; /* Objective function */ 77*aad13602SShrirang Abhyankar 78*aad13602SShrirang Abhyankar /* Offsets for parallel assembly */ 79*aad13602SShrirang Abhyankar PetscInt *nce_all; 80*aad13602SShrirang Abhyankar } TAO_PDIPM; 81*aad13602SShrirang Abhyankar 82*aad13602SShrirang Abhyankar PETSC_INTERN PetscErrorCode TaoSNESFunction_PDIPM(SNES,Vec,Vec,void*); 83*aad13602SShrirang Abhyankar 84*aad13602SShrirang Abhyankar #endif /* ifndef __TAO_PDIPM_H */ 85