| Conditions | 5 |
| Total Lines | 203 |
| Code Lines | 128 |
| Lines | 26 |
| Ratio | 12.81 % |
| 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 - |
||
| 329 | def _create(self, group=None): |
||
| 330 | """ |
||
| 331 | Create constraints for GenericCHPBlock. |
||
| 332 | |||
| 333 | Parameters |
||
| 334 | ---------- |
||
| 335 | group : list |
||
| 336 | List containing `GenericCHP` objects. |
||
| 337 | e.g. groups=[ghcp1, gchp2,..] |
||
| 338 | """ |
||
| 339 | m = self.parent_block() |
||
| 340 | |||
| 341 | if group is None: |
||
| 342 | return None |
||
| 343 | |||
| 344 | self.GENERICCHPS = Set(initialize=[n for n in group]) |
||
| 345 | |||
| 346 | # variables |
||
| 347 | self.H_F = Var(self.GENERICCHPS, m.TIMESTEPS, within=NonNegativeReals) |
||
| 348 | self.H_L_FG_max = Var( |
||
| 349 | self.GENERICCHPS, m.TIMESTEPS, within=NonNegativeReals |
||
| 350 | ) |
||
| 351 | self.H_L_FG_min = Var( |
||
| 352 | self.GENERICCHPS, m.TIMESTEPS, within=NonNegativeReals |
||
| 353 | ) |
||
| 354 | self.P_woDH = Var( |
||
| 355 | self.GENERICCHPS, m.TIMESTEPS, within=NonNegativeReals |
||
| 356 | ) |
||
| 357 | self.P = Var(self.GENERICCHPS, m.TIMESTEPS, within=NonNegativeReals) |
||
| 358 | self.Q = Var(self.GENERICCHPS, m.TIMESTEPS, within=NonNegativeReals) |
||
| 359 | self.Y = Var(self.GENERICCHPS, m.TIMESTEPS, within=Binary) |
||
| 360 | |||
| 361 | # constraint rules |
||
| 362 | def _H_flow_rule(block, n, t): |
||
| 363 | """Link fuel consumption to component inflow.""" |
||
| 364 | expr = 0 |
||
| 365 | expr += self.H_F[n, t] |
||
| 366 | expr += -m.flow[list(n.fuel_input.keys())[0], n, t] |
||
| 367 | return expr == 0 |
||
| 368 | |||
| 369 | self.H_flow = Constraint( |
||
| 370 | self.GENERICCHPS, m.TIMESTEPS, rule=_H_flow_rule |
||
| 371 | ) |
||
| 372 | |||
| 373 | def _Q_flow_rule(block, n, t): |
||
| 374 | """Link heat flow to component outflow.""" |
||
| 375 | expr = 0 |
||
| 376 | expr += self.Q[n, t] |
||
| 377 | expr += -m.flow[n, list(n.heat_output.keys())[0], t] |
||
| 378 | return expr == 0 |
||
| 379 | |||
| 380 | self.Q_flow = Constraint( |
||
| 381 | self.GENERICCHPS, m.TIMESTEPS, rule=_Q_flow_rule |
||
| 382 | ) |
||
| 383 | |||
| 384 | def _P_flow_rule(block, n, t): |
||
| 385 | """Link power flow to component outflow.""" |
||
| 386 | expr = 0 |
||
| 387 | expr += self.P[n, t] |
||
| 388 | expr += -m.flow[n, list(n.electrical_output.keys())[0], t] |
||
| 389 | return expr == 0 |
||
| 390 | |||
| 391 | self.P_flow = Constraint( |
||
| 392 | self.GENERICCHPS, m.TIMESTEPS, rule=_P_flow_rule |
||
| 393 | ) |
||
| 394 | |||
| 395 | def _H_F_1_rule(block, n, t): |
||
| 396 | """Set P_woDH depending on H_F.""" |
||
| 397 | expr = 0 |
||
| 398 | expr += -self.H_F[n, t] |
||
| 399 | expr += n.alphas[0][t] * self.Y[n, t] |
||
| 400 | expr += n.alphas[1][t] * self.P_woDH[n, t] |
||
| 401 | return expr == 0 |
||
| 402 | |||
| 403 | self.H_F_1 = Constraint( |
||
| 404 | self.GENERICCHPS, m.TIMESTEPS, rule=_H_F_1_rule |
||
| 405 | ) |
||
| 406 | |||
| 407 | def _H_F_2_rule(block, n, t): |
||
| 408 | """Determine relation between H_F, P and Q.""" |
||
| 409 | expr = 0 |
||
| 410 | expr += -self.H_F[n, t] |
||
| 411 | expr += n.alphas[0][t] * self.Y[n, t] |
||
| 412 | expr += n.alphas[1][t] * (self.P[n, t] + n.beta[t] * self.Q[n, t]) |
||
| 413 | return expr == 0 |
||
| 414 | |||
| 415 | self.H_F_2 = Constraint( |
||
| 416 | self.GENERICCHPS, m.TIMESTEPS, rule=_H_F_2_rule |
||
| 417 | ) |
||
| 418 | |||
| 419 | View Code Duplication | def _H_F_3_rule(block, n, t): |
|
|
|
|||
| 420 | """Set upper value of operating range via H_F.""" |
||
| 421 | expr = 0 |
||
| 422 | expr += self.H_F[n, t] |
||
| 423 | expr += -self.Y[n, t] * ( |
||
| 424 | list(n.electrical_output.values())[0].custom_properties[ |
||
| 425 | "P_max_woDH" |
||
| 426 | ][t] |
||
| 427 | / list(n.electrical_output.values())[0].custom_properties[ |
||
| 428 | "Eta_el_max_woDH" |
||
| 429 | ][t] |
||
| 430 | ) |
||
| 431 | return expr <= 0 |
||
| 432 | |||
| 433 | self.H_F_3 = Constraint( |
||
| 434 | self.GENERICCHPS, m.TIMESTEPS, rule=_H_F_3_rule |
||
| 435 | ) |
||
| 436 | |||
| 437 | View Code Duplication | def _H_F_4_rule(block, n, t): |
|
| 438 | """Set lower value of operating range via H_F.""" |
||
| 439 | expr = 0 |
||
| 440 | expr += self.H_F[n, t] |
||
| 441 | expr += -self.Y[n, t] * ( |
||
| 442 | list(n.electrical_output.values())[0].custom_properties[ |
||
| 443 | "P_min_woDH" |
||
| 444 | ][t] |
||
| 445 | / list(n.electrical_output.values())[0].custom_properties[ |
||
| 446 | "Eta_el_min_woDH" |
||
| 447 | ][t] |
||
| 448 | ) |
||
| 449 | return expr >= 0 |
||
| 450 | |||
| 451 | self.H_F_4 = Constraint( |
||
| 452 | self.GENERICCHPS, m.TIMESTEPS, rule=_H_F_4_rule |
||
| 453 | ) |
||
| 454 | |||
| 455 | def _H_L_FG_max_rule(block, n, t): |
||
| 456 | """Set max. flue gas loss as share fuel flow share.""" |
||
| 457 | expr = 0 |
||
| 458 | expr += -self.H_L_FG_max[n, t] |
||
| 459 | expr += ( |
||
| 460 | self.H_F[n, t] |
||
| 461 | * list(n.fuel_input.values())[0].custom_properties[ |
||
| 462 | "H_L_FG_share_max" |
||
| 463 | ][t] |
||
| 464 | ) |
||
| 465 | return expr == 0 |
||
| 466 | |||
| 467 | self.H_L_FG_max_def = Constraint( |
||
| 468 | self.GENERICCHPS, m.TIMESTEPS, rule=_H_L_FG_max_rule |
||
| 469 | ) |
||
| 470 | |||
| 471 | def _Q_max_res_rule(block, n, t): |
||
| 472 | """Set maximum Q depending on fuel and electrical flow.""" |
||
| 473 | expr = 0 |
||
| 474 | expr += self.P[n, t] + self.Q[n, t] + self.H_L_FG_max[n, t] |
||
| 475 | expr += ( |
||
| 476 | list(n.heat_output.values())[0].custom_properties["Q_CW_min"][ |
||
| 477 | t |
||
| 478 | ] |
||
| 479 | * self.Y[n, t] |
||
| 480 | ) |
||
| 481 | expr += -self.H_F[n, t] |
||
| 482 | # back-pressure characteristics or one-segment model |
||
| 483 | if n.back_pressure is True: |
||
| 484 | return expr == 0 |
||
| 485 | else: |
||
| 486 | return expr <= 0 |
||
| 487 | |||
| 488 | self.Q_max_res = Constraint( |
||
| 489 | self.GENERICCHPS, m.TIMESTEPS, rule=_Q_max_res_rule |
||
| 490 | ) |
||
| 491 | |||
| 492 | def _H_L_FG_min_rule(block, n, t): |
||
| 493 | """Set min. flue gas loss as fuel flow share.""" |
||
| 494 | # minimum flue gas losses e.g. for motoric CHPs |
||
| 495 | if getattr( |
||
| 496 | list(n.fuel_input.values())[0], "H_L_FG_share_min", None |
||
| 497 | ): |
||
| 498 | expr = 0 |
||
| 499 | expr += -self.H_L_FG_min[n, t] |
||
| 500 | expr += ( |
||
| 501 | self.H_F[n, t] |
||
| 502 | * list(n.fuel_input.values())[0].custom_properties[ |
||
| 503 | "H_L_FG_share_min" |
||
| 504 | ][t] |
||
| 505 | ) |
||
| 506 | return expr == 0 |
||
| 507 | else: |
||
| 508 | return Constraint.Skip |
||
| 509 | |||
| 510 | self.H_L_FG_min_def = Constraint( |
||
| 511 | self.GENERICCHPS, m.TIMESTEPS, rule=_H_L_FG_min_rule |
||
| 512 | ) |
||
| 513 | |||
| 514 | def _Q_min_res_rule(block, n, t): |
||
| 515 | """Set minimum Q depending on fuel and eletrical flow.""" |
||
| 516 | # minimum restriction for heat flows e.g. for motoric CHPs |
||
| 517 | if getattr( |
||
| 518 | list(n.fuel_input.values())[0], "H_L_FG_share_min", None |
||
| 519 | ): |
||
| 520 | expr = 0 |
||
| 521 | expr += self.P[n, t] + self.Q[n, t] + self.H_L_FG_min[n, t] |
||
| 522 | expr += ( |
||
| 523 | list(n.heat_output.values())[0].Q_CW_min[t] * self.Y[n, t] |
||
| 524 | ) |
||
| 525 | expr += -self.H_F[n, t] |
||
| 526 | return expr >= 0 |
||
| 527 | else: |
||
| 528 | return Constraint.Skip |
||
| 529 | |||
| 530 | self.Q_min_res = Constraint( |
||
| 531 | self.GENERICCHPS, m.TIMESTEPS, rule=_Q_min_res_rule |
||
| 532 | ) |
||
| 544 |