Skip to content

Commit 0230e97

Browse files
committed
Guard allocation of large array with sopflow->issolver_ipopt, as was done on the KPP2 branch.
1 parent 9c50ca3 commit 0230e97

File tree

1 file changed

+96
-92
lines changed

1 file changed

+96
-92
lines changed

src/sopflow/interface/sopflow.cpp

+96-92
Original file line numberDiff line numberDiff line change
@@ -109,35 +109,37 @@ PetscErrorCode SOPFLOWDestroy(SOPFLOW *sopflow) {
109109

110110
PetscFunctionBegin;
111111

112-
/* Solution vector */
113-
ierr = VecDestroy(&(*sopflow)->X);
114-
CHKERRQ(ierr);
115-
ierr = VecDestroy(&(*sopflow)->gradobj);
116-
CHKERRQ(ierr);
117-
118-
/* Lower and upper bounds on X */
119-
ierr = VecDestroy(&(*sopflow)->Xl);
120-
CHKERRQ(ierr);
121-
ierr = VecDestroy(&(*sopflow)->Xu);
122-
CHKERRQ(ierr);
112+
if((*sopflow)->issolver_ipopt) {
113+
/* Solution vector */
114+
ierr = VecDestroy(&(*sopflow)->X);
115+
CHKERRQ(ierr);
116+
ierr = VecDestroy(&(*sopflow)->gradobj);
117+
CHKERRQ(ierr);
123118

124-
/* Constraints vector */
125-
ierr = VecDestroy(&(*sopflow)->G);
126-
CHKERRQ(ierr);
119+
/* Lower and upper bounds on X */
120+
ierr = VecDestroy(&(*sopflow)->Xl);
121+
CHKERRQ(ierr);
122+
ierr = VecDestroy(&(*sopflow)->Xu);
123+
CHKERRQ(ierr);
127124

128-
ierr = VecDestroy(&(*sopflow)->Gl);
129-
CHKERRQ(ierr);
130-
ierr = VecDestroy(&(*sopflow)->Gu);
131-
CHKERRQ(ierr);
132-
ierr = VecDestroy(&(*sopflow)->Lambda);
133-
CHKERRQ(ierr);
125+
/* Constraints vector */
126+
ierr = VecDestroy(&(*sopflow)->G);
127+
CHKERRQ(ierr);
134128

135-
/* Jacobian of constraints and Hessian */
136-
if ((*sopflow)->comm->size == 1) {
137-
ierr = MatDestroy(&(*sopflow)->Jac);
129+
ierr = VecDestroy(&(*sopflow)->Gl);
138130
CHKERRQ(ierr);
139-
ierr = MatDestroy(&(*sopflow)->Hes);
131+
ierr = VecDestroy(&(*sopflow)->Gu);
140132
CHKERRQ(ierr);
133+
ierr = VecDestroy(&(*sopflow)->Lambda);
134+
CHKERRQ(ierr);
135+
136+
/* Jacobian of constraints and Hessian */
137+
if ((*sopflow)->comm->size == 1) {
138+
ierr = MatDestroy(&(*sopflow)->Jac);
139+
CHKERRQ(ierr);
140+
ierr = MatDestroy(&(*sopflow)->Hes);
141+
CHKERRQ(ierr);
142+
}
141143
}
142144

143145
if ((*sopflow)->solverops.destroy) {
@@ -578,7 +580,6 @@ PetscErrorCode SOPFLOWSetUp(SOPFLOW sopflow) {
578580
char windgen[PETSC_MAX_PATH_LEN];
579581
PetscBool flgctgc = PETSC_FALSE;
580582
PetscBool flgwindgen = PETSC_FALSE;
581-
PetscBool issopflowsolverhiop;
582583
PetscBool flg;
583584

584585
char opflowmodelname[max_model_name_len];
@@ -891,7 +892,9 @@ PetscErrorCode SOPFLOWSetUp(SOPFLOW sopflow) {
891892
}
892893
}
893894

894-
ierr = PetscStrcmp(sopflow->solvername, "HIOP", &issopflowsolverhiop);
895+
ierr = PetscStrcmp(sopflow->solvername, "HIOP", &sopflow->issolver_hiop);
896+
CHKERRQ(ierr);
897+
ierr = PetscStrcmp(sopflow->solvername, "IPOPT", &sopflow->issolver_ipopt);
895898
CHKERRQ(ierr);
896899

897900
if (!sopflow->ismulticontingency) {
@@ -981,7 +984,7 @@ PetscErrorCode SOPFLOWSetUp(SOPFLOW sopflow) {
981984
}
982985

983986
/* Set subproblem parameters and partial setup */
984-
if (issopflowsolverhiop) {
987+
if (sopflow->issolver_hiop) {
985988
ierr = OPFLOWSetModel(sopflow->opflows[s], sopflow->subproblem_model);
986989
CHKERRQ(ierr);
987990
ierr = OPFLOWSetSolver(sopflow->opflows[s], sopflow->subproblem_solver);
@@ -1153,81 +1156,83 @@ PetscErrorCode SOPFLOWSetUp(SOPFLOW sopflow) {
11531156
}
11541157
}
11551158

1156-
/* Create vector X */
1157-
ierr = VecCreate(sopflow->comm->type, &sopflow->X);
1158-
CHKERRQ(ierr);
1159-
ierr = VecSetSizes(sopflow->X, sopflow->nx, PETSC_DECIDE);
1160-
CHKERRQ(ierr);
1161-
ierr = VecSetFromOptions(sopflow->X);
1162-
CHKERRQ(ierr);
1163-
ierr = VecGetSize(sopflow->X, &sopflow->Nx);
1164-
CHKERRQ(ierr);
1165-
1166-
ierr = VecDuplicate(sopflow->X, &sopflow->Xl);
1167-
CHKERRQ(ierr);
1168-
ierr = VecDuplicate(sopflow->X, &sopflow->Xu);
1169-
CHKERRQ(ierr);
1170-
ierr = VecDuplicate(sopflow->X, &sopflow->gradobj);
1171-
CHKERRQ(ierr);
1172-
1173-
/* vector for constraints */
1174-
ierr = VecCreate(sopflow->comm->type, &sopflow->G);
1175-
CHKERRQ(ierr);
1176-
ierr = VecSetSizes(sopflow->G, sopflow->ncon, PETSC_DECIDE);
1177-
CHKERRQ(ierr);
1178-
ierr = VecSetFromOptions(sopflow->G);
1179-
CHKERRQ(ierr);
1180-
ierr = VecGetSize(sopflow->G, &sopflow->Ncon);
1181-
CHKERRQ(ierr);
1182-
1183-
/* Constraint bounds vectors */
1184-
ierr = VecDuplicate(sopflow->G, &sopflow->Gl);
1185-
CHKERRQ(ierr);
1186-
ierr = VecDuplicate(sopflow->G, &sopflow->Gu);
1187-
CHKERRQ(ierr);
1188-
1189-
if (sopflow->comm->size == 1) {
1190-
/* Constraint Jacobian */
1191-
ierr = MatCreate(sopflow->comm->type, &sopflow->Jac);
1159+
if(sopflow->issolver_ipopt) {
1160+
/* Create vector X */
1161+
ierr = VecCreate(sopflow->comm->type, &sopflow->X);
11921162
CHKERRQ(ierr);
1193-
ierr = MatSetSizes(sopflow->Jac, sopflow->ncon, sopflow->nx, sopflow->Ncon,
1194-
sopflow->Nx);
1163+
ierr = VecSetSizes(sopflow->X, sopflow->nx, PETSC_DECIDE);
11951164
CHKERRQ(ierr);
1196-
// ierr = MatSetFromOptions(sopflow->Jac);
1197-
// CHKERRQ(ierr);
1198-
ierr = MatSetType(sopflow->Jac, MATSEQAIJ);
1165+
ierr = VecSetFromOptions(sopflow->X);
11991166
CHKERRQ(ierr);
1200-
/* Assume 10% sparsity */
1201-
ierr = MatSeqAIJSetPreallocation(sopflow->Jac,
1202-
(PetscInt)(0.1 * sopflow->Nx), NULL);
1167+
ierr = VecGetSize(sopflow->X, &sopflow->Nx);
1168+
CHKERRQ(ierr);
1169+
1170+
ierr = VecDuplicate(sopflow->X, &sopflow->Xl);
12031171
CHKERRQ(ierr);
1204-
ierr =
1205-
MatSetOption(sopflow->Jac, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE);
1172+
ierr = VecDuplicate(sopflow->X, &sopflow->Xu);
1173+
CHKERRQ(ierr);
1174+
ierr = VecDuplicate(sopflow->X, &sopflow->gradobj);
12061175
CHKERRQ(ierr);
12071176

1208-
/* Hessian */
1209-
ierr = MatCreate(sopflow->comm->type, &sopflow->Hes);
1177+
/* vector for constraints */
1178+
ierr = VecCreate(sopflow->comm->type, &sopflow->G);
12101179
CHKERRQ(ierr);
1211-
ierr = MatSetSizes(sopflow->Hes, sopflow->nx, sopflow->nx, sopflow->Nx,
1212-
sopflow->Nx);
1180+
ierr = VecSetSizes(sopflow->G, sopflow->ncon, PETSC_DECIDE);
12131181
CHKERRQ(ierr);
1214-
ierr = MatSetType(sopflow->Hes, MATSEQAIJ);
1182+
ierr = VecSetFromOptions(sopflow->G);
12151183
CHKERRQ(ierr);
1216-
/* ierr = MatSetFromOptions(sopflow->Hes);
1184+
ierr = VecGetSize(sopflow->G, &sopflow->Ncon);
12171185
CHKERRQ(ierr);
1218-
*/
1219-
/* Assume 10% sparsity */
1220-
ierr = MatSeqAIJSetPreallocation(sopflow->Hes,
1221-
(PetscInt)(0.1 * sopflow->Nx), NULL);
1186+
1187+
/* Constraint bounds vectors */
1188+
ierr = VecDuplicate(sopflow->G, &sopflow->Gl);
12221189
CHKERRQ(ierr);
1223-
ierr =
1224-
MatSetOption(sopflow->Hes, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE);
1190+
ierr = VecDuplicate(sopflow->G, &sopflow->Gu);
12251191
CHKERRQ(ierr);
1226-
}
12271192

1228-
/* Lagrangian multipliers */
1229-
ierr = VecDuplicate(sopflow->G, &sopflow->Lambda);
1230-
CHKERRQ(ierr);
1193+
if (sopflow->comm->size == 1) {
1194+
/* Constraint Jacobian */
1195+
ierr = MatCreate(sopflow->comm->type, &sopflow->Jac);
1196+
CHKERRQ(ierr);
1197+
ierr = MatSetSizes(sopflow->Jac, sopflow->ncon, sopflow->nx, sopflow->Ncon,
1198+
sopflow->Nx);
1199+
CHKERRQ(ierr);
1200+
// ierr = MatSetFromOptions(sopflow->Jac);
1201+
// CHKERRQ(ierr);
1202+
ierr = MatSetType(sopflow->Jac, MATSEQAIJ);
1203+
CHKERRQ(ierr);
1204+
/* Assume 10% sparsity */
1205+
ierr = MatSeqAIJSetPreallocation(sopflow->Jac,
1206+
(PetscInt)(0.1 * sopflow->Nx), NULL);
1207+
CHKERRQ(ierr);
1208+
ierr =
1209+
MatSetOption(sopflow->Jac, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE);
1210+
CHKERRQ(ierr);
1211+
1212+
/* Hessian */
1213+
ierr = MatCreate(sopflow->comm->type, &sopflow->Hes);
1214+
CHKERRQ(ierr);
1215+
ierr = MatSetSizes(sopflow->Hes, sopflow->nx, sopflow->nx, sopflow->Nx,
1216+
sopflow->Nx);
1217+
CHKERRQ(ierr);
1218+
ierr = MatSetType(sopflow->Hes, MATSEQAIJ);
1219+
CHKERRQ(ierr);
1220+
/* ierr = MatSetFromOptions(sopflow->Hes);
1221+
CHKERRQ(ierr);
1222+
*/
1223+
/* Assume 10% sparsity */
1224+
ierr = MatSeqAIJSetPreallocation(sopflow->Hes,
1225+
(PetscInt)(0.1 * sopflow->Nx), NULL);
1226+
CHKERRQ(ierr);
1227+
ierr =
1228+
MatSetOption(sopflow->Hes, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE);
1229+
CHKERRQ(ierr);
1230+
}
1231+
1232+
/* Lagrangian multipliers */
1233+
ierr = VecDuplicate(sopflow->G, &sopflow->Lambda);
1234+
CHKERRQ(ierr);
1235+
}
12311236

12321237
ierr = (*sopflow->solverops.setup)(sopflow);
12331238
CHKERRQ(ierr);
@@ -1245,18 +1250,17 @@ PetscErrorCode SOPFLOWSetUp(SOPFLOW sopflow) {
12451250
*/
12461251
PetscErrorCode SOPFLOWSolve(SOPFLOW sopflow) {
12471252
PetscErrorCode ierr;
1248-
PetscBool issolver_ipopt;
12491253

12501254
PetscFunctionBegin;
12511255

12521256
if (!sopflow->setupcalled) {
12531257
ierr = SOPFLOWSetUp(sopflow);
12541258
}
12551259

1256-
ierr = PetscStrcmp(sopflow->solvername, "IPOPT", &issolver_ipopt);
1260+
ierr = PetscStrcmp(sopflow->solvername, "IPOPT", &sopflow->issolver_ipopt);
12571261
CHKERRQ(ierr);
12581262

1259-
if (issolver_ipopt) {
1263+
if (sopflow->issolver_ipopt) {
12601264
/* Set bounds on variables */
12611265
if (sopflow->modelops.setvariablebounds) {
12621266
ierr = (*sopflow->modelops.setvariablebounds)(sopflow, sopflow->Xl,

0 commit comments

Comments
 (0)