6
6
7
7
package edu .ie3 .simona .model .grid
8
8
9
+ import breeze .linalg .max
10
+
9
11
import java .time .ZonedDateTime
10
12
import java .util .UUID
11
13
import breeze .math .Complex
12
14
import breeze .numerics .pow
15
+ import com .typesafe .scalalogging .LazyLogging
13
16
import edu .ie3 .datamodel .exceptions .InvalidGridException
17
+ import edu .ie3 .datamodel .models .StandardUnits
14
18
import edu .ie3 .datamodel .models .input .connector .Transformer3WInput
15
19
import edu .ie3 .datamodel .models .input .connector .`type` .Transformer3WTypeInput
16
20
import edu .ie3 .simona .exceptions .{
@@ -29,7 +33,7 @@ import edu.ie3.util.scala.OperationInterval
29
33
30
34
import javax .measure .Quantity
31
35
import javax .measure .quantity .{Dimensionless , ElectricPotential }
32
- import tech .units .indriya .ComparableQuantity
36
+ import tech .units .indriya .{ AbstractUnit , ComparableQuantity }
33
37
import tech .units .indriya .quantity .Quantities
34
38
35
39
import scala .math .BigDecimal .RoundingMode
@@ -159,7 +163,7 @@ final case class Transformer3wModel(
159
163
}
160
164
}
161
165
162
- case object Transformer3wModel {
166
+ case object Transformer3wModel extends LazyLogging {
163
167
164
168
def apply (
165
169
transformer3wInput : Transformer3WInput ,
@@ -319,66 +323,56 @@ case object Transformer3wModel {
319
323
val transformerRefSystem =
320
324
RefSystem (transformerType.getsRatedA, transformerType.getvRatedA)
321
325
322
- /* Extract the equivalent circuit diagram parameters from type, with the perspective of the
323
- * transformer */
326
+ /* Get the physical equivalent circuit diagram parameters from type. They come with reference to the highest
327
+ * voltage side, therefore, in power flow case B and C, they need to be adapted. */
324
328
val (rTrafo, xTrafo, gTrafo, bTrafo) = powerFlowCase match {
325
329
case PowerFlowCaseA =>
326
330
(
327
- transformerRefSystem.rInPu( transformerType.getrScA) ,
328
- transformerRefSystem.xInPu( transformerType.getxScA) ,
329
- transformerRefSystem.gInPu( transformerType.getgM) ,
330
- transformerRefSystem.gInPu( transformerType.getbM)
331
+ transformerType.getrScA,
332
+ transformerType.getxScA,
333
+ transformerType.getgM,
334
+ transformerType.getbM
331
335
)
332
336
case PowerFlowCaseB =>
337
+ val nominalRatio = transformerType
338
+ .getvRatedA()
339
+ .divide(transformerType.getvRatedB())
340
+ .asType(classOf [Dimensionless ])
341
+ .to(AbstractUnit .ONE )
342
+ .getValue
343
+ .doubleValue()
333
344
(
334
- transformerRefSystem.rInPu( transformerType.getrScB),
335
- transformerRefSystem.xInPu( transformerType.getxScB),
336
- Quantities .getQuantity(0d , PU ),
337
- Quantities .getQuantity(0d , PU )
345
+ transformerType.getrScB.divide(pow(nominalRatio, 2 ) ),
346
+ transformerType.getxScB.divide(pow(nominalRatio, 2 ) ),
347
+ Quantities .getQuantity(0d , StandardUnits . CONDUCTANCE ),
348
+ Quantities .getQuantity(0d , StandardUnits . SUSCEPTANCE )
338
349
)
339
350
case PowerFlowCaseC =>
351
+ val nominalRatio = transformerType
352
+ .getvRatedA()
353
+ .divide(transformerType.getvRatedC())
354
+ .asType(classOf [Dimensionless ])
355
+ .to(AbstractUnit .ONE )
356
+ .getValue
357
+ .doubleValue()
340
358
(
341
- transformerRefSystem.rInPu( transformerType.getrScC),
342
- transformerRefSystem.xInPu( transformerType.getxScC),
343
- Quantities .getQuantity(0d , PU ),
344
- Quantities .getQuantity(0d , PU )
359
+ transformerType.getrScC.divide(pow(nominalRatio, 2 ) ),
360
+ transformerType.getxScC.divide(pow(nominalRatio, 2 ) ),
361
+ Quantities .getQuantity(0d , StandardUnits . CONDUCTANCE ),
362
+ Quantities .getQuantity(0d , StandardUnits . SUSCEPTANCE )
345
363
)
346
364
}
347
365
348
- /* Translate the single parameters to the grid's reference system */
366
+ /* Translate the single parameters to dimensionless units based on the grid's reference system */
349
367
(
350
368
/* r */
351
- Quantities .getQuantity(
352
- RefSystem
353
- .transferImpedance(rTrafo, transformerRefSystem, refSystem)
354
- .getValue
355
- .doubleValue(),
356
- PU
357
- ),
369
+ refSystem.rInPu(rTrafo),
358
370
/* x */
359
- Quantities .getQuantity(
360
- RefSystem
361
- .transferImpedance(xTrafo, transformerRefSystem, refSystem)
362
- .getValue
363
- .doubleValue(),
364
- PU
365
- ),
371
+ refSystem.xInPu(xTrafo),
366
372
/* g */
367
- Quantities .getQuantity(
368
- RefSystem
369
- .transferAdmittance(gTrafo, transformerRefSystem, refSystem)
370
- .getValue
371
- .doubleValue(),
372
- PU
373
- ),
373
+ refSystem.gInPu(gTrafo),
374
374
/* b */
375
- Quantities .getQuantity(
376
- RefSystem
377
- .transferAdmittance(bTrafo, transformerRefSystem, refSystem)
378
- .getValue
379
- .doubleValue(),
380
- PU
381
- )
375
+ refSystem.bInPu(bTrafo)
382
376
)
383
377
}
384
378
@@ -461,15 +455,27 @@ case object Transformer3wModel {
461
455
)
462
456
463
457
// check if nominal power of winding A is able to supply winding B and C
464
- val nomSwindingA = trafo3wType.getsRatedA.getValue.doubleValue
465
- val nomSwindingB = trafo3wType.getsRatedB.getValue.doubleValue
466
- val nomSwindingC = trafo3wType.getsRatedC.getValue.doubleValue
467
-
468
- if (nomSwindingA < (nomSwindingB + nomSwindingC))
469
- throw new InvalidParameterException (
470
- s " The winding A of transformer type has a lower rating as both windings B and C together! " +
471
- s " ( $nomSwindingA < $nomSwindingB + $nomSwindingC) "
472
- )
458
+ val sNomA = trafo3wType.getsRatedA.getValue.doubleValue
459
+ val sNomB = trafo3wType.getsRatedB.getValue.doubleValue
460
+ val sNomC = trafo3wType.getsRatedC.getValue.doubleValue
461
+
462
+ if (sNomA < (sNomB + sNomC)) {
463
+ val maxSNomUnderlying = max(sNomB, sNomC)
464
+ if (sNomA < maxSNomUnderlying)
465
+ throw new InvalidParameterException (
466
+ s " The winding A of transformer type has a lower rating ( $sNomA) as winding B ( $sNomB) or C ( $sNomC)! "
467
+ )
468
+ else
469
+ logger.warn(
470
+ " The port A of three winding transformer type {} ({}) has lower power rating ({}) than both underlying ports together ({} + {} = {})!" ,
471
+ trafo3wType.getUuid,
472
+ trafo3wType.getId,
473
+ trafo3wType.getsRatedA(),
474
+ trafo3wType.getsRatedB(),
475
+ trafo3wType.getsRatedC(),
476
+ trafo3wType.getsRatedB().add(trafo3wType.getsRatedC())
477
+ )
478
+ }
473
479
}
474
480
475
481
/** Calculates the current, tap dependent voltage ratio between the high
@@ -521,7 +527,7 @@ case object Transformer3wModel {
521
527
val bij = transformer3wModel.bij().getValue.doubleValue()
522
528
val gii = transformer3wModel.g0().getValue.doubleValue()
523
529
val bii = transformer3wModel.b0().getValue.doubleValue()
524
- amount * ((1 - transformer3wModel.tapRatio) * Complex (
530
+ amount * ((1 - 1 / transformer3wModel.tapRatio) * Complex (
525
531
gij,
526
532
bij
527
533
) + Complex (
@@ -550,7 +556,7 @@ case object Transformer3wModel {
550
556
val bij = transformer3wModel.bij().getValue.doubleValue()
551
557
transformer3wModel.powerFlowCase match {
552
558
case PowerFlowCaseA =>
553
- amount * pow(transformer3wModel.tapRatio, 2 ) * Complex (gij, bij)
559
+ amount * Complex (gij, bij) / transformer3wModel.tapRatio
554
560
case _ => amount * Complex (gij, bij)
555
561
}
556
562
}
0 commit comments