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 |