Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a simple transformer effficiency model to pvlib #2053

Merged
merged 55 commits into from
Jun 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
43234fc
wrote a simple transformer efficiency model
kurt-rhee May 12, 2024
f18ef77
edited documentation to include latex, unsure if it will compile corr…
kurt-rhee May 17, 2024
aafebe8
removed "if __main__"
kurt-rhee May 17, 2024
ee4210e
removed "if __main__"
kurt-rhee May 17, 2024
f688078
changed whatsnew rst
kurt-rhee May 17, 2024
907efd3
updated to be in compliance with Flake8
kurt-rhee May 20, 2024
a80bd7f
Update pvlib/transformer.py
kurt-rhee May 20, 2024
1072053
Update pvlib/transformer.py
kurt-rhee May 20, 2024
d8381fe
Update pvlib/transformer.py
kurt-rhee May 20, 2024
349604f
+ added transformer to index.rst
kurt-rhee May 20, 2024
af63760
Update docs/sphinx/source/reference/transformer.rst
kurt-rhee May 20, 2024
3bb1364
Update pvlib/transformer.py
kurt-rhee May 20, 2024
1571fdd
updated names of loss values and changed to [unitless]
kurt-rhee May 20, 2024
77efdde
Update pvlib/transformer.py
kurt-rhee May 20, 2024
b029b9e
Update pvlib/transformer.py
kurt-rhee May 20, 2024
06efabe
Update pvlib/transformer.py
kurt-rhee May 20, 2024
9361419
Update pvlib/transformer.py
kurt-rhee May 20, 2024
aeeb23b
Update pvlib/transformer.py
kurt-rhee May 20, 2024
3e0751c
Update pvlib/transformer.py
kurt-rhee May 20, 2024
0b18c43
Update pvlib/transformer.py
kurt-rhee May 20, 2024
8ab1001
Update pvlib/transformer.py
kurt-rhee May 20, 2024
aa31498
forgot to update arguments in test function
kurt-rhee May 20, 2024
865bfdf
updated formatting of docstring
kurt-rhee May 20, 2024
eb70aeb
Update pvlib/transformer.py
kurt-rhee May 21, 2024
35f122f
Update pvlib/transformer.py
kurt-rhee May 21, 2024
5592bc2
Update pvlib/transformer.py
kurt-rhee May 21, 2024
63649c8
Update pvlib/transformer.py
kurt-rhee May 21, 2024
d49fee5
Update pvlib/transformer.py
kurt-rhee May 21, 2024
7539402
adding space between equations in docstring
kurt-rhee May 21, 2024
d5a862c
fixing flake8 linting
kurt-rhee May 21, 2024
9fe05f8
removing whitespace
kurt-rhee May 21, 2024
99ab409
Update docs/sphinx/source/reference/transformer.rst
kurt-rhee May 21, 2024
feb2c30
Update pvlib/transformer.py
kurt-rhee May 21, 2024
e1522be
Update pvlib/transformer.py
kurt-rhee May 21, 2024
ae378c9
Update pvlib/transformer.py
kurt-rhee May 21, 2024
84ddbf2
Update pvlib/transformer.py
kurt-rhee May 21, 2024
9a7dbc6
Update pvlib/transformer.py
kurt-rhee May 21, 2024
288161b
Update docs/sphinx/source/whatsnew/v0.11.0.rst
kurt-rhee May 21, 2024
d080cc0
Update pvlib/transformer.py
kurt-rhee May 21, 2024
53934ec
Update pvlib/tests/test_transformer.py
kurt-rhee May 21, 2024
32b1aa0
Update pvlib/transformer.py
kurt-rhee May 21, 2024
477699d
Update pvlib/transformer.py
kurt-rhee May 22, 2024
d488cda
Update pvlib/transformer.py
kurt-rhee May 22, 2024
0318bfa
Merge branch 'main' into main
kurt-rhee May 23, 2024
8ed3c65
Update docs/sphinx/source/whatsnew/v0.11.0.rst
kurt-rhee May 28, 2024
90d3a61
Merge branch 'main' into main
cwhanse Jun 16, 2024
482e3b4
Update pvlib/transformer.py
kurt-rhee Jun 17, 2024
59657b8
Update pvlib/transformer.py
kurt-rhee Jun 17, 2024
c8ebe38
clean up derivation and docstring
kandersolar Jun 18, 2024
9164c67
change code calculations to match docstring
kandersolar Jun 18, 2024
816fe2a
test recovery of no-load and full-load values
kandersolar Jun 18, 2024
be62da6
bit more cleanup
kandersolar Jun 19, 2024
21abcde
typo
kandersolar Jun 19, 2024
db18c42
Apply suggestions from code review
kandersolar Jun 19, 2024
52a2593
Apply suggestions from code review
kandersolar Jun 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/sphinx/source/reference/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@ API reference
bifacial
scaling
location
transformer
11 changes: 11 additions & 0 deletions docs/sphinx/source/reference/transformer.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
.. currentmodule:: pvlib

Transformer losses
==================

Methods to account for losses in transformers

.. autosummary::
:toctree: generated/

transformer.simple_efficiency
3 changes: 3 additions & 0 deletions docs/sphinx/source/whatsnew/v0.11.0.rst
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ Deprecations

