Skip to content

Commit 33c7339

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

File tree

1 file changed

+95
-84
lines changed

1 file changed

+95
-84
lines changed

src/sopflow/interface/sopflow.cpp

+95-84
Original file line numberDiff line numberDiff line change
@@ -106,38 +106,44 @@ PetscErrorCode SOPFLOWCreate(MPI_Comm mpicomm, SOPFLOW *sopflowout) {
106106
PetscErrorCode SOPFLOWDestroy(SOPFLOW *sopflow) {
107107
PetscErrorCode ierr;
108108
PetscInt s, i;
109+
PetscBool issopflowsolveripopt;
109110

110111
PetscFunctionBegin;
111112

112-
/* Solution vector */
113-
ierr = VecDestroy(&(*sopflow)->X);
114-
CHKERRQ(ierr);
115-
ierr = VecDestroy(&(*sopflow)->gradobj);
113+
ierr = PetscStrcmp((*sopflow)->solvername, "IPOPT", &issopflowsolveripopt);
116114
CHKERRQ(ierr);
117115

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

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

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

135-
/* Jacobian of constraints and Hessian */
136-
if ((*sopflow)->comm->size == 1) {
137-
ierr = MatDestroy(&(*sopflow)->Jac);
133+
ierr = VecDestroy(&(*sopflow)->Gl);
138134
CHKERRQ(ierr);
139-
ierr = MatDestroy(&(*sopflow)->Hes);
135+
ierr = VecDestroy(&(*sopflow)->Gu);
140136
CHKERRQ(ierr);
137+
ierr = VecDestroy(&(*sopflow)->Lambda);
138+
CHKERRQ(ierr);
139+
140+
/* Jacobian of constraints and Hessian */
141+
if ((*sopflow)->comm->size == 1) {
142+
ierr = MatDestroy(&(*sopflow)->Jac);
143+
CHKERRQ(ierr);
144+
ierr = MatDestroy(&(*sopflow)->Hes);
145+
CHKERRQ(ierr);
146+
}
141147
}
142148

143149
if ((*sopflow)->solverops.destroy) {
@@ -579,6 +585,7 @@ PetscErrorCode SOPFLOWSetUp(SOPFLOW sopflow) {
579585
PetscBool flgctgc = PETSC_FALSE;
580586
PetscBool flgwindgen = PETSC_FALSE;
581587
PetscBool issopflowsolverhiop;
588+
PetscBool issopflowsolveripopt;
582589
PetscBool flg;
583590

584591
char opflowmodelname[max_model_name_len];
@@ -893,6 +900,8 @@ PetscErrorCode SOPFLOWSetUp(SOPFLOW sopflow) {
893900

894901
ierr = PetscStrcmp(sopflow->solvername, "HIOP", &issopflowsolverhiop);
895902
CHKERRQ(ierr);
903+
ierr = PetscStrcmp(sopflow->solvername, "IPOPT", &issopflowsolveripopt);
904+
CHKERRQ(ierr);
896905

897906
if (!sopflow->ismulticontingency) {
898907

@@ -1153,81 +1162,83 @@ PetscErrorCode SOPFLOWSetUp(SOPFLOW sopflow) {
11531162
}
11541163
}
11551164

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);
1165+
if(issopflowsolveripopt) {
1166+
/* Create vector X */
1167+
ierr = VecCreate(sopflow->comm->type, &sopflow->X);
1168+
CHKERRQ(ierr);
1169+
ierr = VecSetSizes(sopflow->X, sopflow->nx, PETSC_DECIDE);
11921170
CHKERRQ(ierr);
1193-
ierr = MatSetSizes(sopflow->Jac, sopflow->ncon, sopflow->nx, sopflow->Ncon,
1194-
sopflow->Nx);
1171+
ierr = VecSetFromOptions(sopflow->X);
11951172
CHKERRQ(ierr);
1196-
// ierr = MatSetFromOptions(sopflow->Jac);
1197-
// CHKERRQ(ierr);
1198-
ierr = MatSetType(sopflow->Jac, MATSEQAIJ);
1173+
ierr = VecGetSize(sopflow->X, &sopflow->Nx);
1174+
CHKERRQ(ierr);
1175+
1176+
ierr = VecDuplicate(sopflow->X, &sopflow->Xl);
11991177
CHKERRQ(ierr);
1200-
/* Assume 10% sparsity */
1201-
ierr = MatSeqAIJSetPreallocation(sopflow->Jac,
1202-
(PetscInt)(0.1 * sopflow->Nx), NULL);
1178+
ierr = VecDuplicate(sopflow->X, &sopflow->Xu);
12031179
CHKERRQ(ierr);
1204-
ierr =
1205-
MatSetOption(sopflow->Jac, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE);
1180+
ierr = VecDuplicate(sopflow->X, &sopflow->gradobj);
12061181
CHKERRQ(ierr);
12071182

1208-
/* Hessian */
1209-
ierr = MatCreate(sopflow->comm->type, &sopflow->Hes);
1183+
/* vector for constraints */
1184+
ierr = VecCreate(sopflow->comm->type, &sopflow->G);
12101185
CHKERRQ(ierr);
1211-
ierr = MatSetSizes(sopflow->Hes, sopflow->nx, sopflow->nx, sopflow->Nx,
1212-
sopflow->Nx);
1186+
ierr = VecSetSizes(sopflow->G, sopflow->ncon, PETSC_DECIDE);
12131187
CHKERRQ(ierr);
1214-
ierr = MatSetType(sopflow->Hes, MATSEQAIJ);
1188+
ierr = VecSetFromOptions(sopflow->G);
12151189
CHKERRQ(ierr);
1216-
/* ierr = MatSetFromOptions(sopflow->Hes);
1190+
ierr = VecGetSize(sopflow->G, &sopflow->Ncon);
12171191
CHKERRQ(ierr);
1218-
*/
1219-
/* Assume 10% sparsity */
1220-
ierr = MatSeqAIJSetPreallocation(sopflow->Hes,
1221-
(PetscInt)(0.1 * sopflow->Nx), NULL);
1192+
1193+
/* Constraint bounds vectors */
1194+
ierr = VecDuplicate(sopflow->G, &sopflow->Gl);
12221195
CHKERRQ(ierr);
1223-
ierr =
1224-
MatSetOption(sopflow->Hes, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE);
1196+
ierr = VecDuplicate(sopflow->G, &sopflow->Gu);
12251197
CHKERRQ(ierr);
1226-
}
12271198

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

12321243
ierr = (*sopflow->solverops.setup)(sopflow);
12331244
CHKERRQ(ierr);

0 commit comments

Comments
 (0)