-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Support for PV systems with multiple arrays #1076
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
Changes from 204 commits
4c1b9bc
532bf77
4cccbd5
6e980d5
527ea2c
8b096ab
a84eab9
955d932
39d47eb
2f7ccdb
0bc8a42
75bd755
22d6414
312c3f6
b9029d6
bc2c2c1
8ebcedc
05091f0
6602401
4f8f1dd
02d1bfc
7071cc7
8de0eae
0c75807
cdb3463
90dba53
202fc22
40ee652
be48170
c3796db
6ad6ade
03eac94
3e82f83
4ed9424
389d1b2
87a6000
1d21af4
3fa6ba3
c60c382
dfa07ca
26b7efb
accef41
adf366b
be8fc9e
cb0f670
8554aed
5f6a0ce
0e88f9e
25d7f94
55c202c
fc22db0
84653bb
97975f3
d90970d
16e6fa9
c82eccb
f82ff5e
402e42f
f220a82
9e7960f
2600141
b72840c
ea26f83
482b2fd
09bf16a
b23d3b5
ed929dd
493b704
7e1f3c1
2da65b4
8013029
7744a44
0606eb5
4231205
6611f57
3e4871c
75195b6
9ce66a4
e053674
e33a860
1abc17f
d4a82b1
070f628
a64d8b1
3376753
4abaf2b
b4ace32
cf8fd87
e666052
b187444
b98ea00
a49d16e
955f727
92f28f5
2783a87
0a00f52
71c7f3b
0b16384
df13360
94a087c
071ddf4
0b3c7ed
4d0ec6c
d7a64f6
d808820
0f4cbf7
5ef7b9a
8cfacfa
2f991f3
0096181
663fb0c
a0fa84b
f7fd6c7
919353b
59db97c
280a2a5
eb31432
cc87fd3
926044f
a430ab5
5c1cdb1
fa5a06f
5078e9d
a18b189
e28ac7e
e1be2bf
58c9e0c
0301ce7
08946f8
5167901
db6d736
99a63e7
85ee956
cf6e94c
f5f309d
a0047a4
e58db3a
54fc167
ca77bef
e4da96b
a43125f
4138990
03b9795
d542241
555c830
6c4e9f0
494560c
8960f25
ed2c72a
42e096a
c03625b
a7567c9
07b3d05
8936e60
f454807
c572153
11fe336
06203dd
9c53600
9c10612
57ba56f
46f0bfd
23c50fa
286667f
9b6ef5c
db8d046
784e1ad
6d1bff5
192a550
7c4a0af
404ffd1
529313a
ab8f982
a15eaa7
ce7f95d
5d9c1e6
b53d2be
224c968
07b9b5b
4f6744f
689fd82
d0fc6eb
fbb27a8
6ca45cc
aecf156
60e2c5d
57a0ab8
3530fd6
2644d6a
89053bc
1cb9e86
a809051
956df5a
40aa2da
f4f09c7
e5914a9
c283134
a3c374a
b267175
7353c84
f046347
6e14654
9e09c80
4534633
42dde2c
b23be5e
1673ca0
a277b0a
1d823cf
e4a00aa
0ee4a87
dc6b0ec
111ff32
93a70b4
5264866
4bd32ab
1dcda05
eef913a
82cccd2
bff88d1
bbf01d6
7114e58
00bed5e
aa2e65c
af04a55
1d061d6
036f601
268e736
7bc040a
002ca84
2e389fa
19ed9a2
68617fa
02e17c4
2cd4d7a
8433e24
252b545
1f13855
775d3bf
8eb21ac
8472e98
8cfab24
33ccfeb
c90136b
c2a1d7c
8d74ea5
159829a
823151f
f3b3751
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -27,5 +27,6 @@ dependencies: | |
- siphon # conda-forge | ||
- statsmodels | ||
- pip: | ||
- dataclasses | ||
- nrel-pysam>=2.0 | ||
- pvfactors==1.4.1 |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,13 +10,25 @@ PVSystem | |
from pvlib import pvsystem | ||
|
||
|
||
The :py:class:`~pvlib.pvsystem.PVSystem` class wraps many of the | ||
functions in the :py:mod:`~pvlib.pvsystem` module. This simplifies the | ||
API by eliminating the need for a user to specify arguments such as | ||
module and inverter properties when calling PVSystem methods. | ||
:py:class:`~pvlib.pvsystem.PVSystem` is not better or worse than the | ||
functions it wraps -- it is simply an alternative way of organizing | ||
your data and calculations. | ||
The :py:class:`~pvlib.pvsystem.PVSystem` represents one inverter and the | ||
PV modules that supply DC power to the inverter. A PV system may be on fixed | ||
mounting or single axis trackers. The :py:class:`~pvlib.pvsystem.PVSystem` | ||
is supported by the :py:class:`~pvlib.pvsystem.Array` which represents the | ||
PV modules in the :py:class:`~pvlib.pvsystem.PVSystem`. An instance of | ||
:py:class:`~pvlib.pvsystem.PVSystem` has a single inverter, but can have | ||
multiple instances of :py:class:`~pvlib.pvsystem.Array`. Arrays can have | ||
different tilt, orientation, and number or type of modules. | ||
|
||
The :py:class:`~pvlib.pvsystem.PVSystem` class methods wrap many of the | ||
functions in the :py:mod:`~pvlib.pvsystem` module. Similarly, | ||
:py:class:`~pvlib.pvsystem.Array` wraps several functions with its class | ||
methods. Methods that wrap functions have similar names as the wrapped functions. | ||
This practice simplifies the API for :py:class:`~pvlib.pvsystem.PVSystem` | ||
and :py:class:`~pvlib.pvsystem.Array` methods by eliminating the need to specify | ||
arguments that are stored as attributes of these classes, such as | ||
module and inverter properties. Using :py:class:`~pvlib.pvsystem.PVSystem` | ||
is not better or worse than using the functions it wraps -- it is an | ||
alternative way of organizing your data and calculations. | ||
|
||
This guide aims to build understanding of the PVSystem class. It assumes | ||
basic familiarity with object-oriented code in Python, but most | ||
|
@@ -40,26 +52,55 @@ data that influences the PV system (e.g. the weather). | |
The data that represents the PV system is *intrinsic*. The | ||
data that influences the PV system is *extrinsic*. | ||
|
||
Intrinsic data is stored in object attributes. For example, the data | ||
that describes a PV system's module parameters is stored in | ||
`PVSystem.module_parameters`. | ||
Intrinsic data is stored in object attributes. For example, the parameters | ||
that describe a PV system's inverter is stored in | ||
`PVSystem.inverter_parameters`. | ||
|
||
.. ipython:: python | ||
|
||
module_parameters = {'pdc0': 10, 'gamma_pdc': -0.004} | ||
system = pvsystem.PVSystem(module_parameters=module_parameters) | ||
inverter_parameters = {'pdc0': 5000, 'eta_inv_nom': 0.96} | ||
system = pvsystem.PVSystem(inverter_parameters=inverter_parameters) | ||
print(system.inverter_parameters) | ||
|
||
In the case of a PV system with a single array, the parameters that describe the | ||
system's modules can be provided directly to `PVSystem.module_parameters`: | ||
|
||
.. ipython:: python | ||
|
||
module_parameters = {'pdc0': 5000, 'gamma_pdc': -0.004} | ||
system = pvsystem.PVSystem(module_parameters=module_parameters, | ||
inverter_parameters=inverter_parameters) | ||
print(system.module_parameters) | ||
|
||
Extrinsic data is passed to a PVSystem as method arguments. For example, | ||
In the case of a PV system with several arrays, the module parameters are | ||
provided for each array, and the arrays are provided to | ||
:py:class:`~pvlib.pvsystem.PVSystem` as a tuple or list of instances of | ||
:py:class:`~pvlib.pvsystem.Array`: | ||
|
||
.. ipython:: python | ||
|
||
module_parameters = {'pdc0': 5000, 'gamma_pdc': -0.004} | ||
array_one = pvsystem.Array(module_parameters=module_parameters) | ||
array_two = pvsystem.Array(module_parameters=module_parameters) | ||
system_two_arrays = pvsystem.PVSystem(arrays=[array_one, array_two], | ||
inverter_parameters=inverter_parameters) | ||
print(system_two_arrays.module_parameters) | ||
print(system_two_arrays.inverter_parameters) | ||
|
||
Note that in the case of a PV system with multiple arrays, the | ||
`module_parameters` attribute contains a tuple with the `module_parameters` | ||
for each array. | ||
|
||
Extrinsic data is passed to a PVSystem instance as method arguments. For example, | ||
the :py:meth:`~pvlib.pvsystem.PVSystem.pvwatts_dc` method accepts extrinsic | ||
data irradiance and temperature. | ||
|
||
.. ipython:: python | ||
|
||
pdc = system.pvwatts_dc(1000, 30) | ||
pdc = system.pvwatts_dc(g_poa_effective=1000, temp_cell=30) | ||
print(pdc) | ||
|
||
Methods attached to a PVSystem object wrap corresponding functions in | ||
Methods attached to a PVSystem object wrap the corresponding functions in | ||
:py:mod:`~pvlib.pvsystem`. The methods simplify the argument list by | ||
using data stored in the PVSystem attributes. Compare the | ||
:py:meth:`~pvlib.pvsystem.PVSystem.pvwatts_dc` method signature to the | ||
|
@@ -95,66 +136,92 @@ as well as the incidence angle modifier methods. | |
PVSystem attributes | ||
------------------- | ||
|
||
Here we review the most commonly used PVSystem attributes. Please see | ||
the :py:class:`~pvlib.pvsystem.PVSystem` class documentation for a | ||
comprehensive list. | ||
|
||
The first PVSystem parameters are `surface_tilt` and `surface_azimuth`. | ||
These parameters are used in PVSystem methods such as | ||
:py:meth:`~pvlib.pvsystem.PVSystem.get_aoi` and | ||
:py:meth:`~pvlib.pvsystem.PVSystem.get_irradiance`. Angle of incidence | ||
Here we review the most commonly used PVSystem and Array attributes. | ||
Please see the :py:class:`~pvlib.pvsystem.PVSystem` and | ||
:py:class:`~pvlib.pvsystem.Array` class documentation for a | ||
comprehensive list of attributes. | ||
|
||
The first parameters which describe the DC part of a PV system are the tilt | ||
and azimuth of the modules. In the case of a PV system with a single array, | ||
these parameters can be specified using the `PVSystem.surface_tilt` and | ||
`PVSystem.surface_azimuth` attributes. In the case of a PV system with | ||
several arrays, the parameters are specified for each array using | ||
the attributes `Array.surface_tilt` and `Array.surface_azimuth`. | ||
|
||
The `surface_tilt` and `surface_azimuth` attributes are used in PVSystem | ||
(or Array) methods such as :py:meth:`~pvlib.pvsystem.PVSystem.get_aoi` or | ||
:py:meth:`~pvlib.pvsystem.Array.get_aoi`. The angle of incidence (AOI) | ||
(AOI) calculations require `surface_tilt`, `surface_azimuth` and also | ||
the sun position. The :py:meth:`~pvlib.pvsystem.PVSystem.get_aoi` method | ||
uses the `surface_tilt` and `surface_azimuth` attributes in its PVSystem | ||
object, and so requires only `solar_zenith` and `solar_azimuth` as | ||
arguments. | ||
the extrinsic sun position. The `PVSystem` method :py:meth:`~pvlib.pvsystem.PVSystem.get_aoi` | ||
uses the `surface_tilt` and `surface_azimuth` attributes from the | ||
:py:class:`pvlib.pvsystem.PVSystem` instance, and so requires only `solar_zenith` | ||
and `solar_azimuth` as arguments. The `Array` method :py:meth:`~pvlib.pvsystem.Array.get_aoi` | ||
operates in a similar manner. These two methods differ only in scope: the | ||
`Array` method operates only on the `Array` instance, whereas the `PVSystem` | ||
method operates on all `Array` instances. | ||
|
||
.. ipython:: python | ||
|
||
# 20 deg tilt, south-facing | ||
system = pvsystem.PVSystem(surface_tilt=20, surface_azimuth=180) | ||
print(system.surface_tilt, system.surface_azimuth) | ||
# single south-facing array at 20 deg tilt | ||
system_one_array = pvsystem.PVSystem(surface_tilt=20, surface_azimuth=180) | ||
print(system_one_array.surface_tilt, system_one_array.surface_azimuth) | ||
|
||
# call get_aoi with solar_zenith, solar_azimuth | ||
aoi = system.get_aoi(30, 180) | ||
aoi = system_one_array.get_aoi(solar_zenith=30, solar_azimuth=180) | ||
print(aoi) | ||
|
||
.. ipython:: python | ||
|
||
# two arrays each at 30 deg tilt with different facing | ||
array_one = pvsystem.Array(surface_tilt=30, surface_azimuth=90) | ||
array_two = pvsystem.Array(surface_tilt=30, surface_azimuth=220) | ||
system_multiarray = pvsystem.PVSystem(arrays=[array_one, array_two]) | ||
print(system_multiarray.num_arrays) | ||
# call get_aoi with solar_zenith, solar_azimuth | ||
aoi = system_multiarray.get_aoi(solar_zenith=30, solar_azimuth=180) | ||
print(aoi) | ||
|
||
Note that when the PV system includes more than one array, the output of the | ||
`PVSystem` method :py:meth:`~pvlib.pvsystem.PVSystem.get_aoi` is a *tuple* with | ||
the order of the elements corresponding to the order of the arrays. If the AOI | ||
is desired for a specific array, the `Array` method :py:meth:`~pvlib.pvsystem.Array.get_aoi` | ||
returns the AOI for the specific array. | ||
|
||
.. ipython:: python | ||
|
||
aoi = array_one.get_aoi(solar_zenith=30, solar_azimuth=180) | ||
print(aoi) | ||
|
||
`module_parameters` and `inverter_parameters` contain the data | ||
necessary for computing DC and AC power using one of the available | ||
PVSystem methods. These are typically specified using data from | ||
the :py:func:`~pvlib.pvsystem.retrieve_sam` function: | ||
PVSystem methods. Values for these attributes can be obtained from databases | ||
included with pvlib python by using the :py:func:`~pvlib.pvsystem.retrieve_sam` function: | ||
|
||
.. ipython:: python | ||
|
||
# Load the database of CEC module model parameters | ||
modules = pvsystem.retrieve_sam('cecmod') | ||
# retrieve_sam returns a dict. the dict keys are module names, | ||
# and the values are model parameters for that module | ||
modules = pvsystem.retrieve_sam('cecmod') | ||
module_parameters = modules['Canadian_Solar_Inc__CS5P_220M'] | ||
# Load the database of CEC inverter model parameters | ||
inverters = pvsystem.retrieve_sam('cecinverter') | ||
inverter_parameters = inverters['ABB__MICRO_0_25_I_OUTD_US_208__208V_'] | ||
system = pvsystem.PVSystem(module_parameters=module_parameters, inverter_parameters=inverter_parameters) | ||
system_one_array = pvsystem.PVSystem(module_parameters=module_parameters, | ||
inverter_parameters=inverter_parameters) | ||
|
||
|
||
The module and/or inverter parameters can also be specified manually. | ||
This is useful for specifying modules and inverters that are not | ||
included in the supplied databases. It is also useful for specifying | ||
systems for use with the PVWatts models, as demonstrated in | ||
:ref:`designphilosophy`. | ||
|
||
The `losses_parameters` attribute contains data that may be used with | ||
methods that calculate system losses. At present, these methods include | ||
only :py:meth:`PVSystem.pvwatts_losses | ||
<pvlib.pvsystem.PVSystem.pvwatts_losses>` and | ||
:py:func:`pvsystem.pvwatts_losses <pvlib.pvsystem.pvwatts_losses>`, but | ||
we hope to add more related functions and methods in the future. | ||
This is useful for modules or inverters that are not | ||
included in the supplied databases, or when using the PVWatts model, | ||
as demonstrated in :ref:`designphilosophy`. | ||
|
||
The attributes `modules_per_string` and `strings_per_inverter` are used | ||
in the :py:meth:`~pvlib.pvsystem.PVSystem.scale_voltage_current_power` | ||
method. Some DC power models in :py:class:`~pvlib.modelchain.ModelChain` | ||
automatically call this method and make use of these attributes. As an | ||
example, consider a system with 35 modules arranged into 5 strings of 7 | ||
modules each. | ||
example, consider a system with a single array comprising 35 modules | ||
arranged into 5 strings of 7 modules each. | ||
|
||
.. ipython:: python | ||
|
||
|
@@ -165,6 +232,60 @@ modules each. | |
data_scaled = system.scale_voltage_current_power(data) | ||
print(data_scaled) | ||
|
||
The `losses_parameters` attribute contains data that may be used with | ||
methods that calculate system losses. At present, these methods include | ||
only :py:meth:`PVSystem.pvwatts_losses | ||
<pvlib.pvsystem.PVSystem.pvwatts_losses>` and | ||
:py:func:`pvsystem.pvwatts_losses <pvlib.pvsystem.pvwatts_losses>`, but | ||
wfvining marked this conversation as resolved.
Show resolved
Hide resolved
|
||
we hope to add more related functions and methods in the future. | ||
|
||
.. _multiarray: | ||
|
||
PVSystem with multiple Arrays | ||
----------------------------- | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is a fine section on its own, but it doesn't really work in the context of the entire page and the actual API. We need to rethink at least the "PVSystem Attributes" section as we add this. I'd probably also introduce the Array class in the first paragraph of the page. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @wholmgren see if this rewrite works better. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, I like the modified There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @cwhanse did you intend to delete this multiple arrays section when rewriting the attributes section? This one is now repetitive. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I didn't consider that, happy to look at it. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Agreed that it's a bit strange to arrive at the |
||
|
||
It is possible to model a system with multiple arrays by passing a list of | ||
:py:class:`~pvlib.pvsystem.Array` to the :py:class:`~pvlib.pvsystem.PVSystem` | ||
constructor. The :py:class:`~pvlib.pvsystem.Array` class includes those | ||
:py:class:`~pvlib.pvsystem.PVSystem` attributes that may vary from array | ||
to array. These attributes include `surface_tilt`, `surface_azimuth`, | ||
`module_parameters`, `temperature_model_parameters`, `modules_per_string`, | ||
`strings_per_inverter`, `albedo`, `surface_type`, `module_type`, and | ||
`racking_model`. | ||
|
||
.. ipython:: python | ||
|
||
array_one = pvsystem.Array(surface_tilt=30, surface_azimuth=90) | ||
array_two = pvsystem.Array(surface_tilt=30, surface_azimuth=220) | ||
system = pvsystem.PVSystem(arrays=[array_one, array_two]) | ||
system.num_arrays | ||
|
||
When instantiating a :py:class:`~pvlib.pvsystem.PVSystem` with a tuple or list | ||
of :py:class:`~pvlib.pvsystem.Array`, each array parameter must be specified individually | ||
when each instance of :py:class:`~pvlib.pvsystem.Array` is constructed. | ||
For example, if all arrays are at the same tilt you must specify that tilt for | ||
every array. When using :py:class:`~pvlib.pvsystem.Array` you shouldn't | ||
also pass any array attributes to the `PVSystem` attributes; these values | ||
are ignored. | ||
|
||
The output of `PVSystem` methods and attributes changes when the system has | ||
multiple arrays. Accessing any of Array attributes on the PVSystem object returns | ||
return a tuple with the value of the attribute for each array, in | ||
the same order as the `PVSystem.arrays` parameter. For example, using the system | ||
constructed above: | ||
|
||
.. ipython:: python | ||
|
||
system.surface_tilt | ||
system.surface_azimuth | ||
|
||
Similarly, other `PVSystem` methods expect tuples as input and return tuples: | ||
|
||
.. ipython:: python | ||
|
||
aoi = system.get_aoi(solar_zenith=30, solar_azimuth=180) | ||
print(aoi) | ||
system.get_iam(aoi) | ||
|
||
.. _sat: | ||
|
||
|
@@ -176,4 +297,4 @@ The :py:class:`~pvlib.tracking.SingleAxisTracker` is a subclass of | |
includes a few more keyword arguments and attributes that are specific | ||
to trackers, plus the | ||
:py:meth:`~pvlib.tracking.SingleAxisTracker.singleaxis` method. It also | ||
overrides the `get_aoi` and `get_irradiance` methods. | ||
overrides the `get_aoi` and `get_irradiance` methods. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
.. _whatsnew_0810: | ||
wfvining marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
v0.9.0 (MONTH DAY YEAR) | ||
----------------------- | ||
|
||
Breaking changes | ||
~~~~~~~~~~~~~~~~ | ||
|
||
|
||
Deprecations | ||
~~~~~~~~~~~~ | ||
* The following ``ModelChain`` attributes are deprecated. They have been moved | ||
to the :py:class:`~pvlib.modelchain.ModelChainResult` class that is | ||
accessible via ``ModelChain.results`` | ||
* ``ModelChain.ac`` | ||
* ``ModelChain.airmass`` | ||
* ``ModelChain.aoi`` | ||
* ``ModelChain.aoi_modifier`` | ||
* ``ModelChain.cell_temperature`` | ||
* ``ModelChain.dc`` | ||
* ``ModelChain.diode_params`` | ||
* ``ModelChain.effective_irradiance`` | ||
* ``ModelChain.spectral_modifier`` | ||
* ``ModelChain.total_irrad`` | ||
* ``ModelChain.tracking`` | ||
wfvining marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
Enhancements | ||
~~~~~~~~~~~~ | ||
* In :py:class:`~pvlib.modelchain.ModelChain`, attributes which contain | ||
output of models are now collected into ``ModelChain.results``. | ||
(:pull:`1076`, :issue:`1067`) | ||
* Added :py:class:`~pvlib.pvsystem.Array` class to represent an array of | ||
modules separately from a :py:class:`~pvlib.pvsystem.PVSystem`. | ||
(:pull:`1076`, :issue:`1067`) | ||
* Added capability for modeling a PV system with multiple arrays in | ||
:py:class:`~pvlib.pvsystem.PVSystem`. Updates the ``PVSystem`` API | ||
to operate on and return tuples where each element of the tuple corresponds | ||
to the input or output for a specific ``Array``. (:pull:`1076`, | ||
:issue:`1067`) | ||
* Support for systems with multiple ``Arrays`` added to | ||
:py:class:`~pvlib.modelchain.ModelChain`. This includes substantial API | ||
enhancements for accepting different weather input for each ``Array`` in the | ||
system. (:pull:`1076`, :issue:`1067`) | ||
* Support for :py:func:`~pvlib.inverter.sandia_multi` added to | ||
:py:class:`~pvlib.pvsystem.PVSystem` and | ||
:py:class:`~pvlib.modelchain.ModelChain` (as ``ac_model='sandia_multi'``). | ||
(:pull:`1076`, :issue:`1067`) | ||
|
||
Bug fixes | ||
~~~~~~~~~ | ||
|
||
Testing | ||
~~~~~~~ | ||
|
||
Documentation | ||
~~~~~~~~~~~~~ | ||
|
||
Requirements | ||
wfvining marked this conversation as resolved.
Show resolved
Hide resolved
|
||
~~~~~~~~~~~~ | ||
|
||
|
||
Contributors | ||
~~~~~~~~~~~~ | ||
* Will Holmgren (:ghuser:`wholmgren`) | ||
* Cliff Hansen (:ghuser:`cwhanse`) | ||
* Will Vining (:ghuser:`wfvining`) | ||
wfvining marked this conversation as resolved.
Show resolved
Hide resolved
|
Uh oh!
There was an error while loading. Please reload this page.