Residential Solar PV Adoption 1.0

No preview image

This model is seeking new collaborators — would you please help?

4 collaborators

Default-person Steven Kimbrough (Author)
Default-person Rolando Fuentes (Author)
Default-person Patrick Bean (Author)
Patrick T. Bean (Author)

Tags

"solar energy" 

Tagged by Steven Kimbrough over 10 years ago

electricity utilities 

Tagged by Steven Kimbrough over 10 years ago

solar 

Tagged by Steven Kimbrough over 10 years ago

solar pv` 

Tagged by Steven Kimbrough over 10 years ago

sustainability 

Tagged by Steven Kimbrough over 10 years ago

Visible to everyone | Changeable by the author
Model was written in NetLogo 6.0 • Viewed 1160 times • Downloaded 83 times • Run 0 times
Download the 'Residential Solar PV Adoption 1.0' modelDownload this modelEmbed this model

Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)


THE RESIDENTIAL SOLAR PV ADOPTION MODEL, Version 1.0

Patrick Bean, Rolando Fuentes, Steven O. Kimbrough, and Mohammed Muaafa

Residential solar installations are becoming an economically attractive alternative to local utility service in some areas of the world due to declining photovoltaic (PV) prices, financial incentives and innovative financing mechanisms. Over 250,000 customers in California added solar PV systems to their homes since 2011, and over 1 percent of the state’s residential customers have PV. In Hawaii, market penetration of residential PV is approaching 6 percent.

Electricity sales from incumbent utilities are experiencing downward pressure as more customers decide to produce their own electricity with PV. This is a concern for utilities because it threatens their ability to recover their fixed costs, which are recovered through volumetric rates. Some observers view this feedback as a potential “death spiral” in which utilities must continually raise prices to recover costs, which then further perpetuates adoption of PV and erosion of the utility’s revenue. To begin investigating this phenomenon and its potential implications, KAPSARC developed the Residential Solar PV Adoption Model. The purpose of the model is to describe the adoption over time of residential PV under realistic assumptions regarding consumer behavior. In particular, the model takes into account electricity prices, levelized costs of PV, contagion effects of PV adoption, and the type of residence and whether it is suitable for PV.

WHAT IS IT?

Context

Electric power prices charged by utilities reflect the marginal cost of producing the electricity provided, profit, and a charge to recover the fixed costs of transmission and distribution. Residential customers installing solar PV (or indeed any other demand reduction measure) reduce their payments to the associated utility. A portion of the foregone payments, however, is allocated to recovering the fixed costs (and associated profits) of the transmission and distribution system. To the extent that these revenues to the utility are reduced, it must increase its prices in order to recover costs and keep profits fixed. Increased prices, however, serve to encourage more adoption of residential solar PV.

Purpose

The purpose of the Residential Solar PV Adoption model is to describe the adoption over time of residential solar PV under realistic assumptions regarding consumer behavior. In particular, the model takes into account type of residence, size of PV installation, and contagion effects of existing installations. It is assumed that customers adopt probabilistically, depending upon these various conditions.

Basic Story

Time proceeds discretely. At the start of each episode a price schedule for electric power is announced. Also, a price schedule for solar PV is announced. Eligible (to install PV) customers are those who have appropriate residences and who do not already have solar PV installed. During the episode eligible customers adopt solar PV with a probability depending upon the cost of electric power from the utility, the cost of solar power, and the prevalence of solar adopters in the neighborhood. Depending upon the number of adoptions, and possibly external factors, the utility updates its price schedule for electric power, effective at the start of the next period.

HOW TO USE IT

See the Interface note:

 (1) Set the sliders above to the values you desire. Then click the SETUP button.

To begin, click the SETUP button to set up the turtles. There are three kinds of turtles, highs (colored red and representing large residences), lows (colored blue and representing small residences), and nones (colored yellow and representing residences not eligible to install solar PV). Set the percentages desired with the sliders %-highs and %-lows.

When you click the SETUP button, the program creates number-of-residences (see slider) turtles with kinds highs, lows, and nones in the proportions %-highs, %-lows indicated by the sliders. The turtles are scattered randomly on distinct patches. And then the program clusters the residences weakly by type, using a variant of the Segratation.nlogo algorithm. Setting %-similar-wanted to 0 results in simply random placement of the residences, without regard to type.

Next, consider the optional step:

 (1a-optional) Set values in the sliders below, then click the DISPLAY-LOGISTIC
 button to see a plot of the probability function for solar adoption, as well as a
 tabular display of data in the output box to the left.

In any event, you need to set or at least consider the sliders and input boxes immediately below. They are:

  • current-price. This is the residential electricity price from the utility, in cents per kilowatt hour.
  • solar-PV-cost. This is the leveled cost of solar PV, in cents per kilowatt hour.
  • neighborhood-effect. This is a premium subtracted from the solar-PV-cost, meant to represent a behavior that in effect reduces the "mental" perceived cost of solar. It might, for example, represent a reduction in the perceived risk of installing solar. It is measured in cents per kilowatt hour.
  • k. This is a scaling parameter in the logistic function, which the model uses to determine the probability, in a given period, of adoption of solar PV. See the "Mirrored Logistic Function" section below for elaboration.
  • L-scale. This is a scaling parameter for the logistic function, which the model uses to determine the probability, in a given period, of adoption of solar PV. See the "Mirrored Logistic Function" section below for elaboration.
  • Prob_big_solar_given_high. This is the probability, for a large (high) customer that is committed to installing solar PV this period, that the customer chooses a big (4 kW) installation, instead of a small (2 kW) installation.
  • Prob_big_solar_given_low. This is the probability, for a small (low) customer that is committed to installing solar PV this period, that the customer chooses a big (4 kW) installation, instead of a small (2 kW) installation.

Whether or not you choose to execute the optional step, at (1a-optional), set the above sliders and input boxes, then view the note at the bottom, left of center:

(2) Set the count-years-simulated slider (to the left), then click the GO YEARS 
SIMULATED button to run the model for count-years-simulated. Each tick corresponds
to 1 year.

Click the GO YEARS SIMULATED button to start the simulation.

THINGS TO NOTICE

When you execute SETUP, the residences are distributed in a random yet clustered fashion, with like preferring like, driven by the value of %-similar-wanted.

THINGS TO TRY

Try different values for %-SIMILAR-WANTED. How does the overall degree of segregation change?

Measures of performance (MoPs) for the model are embodied in the several reporters on the user Interface. Use BehaviorSpace with these reporters to measure the runs, and systematically vary the several model variables.

EXTENDING THE MODEL

Perhaps rename highs and lows to big and small. Consider using different logistic functions (parameterized) for the two types of houses, big and small. Add, a decision about sizing the solar panel, once the decision is made to adopt it. This is a step now missing.

House Type P(large solar | going solar) P(small solar | going solar) ========== ============================ ============================ Big Small None

Rolando: Can we have an initial layout that is a realistic geography, with richer and poorer neighborhood? Steve: Yes, absolutely. In the future. We first need to tell a basic story on how this work, then it can be coded.

Add the capability of using an empirical distribution of PV sizes. Do this to constitute version 1.1.

THE MIRRORED LOGISTIC FUNCTION

We need a function whose range is a probability, 0 to 1, and whose domain is a continuous variable, x, such that as x increases the function's value decreases.

A natural function here is the mirrored logistic function. That is, 1 - logistic(x). The regular logistic has a general "S". The mirrored an inverted "S". This makes good sense for the probability in a given period that an agent will convert to solar if it hasn't already.

The general form of the logistic is

 y = f(x) = L / (1 + e^(-k*x))

where L is a scaling constant, and k is a free parameter that affects the slope of the curve.

Notice that at x = 0, f(x) = 0.5 * L.

And we want g(x),

 g(x) = 1 - f(x).

We need to introduce more parameters here, as follows:

 x = cs - pu - ne

With the following interpretations:

cs = cost of solar PV power in cents per kWH, solar-PV-cost in the code and Interface slider.

pu = price of utility power in cents per kWH, current-price in the code and Interface slider.

Finally, ne is the neighborhood effect (a positive number, neighborhood-effect in the code and Interface slider), which serves to reduce the value of x, and hence increase the probability of adoption (as it increases).

CREDITS AND REFERENCES

Chai, D.W.H., Adlakha, S., Low, S.H., De Martini, P., Chandy, K.M. Impact of residential PV adoption on retail electricity rates. (2013). Energy Policy 62, pp. 830-843.

Bean, Patrick, Fuentes, Rolando, Kimbrough, Steven O., and Muaafa, Mohammed, Residential Solar PV Adoption model, version 1.0. (2015) File: Residential Solar PV Adoption Model 1.0.nlogo.

HOW TO CITE

If you mention this model in a publication, we ask that you include these citations for the model itself and for the NetLogo software:

  • Bean, Patrick, Fuentes, Rolando, Kimbrough, Steven O., and Muaafa, Mohammed, Residential Solar PV Adoption model, version 1.0. (2015) File: Residential Solar PV Adoption Model 1.0.nlogo.
  • Wilensky, U. (1999). NetLogo. http://ccl.northwestern.edu/netlogo/. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL.

COPYRIGHT AND LICENSE

CC BY-NC-SA 3.0

This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

Commercial licenses are also available. To inquire about commercial licenses, please contact Uri Wilensky at uri@northwestern.edu.

This model was created as part of the project: CONNECTED MATHEMATICS: MAKING SENSE OF COMPLEX PHENOMENA THROUGH BUILDING OBJECT-BASED PARALLEL MODELS (OBPML). The project gratefully acknowledges the support of the National Science Foundation (Applications of Advanced Technologies Program) -- grant numbers RED #9552950 and REC #9632612.

This model was converted to NetLogo as part of the projects: PARTICIPATORY SIMULATIONS: NETWORK-BASED DESIGN FOR SYSTEMS LEARNING IN CLASSROOMS and/or INTEGRATED SIMULATION AND MODELING ENVIRONMENT. The project gratefully acknowledges the support of the National Science Foundation (REPP & ROLE programs) -- grant numbers REC #9814682 and REC-0126227. Converted from StarLogoT to NetLogo, 2001.

Note

2017-04-04

Downloaded from the modeling commons and converted to Netlogo 6.

Comments and Questions

Download the model

I would like to download the model, as part of my master thesis I'm making an Netlogo model concerning Solar PV and electricity storage. However, when I try to download the model, I get an error when I try to unzip it. I've tried it on multiple PCs. Can someone help me with this? Michiel

Posted almost 10 years ago

Failed downloading

Hi, I just saw the previous message, just happened to be online. Well, I also just tested the download and it worked fine. I'd suggest downloading the zip file to your computer, then unzipping it, then run it. It just now worked fine for me. If you still have trouble, post a message with your email address and I'll send you the file directly.

Posted almost 10 years ago

unzip...

I tried this, during unzipping I still get an error, no clue why... Can you email it to me? michiel1234@hotmail.com Thanks a lot!

Posted almost 10 years ago

Unzip Error (Question)

I'm also getting an error unzipping the model. Any chance you could email it to me? hsheldon@stevens.edu

Posted over 4 years ago

Just posted a version converted to NetLogo 6

From the comments I see that people are sometimes having trouble downloading the model. I don't know why. I use it in teaching regularly without a problem. Anyway I just posted a version that works with NetLogo 6. Cheers, Steve

Posted over 4 years ago

Issue with model zip download (Question)

I'm having the same issue reported by other users with the model zip file. Whenever I download the model zip file and try to unzip it gives me CRC error even when using different zip apps. Would it be possible to pelase send the unzipped model to my email please. pmiranda.pt@gmail.com Really appreciated.

Posted about 1 year ago

Click to Run Model

globals [
  percent-similar  ;; on the average, what percent of a turtle's neighbors
                   ;; are the same color as that turtle?
  percent-unhappy  ;; what percent of the turtles are unhappy?

  current-cost ;; of solar, discounted in cents/kWH

  new-installations ;; the count of new installations occurring during a tick
  neighborhood-size ;; the radius that a residence examines for solar among its neighbors
  new-high-installations new-low-installations ;; See beginning of go for explanation.
  solar-low solar-high  ;; Simply end points for plotting and reporting.
]

turtles-own [
  happy?       ;; for each turtle, indicates whether at least %-similar-wanted percent of
               ;; that turtles' neighbors are the same color as the turtle
  similar-nearby   ;; how many neighboring patches have a turtle with my color?
  other-nearby ;; how many have a turtle of another color?
  total-nearby  ;; sum of previous two variables

  has-solar?
  getting-solar?
  solar-size
]

breed [highs high-guy]
breed [lows low-guy]
breed [nones none-guy]

to setup
  clear-all
  set solar-low -5
  set solar-high 50
  if number-of-residences > count patches
    [ user-message (word "This pond only has room for " count patches " turtles.")
      stop ]
  ;; create turtles on random patches.
  ask n-of number-of-residences patches
    [ let my-type random-float 1
      ;; Here we are assuming three breeds of turtle residences.
      if my-type <= %-highs
      [sprout-highs 1
      [ set color red ] ]
      if my-type > %-highs and my-type <= %-highs + %-lows
      [sprout-lows 1
        [set color blue]]
      if my-type > %-highs + %-lows
      [sprout-nones 1
        [set color yellow]]
    ]

  ask turtles [set shape "dot"
    set has-solar? false
    set getting-solar? false]
  ask patches [set pcolor 7]
  update-variables
  go-setup
  display-logistic
  set current-cost solar-PV-cost
  set neighborhood-size 3 ;; Note this is hard wired. Later,
  ;; consider adding a widget to explore different values.
  reset-ticks
end 

to go-setup
  let mycount 0
  while [not all? turtles [happy?] and mycount < 1000]
  [set mycount (mycount + 1)
    move-unhappy-turtles
  update-variables]
end 

to move-unhappy-turtles
  ask turtles with [ not happy? ]
    [ find-new-spot ]
end 

to find-new-spot
  rt random-float 360
  fd random-float 10
  if any? other turtles-here
    [ find-new-spot ]          ;; keep going until we find an unoccupied patch
  move-to patch-here  ;; move to center of patch
end 

to update-variables
  update-turtles
  update-globals
end 

to update-turtles
  ask turtles [
    ;; in next two lines, we use "neighbors" to test the eight patches
    ;; surrounding the current patch
    set similar-nearby count (turtles-on neighbors)
      with [color = [color] of myself]
    set other-nearby count (turtles-on neighbors)
      with [color != [color] of myself]
    set total-nearby similar-nearby + other-nearby
    set happy? similar-nearby >= ( %-similar-wanted * total-nearby / 100 )
  ]
end 

to update-globals
  let similar-neighbors sum [similar-nearby] of turtles
  let total-neighbors sum [total-nearby] of turtles
  set percent-similar (similar-neighbors / total-neighbors) * 100
  set percent-unhappy (count turtles with [not happy?]) / (count turtles) * 100
end 

to go
  set new-high-installations 0 ;; This will be our counter for the tick, to
  ;; record the number of new installations to the high (large) houses.
  set new-low-installations 0  ;; This will be our counter for the tick, to
  ;; record the number of new installations to the low (small) houses.
  set new-installations 0 ;; This will be our counter for the total number of
  ;; new installations during the tick/period.

  ;; Process first the highs, that is, the larger residences.
  ask highs [
    ;; Does the residence already have solar? If so, then just skip
    ;; what follows and go on to the next one.
    if not has-solar?
    [ ;; OK, this residence does not have solar installed at this time.
      ;; Now, we will determine whether it will adopt solar during this period.
      ;; First, we need to determine if a neighborhood effect will happen.
      ;; From the Interface tab, neighborhood-effect is a positive floating
      ;; number, representing a cents per kWH effective cost reduction for solar
      ;; to the potential adopter. That is, we do this to model a positive effect
      ;; from having neighbors with solar already.
      ;; So, the value we want to use is either 0 if no one has solar or
      ;; neighborhood-effect if at least one residence nearby has solar.
      ;; Just to be a little clearer, the agent's probability of adopting solar
      ;; is a function of the solar cost - the utility price - the neighborhood effect.
      ;; Here, we either have 0 neighborhood effect, or the value neighborhood-effect (from the
      ;; Interface slider) depending upon whether there is at least one neighbor within 3 patches who
      ;; already has solar.
      let ne 0
      if count turtles in-radius neighborhood-size with [has-solar? = true] > 0
      [set ne neighborhood-effect]
      ;; Now determine whether this guy will in fact adopt solar this period.
      ;; Use the logistic (simple-mirrored-logistic) function/reporter to
      ;; determine its probability, draw the random number and if (and only if)
      ;; it is < the probabilty, install solar.
      ;; See below for the the-score reporter, but basically it calcuates
      ;; x = solar PV cost - current price from the utility - the neighborhood effect.
      ;; Then simple-mirrored-logistic, calculates the probability of adoption, given x and
      ;; k, the scaling parameter, and then L-scale compresses it overall.
      ;; We promise: more information in the Info tab.
      if random-float 1 <
        (simple-mirrored-logistic(the-score(solar-PV-cost)(current-price)(ne))(k) * L-scale)
      ;; So if indeed the guy installs PV this period, set its flag to say "I'm going to get solar"
      ;; (that is, getting-solar?) to true. Increment the number new high installations by 1.
      ;; And finally, call the get-solar-size reporter to determine what size solar the residence
      ;; is getting, and set its solar-size attribute to that value.
      [set getting-solar? true
       set new-high-installations (new-high-installations + 1)
       set solar-size get-solar-size(Prob_big_solar_given_high)
       ]
    ]
  ] ;; end of ask highs [
  ;; OK, that completes the initial processing of the larger residences.

  ;; Now we repeat the same process for the smaller residences, the lows.
  ask lows [
    if not has-solar?
    [ let ne 0
      if count turtles in-radius neighborhood-size with [has-solar? = true] > 0
      [set ne neighborhood-effect
        ]
      if random-float 1 <
      (simple-mirrored-logistic(the-score(solar-PV-cost)(current-price)(ne))(k) * L-scale)
      [set getting-solar? true
       set new-low-installations (new-low-installations + 1)
       set solar-size get-solar-size(Prob_big_solar_given_low)
       ]
    ]
  ]

  ;; Finally, we process all of the turtles, highs or lows, who
  ;; have adopted solar PV this period (if any).
  ask turtles with [getting-solar? = true] [
    set new-installations (new-installations + 1)
    set has-solar? true
    set shape "sun"
    set size 1.1
    set getting-solar? false]
  ;; Last of all, advance the tick counter, so we'll start a new period.
  tick
end 

to-report get-solar-size [the-prob]
  let sol-sz 0
  ifelse random-float 1 <= the-prob
    [set sol-sz 4]
    [set sol-sz 2]
  report sol-sz
end 


;;;;;;;; Below, from sok's Reporter Library NetLogo model.  ;;;;;;;;;;;;;;

to plotvectors [x y]
;  Assumes a plot has been selected and
;  made the current plot and been cleared.
  let dalength length x
  let dacount 1
  while [dacount < dalength]
  [plotxy item dacount x item dacount y
    set dacount (dacount + 1)]
end 

to-report linspace [dastart dastop  numpoints]
  ;; Modeled after MATLAB's linspace.
  ;; Returns a list numpoints long consisting
  ;; of evenly spaced floating point numbers,
  ;; the first of which is start and the last
  ;; of which is stop.
  ;; Note that this reporter does no error checking.
  ;; However, it works properly with negative numbers
  ;; and going from both high to low and low to high.
  let toreport (list dastart)
  let increment ((dastop - dastart)) / (numpoints - 1)
  repeat numpoints - 1
  [set toreport lput ((last toreport) + increment) toreport]
  report toreport
end 

to-report simple-mirrored-logistic [x the-k]
  ;; Given the inputs, returns a probability value.
  ;; Fixing base and temperature, varying score yields
  ;; an "s"-shaped (sigmoid) curve, increasing in score.
  ;; See logistic curve.
  ;; See SOK's book Agents, Games, and Evolution, appendix B.4
  ;; for explanation. See also:
  ;; http://mathworld.wolfram.com/LogisticEquation.html
  ;; Most directly, the logistic function:
  ;; http://en.wikipedia.org/wiki/Logistic_function
  ;; f(x) = 1 / (1 + e^(-k*x))
  ;; where L is a proportionality constant. k is a constant
  ;; and x0 is a constant at which f(x) = 0.5 * L.
  report 1 - (1 / (1 + e ^ ( -1 * the-k * x)))
  ;; Notice we have 1 minus the normal function's value, because
  ;; as the cost of solar decreases, the probability of installation
  ;; increases.
end 

to-report the-score [the-solarPVcost the-utilityPrice the-neighborhood-effect]
  report the-solarPVcost - the-utilityPrice - the-neighborhood-effect
end 

to display-logistic
;;  The general form of the logistic is
;;  y = f(x) = L / (1 + e^(-k*x))
;;  where L is a scaling constant, which we set to 1 so we get a probability,
;;  and k is a free parameter that affects the slope of the curve.
;;  Notice that at x = 0, f(x) = 0.5 (assuming as we shall that L = 1).
;;  And we want g(x),
;;  g(x) = 1 - f(x).
;;  We need to introduce more parameters here, as follows:
;;  x = cs - pu - ne
;;  With the following interpretations:
;;  cs = cost of solar PV power in cents per kWH
;;  pu = price of utility power in cents per kWH
;;  Finally, ne is the neighborhood effect (a positive number),
;;  which serves to reduce the value of x, and hence increase the probability
;;  of adoption (as it increases).

  ;; So now we initialize the variables.
  ;; current-price  taken from the Interface slider corresponds to pu, price from the utility
  ;; neighborhood-effect corresponds to  ne and is taken from the Interface slider.

  set-current-plot "Probability of Adoption Function"
  clear-plot
  plot-simple-mirrored-logistic(L-scale)
  clear-output
  let solar-costs linspace(solar-low)(solar-high)(51)
  output-print (word "solar cost" "   " "net score (x)" "      " "p(x)")
  output-print (word "--------------------------------------")
  foreach solar-costs [ [?1] ->
    let x the-score(?1)(current-price)(0) ;; neighborhood-effect
  output-print (word precision ?1 2 "\t\t" precision x 2 "\t\t" precision (simple-mirrored-logistic(x)(k) * L-scale) 3) ]
end 

to plot-simple-mirrored-logistic [da-scale]
  let the-solar-costs linspace(solar-low)(solar-high)(51)
  let davalues []
  let a-score 0
  foreach the-solar-costs [ [?1] ->
    set a-score the-score(?1)(current-price)(0) ;; neighborhood-effect
    set davalues lput (simple-mirrored-logistic(a-score)(k) * 10 * da-scale) davalues ]
  plotvectors(the-solar-costs)(davalues)
end 

to scaled-display-logistic
;;  The general form of the logistic is
;;  y = f(x) = L / (1 + e^(-k*x))
;;  where L is a scaling constant, which we set to 1 so we get a probability,
;;  and k is a free parameter that affects the slope of the curve.
;;  Notice that at x = 0, f(x) = 0.5 (assuming as we shall that L = 1).
;;  And we want g(x),
;;  g(x) = 1 - f(x).
;;  We need to introduce more parameters here, as follows:
;;  x = cs - pu  - ne
;;  With the following interpretations:
;;  cs = cost of solar PV power in cents per kWH
;;  pu = price of utility power in cents per kWH
;;  Finally, ne is the neighborhood effect (a positive number),
;;  which serves to reduce the value of x, and hence increase the probability
;;  of adoption (as it increases).

  ;; So now we initialize the variables.
  ;; current-price  taken from the Interface slider corresponds to pu, price from the utility
  ;; neighborhood-effect corresponds to  ne and is taken from the Interface slider.

  ;;plot-mirrored-logistic(-50)(50)(0)(temperature)(k-scale)
  set-current-plot "L-Scaled Probability of Adoption Function"
  clear-plot
  plot-simple-mirrored-logistic(L-scale)
  clear-output
  let solar-costs linspace(solar-low)(solar-high)(51)
  ;print percentages
  output-print (word "solar cost" "   " "net score (x)" "      " "p(x)")
  output-print (word "--------------------------------------")
  foreach solar-costs [ [?1] ->
    let x the-score(?1)(current-price)(0)  ;; neighborhood-effect
  output-print (word precision ?1 2 "\t\t" precision x 2 "\t\t" precision (simple-mirrored-logistic(x)(k) * L-scale) 3) ]
end 

There are 2 versions of this model.

Uploaded by When Description Download
Steven Kimbrough over 4 years ago Converted to work with NetLogo 6 Download this version
Steven Kimbrough over 10 years ago Initial upload Download this version

Attached files

No files

This model does not have any ancestors.

This model does not have any descendants.