| Conditions | 5 |
| Total Lines | 186 |
| Code Lines | 113 |
| Lines | 0 |
| Ratio | 0 % |
| Changes | 0 | ||
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
| 1 | # -*- coding: utf-8 - |
||
| 308 | def _create(self, group=None): |
||
| 309 | """ |
||
| 310 | Create constraints for GenericCHPBlock. |
||
| 311 | |||
| 312 | Parameters |
||
| 313 | ---------- |
||
| 314 | group : list |
||
| 315 | List containing `GenericCHP` objects. |
||
| 316 | e.g. groups=[ghcp1, gchp2,..] |
||
| 317 | """ |
||
| 318 | m = self.parent_block() |
||
| 319 | |||
| 320 | if group is None: |
||
| 321 | return None |
||
| 322 | |||
| 323 | self.GENERICCHPS = Set(initialize=[n for n in group]) |
||
| 324 | |||
| 325 | # variables |
||
| 326 | self.H_F = Var(self.GENERICCHPS, m.TIMESTEPS, within=NonNegativeReals) |
||
| 327 | self.H_L_FG_max = Var( |
||
| 328 | self.GENERICCHPS, m.TIMESTEPS, within=NonNegativeReals |
||
| 329 | ) |
||
| 330 | self.H_L_FG_min = Var( |
||
| 331 | self.GENERICCHPS, m.TIMESTEPS, within=NonNegativeReals |
||
| 332 | ) |
||
| 333 | self.P_woDH = Var( |
||
| 334 | self.GENERICCHPS, m.TIMESTEPS, within=NonNegativeReals |
||
| 335 | ) |
||
| 336 | self.P = Var(self.GENERICCHPS, m.TIMESTEPS, within=NonNegativeReals) |
||
| 337 | self.Q = Var(self.GENERICCHPS, m.TIMESTEPS, within=NonNegativeReals) |
||
| 338 | self.Y = Var(self.GENERICCHPS, m.TIMESTEPS, within=Binary) |
||
| 339 | |||
| 340 | # constraint rules |
||
| 341 | def _H_flow_rule(block, n, t): |
||
| 342 | """Link fuel consumption to component inflow.""" |
||
| 343 | expr = 0 |
||
| 344 | expr += self.H_F[n, t] |
||
| 345 | expr += -m.flow[list(n.fuel_input.keys())[0], n, t] |
||
| 346 | return expr == 0 |
||
| 347 | |||
| 348 | self.H_flow = Constraint( |
||
| 349 | self.GENERICCHPS, m.TIMESTEPS, rule=_H_flow_rule |
||
| 350 | ) |
||
| 351 | |||
| 352 | def _Q_flow_rule(block, n, t): |
||
| 353 | """Link heat flow to component outflow.""" |
||
| 354 | expr = 0 |
||
| 355 | expr += self.Q[n, t] |
||
| 356 | expr += -m.flow[n, list(n.heat_output.keys())[0], t] |
||
| 357 | return expr == 0 |
||
| 358 | |||
| 359 | self.Q_flow = Constraint( |
||
| 360 | self.GENERICCHPS, m.TIMESTEPS, rule=_Q_flow_rule |
||
| 361 | ) |
||
| 362 | |||
| 363 | def _P_flow_rule(block, n, t): |
||
| 364 | """Link power flow to component outflow.""" |
||
| 365 | expr = 0 |
||
| 366 | expr += self.P[n, t] |
||
| 367 | expr += -m.flow[n, list(n.electrical_output.keys())[0], t] |
||
| 368 | return expr == 0 |
||
| 369 | |||
| 370 | self.P_flow = Constraint( |
||
| 371 | self.GENERICCHPS, m.TIMESTEPS, rule=_P_flow_rule |
||
| 372 | ) |
||
| 373 | |||
| 374 | def _H_F_1_rule(block, n, t): |
||
| 375 | """Set P_woDH depending on H_F.""" |
||
| 376 | expr = 0 |
||
| 377 | expr += -self.H_F[n, t] |
||
| 378 | expr += n.alphas[0][t] * self.Y[n, t] |
||
| 379 | expr += n.alphas[1][t] * self.P_woDH[n, t] |
||
| 380 | return expr == 0 |
||
| 381 | |||
| 382 | self.H_F_1 = Constraint( |
||
| 383 | self.GENERICCHPS, m.TIMESTEPS, rule=_H_F_1_rule |
||
| 384 | ) |
||
| 385 | |||
| 386 | def _H_F_2_rule(block, n, t): |
||
| 387 | """Determine relation between H_F, P and Q.""" |
||
| 388 | expr = 0 |
||
| 389 | expr += -self.H_F[n, t] |
||
| 390 | expr += n.alphas[0][t] * self.Y[n, t] |
||
| 391 | expr += n.alphas[1][t] * (self.P[n, t] + n.Beta[t] * self.Q[n, t]) |
||
| 392 | return expr == 0 |
||
| 393 | |||
| 394 | self.H_F_2 = Constraint( |
||
| 395 | self.GENERICCHPS, m.TIMESTEPS, rule=_H_F_2_rule |
||
| 396 | ) |
||
| 397 | |||
| 398 | def _H_F_3_rule(block, n, t): |
||
| 399 | """Set upper value of operating range via H_F.""" |
||
| 400 | expr = 0 |
||
| 401 | expr += self.H_F[n, t] |
||
| 402 | expr += -self.Y[n, t] * ( |
||
| 403 | list(n.electrical_output.values())[0].P_max_woDH[t] |
||
| 404 | / list(n.electrical_output.values())[0].Eta_el_max_woDH[t] |
||
| 405 | ) |
||
| 406 | return expr <= 0 |
||
| 407 | |||
| 408 | self.H_F_3 = Constraint( |
||
| 409 | self.GENERICCHPS, m.TIMESTEPS, rule=_H_F_3_rule |
||
| 410 | ) |
||
| 411 | |||
| 412 | def _H_F_4_rule(block, n, t): |
||
| 413 | """Set lower value of operating range via H_F.""" |
||
| 414 | expr = 0 |
||
| 415 | expr += self.H_F[n, t] |
||
| 416 | expr += -self.Y[n, t] * ( |
||
| 417 | list(n.electrical_output.values())[0].P_min_woDH[t] |
||
| 418 | / list(n.electrical_output.values())[0].Eta_el_min_woDH[t] |
||
| 419 | ) |
||
| 420 | return expr >= 0 |
||
| 421 | |||
| 422 | self.H_F_4 = Constraint( |
||
| 423 | self.GENERICCHPS, m.TIMESTEPS, rule=_H_F_4_rule |
||
| 424 | ) |
||
| 425 | |||
| 426 | def _H_L_FG_max_rule(block, n, t): |
||
| 427 | """Set max. flue gas loss as share fuel flow share.""" |
||
| 428 | expr = 0 |
||
| 429 | expr += -self.H_L_FG_max[n, t] |
||
| 430 | expr += ( |
||
| 431 | self.H_F[n, t] |
||
| 432 | * list(n.fuel_input.values())[0].H_L_FG_share_max[t] |
||
| 433 | ) |
||
| 434 | return expr == 0 |
||
| 435 | |||
| 436 | self.H_L_FG_max_def = Constraint( |
||
| 437 | self.GENERICCHPS, m.TIMESTEPS, rule=_H_L_FG_max_rule |
||
| 438 | ) |
||
| 439 | |||
| 440 | def _Q_max_res_rule(block, n, t): |
||
| 441 | """Set maximum Q depending on fuel and electrical flow.""" |
||
| 442 | expr = 0 |
||
| 443 | expr += self.P[n, t] + self.Q[n, t] + self.H_L_FG_max[n, t] |
||
| 444 | expr += list(n.heat_output.values())[0].Q_CW_min[t] * self.Y[n, t] |
||
| 445 | expr += -self.H_F[n, t] |
||
| 446 | # back-pressure characteristics or one-segment model |
||
| 447 | if n.back_pressure is True: |
||
| 448 | return expr == 0 |
||
| 449 | else: |
||
| 450 | return expr <= 0 |
||
| 451 | |||
| 452 | self.Q_max_res = Constraint( |
||
| 453 | self.GENERICCHPS, m.TIMESTEPS, rule=_Q_max_res_rule |
||
| 454 | ) |
||
| 455 | |||
| 456 | def _H_L_FG_min_rule(block, n, t): |
||
| 457 | """Set min. flue gas loss as fuel flow share.""" |
||
| 458 | # minimum flue gas losses e.g. for motoric CHPs |
||
| 459 | if getattr( |
||
| 460 | list(n.fuel_input.values())[0], "H_L_FG_share_min", None |
||
| 461 | ): |
||
| 462 | expr = 0 |
||
| 463 | expr += -self.H_L_FG_min[n, t] |
||
| 464 | expr += ( |
||
| 465 | self.H_F[n, t] |
||
| 466 | * list(n.fuel_input.values())[0].H_L_FG_share_min[t] |
||
| 467 | ) |
||
| 468 | return expr == 0 |
||
| 469 | else: |
||
| 470 | return Constraint.Skip |
||
| 471 | |||
| 472 | self.H_L_FG_min_def = Constraint( |
||
| 473 | self.GENERICCHPS, m.TIMESTEPS, rule=_H_L_FG_min_rule |
||
| 474 | ) |
||
| 475 | |||
| 476 | def _Q_min_res_rule(block, n, t): |
||
| 477 | """Set minimum Q depending on fuel and eletrical flow.""" |
||
| 478 | # minimum restriction for heat flows e.g. for motoric CHPs |
||
| 479 | if getattr( |
||
| 480 | list(n.fuel_input.values())[0], "H_L_FG_share_min", None |
||
| 481 | ): |
||
| 482 | expr = 0 |
||
| 483 | expr += self.P[n, t] + self.Q[n, t] + self.H_L_FG_min[n, t] |
||
| 484 | expr += ( |
||
| 485 | list(n.heat_output.values())[0].Q_CW_min[t] * self.Y[n, t] |
||
| 486 | ) |
||
| 487 | expr += -self.H_F[n, t] |
||
| 488 | return expr >= 0 |
||
| 489 | else: |
||
| 490 | return Constraint.Skip |
||
| 491 | |||
| 492 | self.Q_min_res = Constraint( |
||
| 493 | self.GENERICCHPS, m.TIMESTEPS, rule=_Q_min_res_rule |
||
| 494 | ) |
||
| 506 |