Enhancements
~~~~~~~~~~~~
* Add a simple transformer efficiency model :py:func:`pvlib.transformer.simple_efficiency`.
(:issue:`1269`, :pull:`2053`)
* Add function :py:func:`pvlib.shading.shaded_fraction1d`, to calculate the
shade perpendicular to ``axis_azimuth``. The function is applicable to both
fixed-tilt and one-axis tracking systems.
Expand Down Expand Up @@ -58,6 +60,7 @@ Requirements
Contributors
~~~~~~~~~~~~
* Cliff Hansen (:ghuser:`cwhanse`)
* Kurt Rhee (:ghuser:`kurt-rhee`)
* Mark Mikofski (:ghuser:`mikofski`)
* Siddharth Kaul (:ghuser:`k10blogger`)
* Ioannis Sifnaios (:ghuser:`IoannisSifnaios`)
Expand Down
60 changes: 60 additions & 0 deletions pvlib/tests/test_transformer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import pandas as pd

from numpy.testing import assert_allclose

from pvlib import transformer


def test_simple_efficiency():

# define test inputs
input_power = pd.Series([
-800.0,
436016.609823837,
1511820.16603752,
1580687.44677249,
1616441.79660171
])
no_load_loss = 0.002
load_loss = 0.007
transformer_rating = 2750000

# define expected test results
expected_output_power = pd.Series([
-6300.10103234071,
430045.854892526,
1500588.39919874,
1568921.77089526,
1604389.62839879
])

# run test function with test inputs
calculated_output_power = transformer.simple_efficiency(
input_power=input_power,
no_load_loss=no_load_loss,
load_loss=load_loss,
transformer_rating=transformer_rating
)

# determine if expected results are obtained
assert_allclose(calculated_output_power, expected_output_power)


def test_simple_efficiency_known_values():
no_load_loss = 0.005
load_loss = 0.01
rating = 1000
args = (no_load_loss, load_loss, rating)

# verify correct behavior at no-load condition
assert_allclose(
transformer.simple_efficiency(no_load_loss*rating, *args),
0.0
)

# verify correct behavior at rated condition
assert_allclose(
transformer.simple_efficiency(rating*(1 + no_load_loss + load_loss),
*args),
rating,
)
117 changes: 117 additions & 0 deletions pvlib/transformer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
"""
This module contains functions for transformer modeling.

Transformer models calculate AC power output and losses at a given input power.
"""


def simple_efficiency(
input_power, no_load_loss, load_loss, transformer_rating
):
r'''
Calculate the power at the output terminal of the transformer
after taking into account efficiency using a simple calculation.

The equation used in this function can be derived from [1]_.

For a zero input power, the output power will be negative.
This means the transformer will consume energy from the grid at night if
it stays connected (due to the parallel impedance in the equivalent
circuit).
If the input power is negative, the output power will be even more
negative; so the model can be used bidirectionally when drawing
energy from the grid.

Parameters
----------
input_power : numeric
The real AC power input to the transformer. [W]

no_load_loss : numeric
The constant losses experienced by a transformer, even
when the transformer is not under load. Fraction of transformer rating,
value from 0 to 1. [unitless]

load_loss: numeric
The load dependent losses experienced by the transformer.
Fraction of transformer rating, value from 0 to 1. [unitless]

transformer_rating: numeric
The nominal output power of the transformer. [VA]

Returns
-------
output_power : numeric
Real AC power output. [W]

Notes
-------
First, assume that the load loss :math:`L_{load}` (as a fraction of rated power
:math:`P_{nom}`) is proportional to the square of output power:

.. math::

L_{load}(P_{out}) &= L_{load}(P_{rated}) \times (P_{out} / P_{nom})^2

&= L_{full, load} \times (P_{out} / P_{nom})^2

Total loss is the constant no-load loss plus the variable load loss:

.. math::

L_{total}(P_{out}) &= L_{no, load} + L_{load}(P_{out})

&= L_{no, load} + L_{full, load} \times (P_{out} / P_{nom})^2


By conservation of energy, total loss is the difference between input and
output power:

.. math::

\frac{P_{in}}{P_{nom}} &= \frac{P_{out}}{P_{nom}} + L_{total}(P_{out})

&= \frac{P_{out}}{P_{nom}} + L_{no, load} + L_{full, load} \times (P_{out} / P_{nom})^2

Now use the quadratic formula to solve for :math:`P_{out}` as a function of
:math:`P_{in}`.

.. math::

\frac{P_{out}}{P_{nom}} &= \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}

a &= L_{full, load}

b &= 1

c &= L_{no, load} - P_{in} / P_{nom}

Therefore:

.. math::

P_{out} = P_{nom} \frac{-1 \pm \sqrt{1 - 4 L_{full, load}

\times (L_{no, load} - P_{in}/P_{nom})}}{2 L_{full, load}}

The positive root should be chosen, so that the output power is
positive.


References
----------
.. [1] Central Station Engineers of the Westinghouse Electric Corporation,
"Electrical Transmission and Distribution Reference Book" 4th Edition.
pg. 101.
''' # noqa: E501

input_power_normalized = input_power / transformer_rating

a = load_loss
b = 1
c = no_load_loss - input_power_normalized

output_power_normalized = (-b + (b**2 - 4*a*c)**0.5) / (2 * a)

output_power = output_power_normalized * transformer_rating
return output_power
Loading