Infective Community Network

Infective Community Network preview image

1 collaborator

Tags

disease 

Tagged by Christopher Chiswell over 11 years ago

infection 

Tagged by Christopher Chiswell over 11 years ago

links 

Tagged by Christopher Chiswell over 11 years ago

networks 

Tagged by Christopher Chiswell over 11 years ago

vaccination 

Tagged by Christopher Chiswell over 11 years ago

Visible to everyone | Changeable by the author
Model was written in NetLogo 5.0.1 • Viewed 1022 times • Downloaded 80 times • Run 0 times
Download the 'Infective Community Network' modelDownload this modelEmbed this model

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


Comments and Questions

Please start the discussion about this model! (You'll first need to log in.)

Click to Run Model

;; GLOBAL BREEDS
breed [house_centres house_centre]                         ;; Breed for households
breed [people person]                                      ;; Breed for the people in the simulation
breed [school_centres school_centre]                       ;; Breed for the schools in the simulation

;; LINK BREEDS
directed-link-breed [familylinks familylink]               ;; Links created between family members
directed-link-breed [schoollinks schoollink]               ;; Links created between students and schools
undirected-link-breed [friendlinks friendlink]             ;; Links created between friends
directed-link-breed [infectorlinks infectorlink]

;; GLOBAL VARIABLES
globals[
  world_halfwidth                                          ;; World variable to store world width for calculations
  simulation_state                                         ;; Used to record simulation status on interface tab
  temp_spouse_stop_command                                 ;; World variable used to store a stop variable if required by formulas
  temp_spouse_friends_agentset                             ;; World variable used to transmit agentsets between agents
  percentage_susceptible                                   ;; Global percentage susceptible
  percentage_infected                                      ;; Global percentage infected
  percentage_immune                                        ;; Global percentage immune
  percentage_ever_infected                                 ;; Global percentage ever infected
  temp_infector_who                                        ;; Transitory variable to transmit who of infectors
  temp_school_who
  temp_ptype_sou
  temp_ptype_rec
  size_modifier
       ]

;; PERSON VARIABLES
people-own[
  ptype                                                    ;; What type of person (1 = adult 2 = student)
  friends_wanted                                           ;; How many friends person would like
  spouse                                                   ;; Are there two adults in family
  spouse_friends_done                                      ;; Stores if friends already transferred                   
  household_who                                            ;; ID of household that made them
  exclude_friend_set                                       ;; Carrier variable used to exclude friends in the linking stage
  person_infective_status                                  ;; 1 = Susceptible 2 = About to be infected 3 = Infected 4 = Recovered 5 = Immune     
  quarantined                                              ;; 0 = none 1 = off school
  infective_recovery_time                                  ;; Days remaining infective
  ever_infected                                            ;; Whether person ever infected
  infected_by_who                                          ;; If infected, records the who of the infector
  infected_by_school                                       ;; Records the who of the school if infected via this route
  people_infected                                          ;; Number of people infected
  ]

;; SCHOOL VARIABLES
school_centres-own[
  school_percentage_infected                               ;; Not in use
  school_infective_risk                                    ;; Not in use
]

;; HOUSEHOLD VARIABLES
house_centres-own[
  family_percentage_infected                               ;; Not in use
  family_infective_risk]                                   ;; Not in use

;; LINK VARIABLES
familylinks-own [
  link_type]
schoollinks-own [
  link_type]
friendlinks-own [
  link_type]
infectorlinks-own [
  age
  initialcolor]

to reset-world
clear-all-plots
ask people [set ever_infected 0 
            set person_infective_status 1 
            set quarantined 0 
            set infected_by_who 0 
            set infective_recovery_time 0 
            set size 0.5 * size_modifier]
ask infectorlinks [die]
ask people with [ptype = 1] [set color magenta]
ask people with [ptype = 2] [set color violet]
ask school_centres [set size 3 * size_modifier set color blue]
vaccinate-people
infect-initial
end 

;; ========================================================================
;; SETUP PROCEDURE
;; Sets up world, households, schools, friends, vaccinations and infections 
;; ========================================================================

to setup
  clear-all
  reset-ticks
        set simulation_state "SETTING UP"
  set world_halfwidth world_width / 2
  let temp_patch_size (500 / world_width)
  resize-world (- world_halfwidth) world_halfwidth (- world_halfwidth) world_halfwidth
  set-patch-size temp_patch_size
  
  set size_modifier 2   
        set simulation_state "CREATING HOUSEHOLDS"
  make-households
  set simulation_state "CREATING SCHOOLS" make-schools
        set simulation_state "CREATING ADULT FRIENDS" make-friends
        set simulation_state "VACCINATING PEOPLE" vaccinate-people
        set simulation_state "INFECTING PEOPLE" infect-initial
  hide-links
  generate-values
        set simulation_state "READY TO GO"
end 

;; VACCINATE PROCEDURE

to vaccinate-people
ask people with [person_infective_status = 1]                                                   ;; ASK PEOPLE WHO ARE SUSCEPTIBLE
   [IF random-float 100 < vaccinated_percentage                                                 ;; DECIDE IF TO BE VACCINATED
       [set person_infective_status 5 set color 61]]                                            ;; SET THEIR STATUS AND CHANGE COLOUR
end 

;; INITIAL INFECTION PROCEDURE

to infect-initial
IFELSE count people with [person_infective_status = 1] < initial_infections                     ;; IF THE NUMBER OF SUSCEPTIBLES IS < REQUIRED INFECTIONS
   [ask people with [person_infective_status = 1]                                               ;; MAKE ALL SUSCEPTIBLES INFECTED
       [become-activeinfected]]
   [ask n-of initial_infections people with [person_infective_status = 1]                       ;; IF NOT, MAKE CORRECT NUMBER OF THEM INFECTED
       [become-activeinfected]]
end 

;; MAKE HOUSEHOLDS PROCEDURE

to make-households
create-house_centres Households                                               ;; Create a number of house_centres equivalent to the slider
[set xcor random-float (world_width - 2) - (world_halfwidth - 1)              ;; Distribute house centres through the world
 set ycor random-float (world_width - 2) - (world_halfwidth - 1)              ;; As above but for y axis
 set shape "house" set color blue set size 0.5 * size_modifier]                ;; Set some display attributes

ask house_centres [let temp_numadults_tomake one-of [1 2 2]                   ;; Ask each of these houses to set number of adults 1 or 2
                   let temp_household_who who                                 ;; Create a temp variable of the creating household number
                   hatch-people temp_numadults_tomake                         ;; Ask house centres to make adults
                        [set shape "circle"                                   ;; Set a shape
                         create-familylink-from myself [set link_type 1]      ;; Link the created people to the household creator
                         set xcor xcor + 1                                    ;; Bump them away from creator                                   
                         set color magenta                                    ;; Set a colour
                         set ptype 1                                          ;; Set a type
                         set size 0.5 * size_modifier                         ;; Change size if necessary
                         set household_who temp_household_who                 ;; Store the household creator as a variable in each adult
                         IFELSE temp_numadults_tomake > 1 [set spouse 1]      ;; Mark if spouse exists
                                                          [set spouse 0]      ;; ...or doesn't
                         set friends_wanted 10 + random 11                    ;; Decide how many friends each adults wants (10-20)
                         set quarantined 0                                    ;; Set quarantine state to 0
                         set person_infective_status 1                        ;; Set their state to susceptible
                        ] 
                   ]
ask house_centres with [count out-link-neighbors > 0]                         ;; Ask house centres with adults to make children
                    [let temp_household_who who                               ;; Create a temp variable of the creating household number
                     hatch-people random 3.1
                       [set shape "circle" 
                        create-familylink-from myself [set link_type 2]
                        set ycor ycor - 1
                        set color violet
                        set ptype 2
                        set size 0.5 * size_modifier
                        set household_who temp_household_who
                        set quarantined 0
                        set person_infective_status 1
                        ]
                   ]
ask house_centres [IF count out-link-neighbors = 0 [die]]                     ;; Ask any house centres with no adults/children to die
ask house_centres [                                                           ;; Ask each household to arrange themselves in a circle
  let temp_xcor xcor                                                          ;; Create a temp variable with house_centre x co-ordinate
  let temp_ycor ycor                                                          ;; Create a temp variable with house_centre x co-ordinate
  if count out-link-neighbors = 0 [stop]                                      ;; Stop if no neighbours
  layout-circle out-link-neighbors 0.5 * size_modifier                        ;; Ask my linked neighbours to layout in a circle radius 1 (around centre of map)
  ask out-link-neighbors [set xcor xcor + temp_xcor                           ;; Move this circle to centre on location of household
    set ycor ycor + temp_ycor]
  ] 
end 

;; MAKE SCHOOLS PROCEDURE

to make-schools                                                               
  create-school_centres Schools                                               ;; Make some schools
  [set xcor random-float (world_width - 2) - (world_halfwidth - 1)            ;; Scatter schools around map
    set ycor random-float (world_width - 2) - (world_halfwidth - 1)
    set shape "square"                                                        ;; Setup display variables
    set color blue
    set size 3 * size_modifier]
  
  ask people with [ptype = 2]                                                                  ;; Allocate pupils to schools by asking each pupil
  [IFELSE random 3.1 < 3                                                                       ;; 3 times out of 4...
    [create-schoollink-from min-one-of school_centres [distance myself] [set link_type 3]]     ;; ... to link to nearest school
    [create-schoollink-from one-of school_centres [set link_type 3]]                           ;; ... else link to a random school (inc. nearest)
] 
end 

;; MAKE CONTACTS PROCEDURE

to make-friends
 ask people with [ptype = 1]      ;; Ask all adults
 [acquire_adult_spouse_friends    ;; Acquire some of their spouses friends
  make_adult_radius_friends       ;; Then make nearby friends
  make_adult_remaining_friends]   ;; Then make remaining friends
end 

to acquire_adult_spouse_friends                                                            ;; run by a 'person' agent, not the observer
     IF spouse = 0 [stop]                                                                      ;; Stop if no spouse
     let temp_my_householdwho household_who                                                    ;; Put my household number in a temporary variable
     ask other people with [ptype = 1 AND household_who = temp_my_householdwho]                ;; Ask my spouse (the one with my household number) to run the following;
   
        [IF count my-friendlinks = 0 [stop]                                                                          ;; Stop if spouse doesn't have friends
         IF spouse_friends_done = 1 [set temp_spouse_stop_command 1 stop]                                            ;; Don't run if friends already transferred other way
            set temp_spouse_friends_agentset n-of (round (0.75 * count friendlink-neighbors)) friendlink-neighbors]  ;; Create a temporary agentset of 75% of my spouses friends  (note this is not my-links command)
         IF temp_spouse_stop_command = 1 [set temp_spouse_stop_command 0                                             ;; Once stop command has triggered, reset this back to 0 then...
                                        stop]                                                                        ;; ...stop as my spouse reported they've already taken my links  
         IF temp_spouse_friends_agentset = 0 [stop]                                                                  ;; If that agentset is empty, stop
     
        let temp_spouse_friends_count count temp_spouse_friends_agentset                                              ;; Create a temporary variable of number of spouse friends
        let temp_friends_count count my-friendlinks                                                                   ;; Count how many friends I already have
        let temp_friends_needed (friends_wanted - temp_friends_count)                                                 ;; Count how many friends I still need
        IF temp_friends_needed < 1 [stop]                                                                             ;; Don't run if no friends needed

        IFELSE temp_spouse_friends_count <= temp_friends_needed                                       
           [create-friendlinks-with temp_spouse_friends_agentset [set link_type 6]]                                   ;; if agentset is smaller than friends needed acquire all of them
           [create-friendlinks-with n-of temp_friends_needed temp_spouse_friends_agentset [set link_type 6]]          ;; if agentset is larger than friends needed acquire the number I need from them
        set spouse_friends_done 1                                                                                       ;; set that I have done my spouse friends transfer to make sure we don't do it back the other way
end 

to make_adult_radius_friends                                                                                       ;; THIS IS A VERY HELPFUL PROCESSING STEP ;;
     let temp_existing_friends_set friendlink-neighbors                                                            ;; Create a temporary set of people already friends with me
     let temp_adults_in_radius people with [ptype = 2] in-radius (world_width * 0.15)                                               ;; Create a temporary set of people within 10 of me
     ask temp_adults_in_radius [set exclude_friend_set 1]                                                          ;; Ask everyone in radius to set their exclusion variable to 1
     ask temp_existing_friends_set [set exclude_friend_set 0]                                                      ;; Ask everyone already my friend to set exclusion variable to 0 
     set temp_adults_in_radius temp_adults_in_radius with [exclude_friend_set = 1]                                 ;; Update the temporary set to be only those not identified as a friend already
     
     let temp_friends_count count my-friendlinks                                                                   ;; Set a temp variable as number of existing adult friends
     let temp_friends_needed (friends_wanted - temp_friends_count)                                                 ;; Check how many friends still needed
     let temp_radius_adults count temp_adults_in_radius                                                            ;; Check how many adults are in radius
     IFELSE temp_radius_adults <= temp_friends_needed                                                              ;; If number of friends in radius is less that friends needed
       [create-friendlinks-with n-of temp_radius_adults temp_adults_in_radius [set link_type 4]]                   ;; ...make friends with all of these people
       [create-friendlinks-with n-of temp_friends_needed temp_adults_in_radius [set link_type 4]]                  ;; ...else make friends with number of friends needed from these people   
     ask temp_existing_friends_set [set exclude_friend_set 0]                                                      ;; Reset the temporary group variable
end    

to make_adult_remaining_friends                                                                                    ;; REPEAT FOR ALL ;;
     let temp_existing_friends_set friendlink-neighbors                                                            ;; Create a temporary set of people already friends with me
     let temp_adults_in_radius people with [ptype = 2]                                                             ;; Create a temporary set of adults
     ask temp_adults_in_radius [set exclude_friend_set 1]                                                          ;; Ask everyone to set their exclusion variable to 1
     ask temp_existing_friends_set [set exclude_friend_set 0]                                                      ;; Ask everyone already my friend to set exclusion variable to 0 
     set temp_adults_in_radius temp_adults_in_radius with [exclude_friend_set = 1]                                 ;; Update the temporary set to be only those not identified as a friend already
     
     let temp_friends_count count my-friendlinks                                                                   ;; Set a temp variable as number of my existing adult friends
     let temp_friends_needed (friends_wanted - temp_friends_count)                                                 ;; Check how many friends still needed
     let temp_radius_adults count temp_adults_in_radius                                                            ;; Check how many adults are in radius
     IFELSE temp_radius_adults <= temp_friends_needed                                                              ;; If number of friends in radius is less that friends needed
       [create-friendlinks-with n-of temp_radius_adults temp_adults_in_radius [set link_type 5]]                   ;; ...make friends with all of these people
       [create-friendlinks-with n-of temp_friends_needed temp_adults_in_radius [set link_type 5]]                  ;; ...else make friends with number of friends needed from these people   
     ask temp_existing_friends_set [set exclude_friend_set 0]                                                      ;; Reset the temporary group variable
end 

to hide-links
ask links [hide-link]
end 

;; ===================
;; ===================
;; MAIN GO PROCEDURE
;; ===================
;; ===================

to go
  set simulation_state "ACTIVE"
  tick
  IF Decay_Infectivity_Paths = TRUE [ask infectorlinks 
                                        [IFELSE age <= 0 
                                            [hide-link] 
                                            [set color (color - decay_turns + age) set age age - 1]]]
     quarantine-children  ;; ASSESS IF ANY CHILDREN QUARANTINED
     infect-schools       ;; RUN SCHOOL INFECTION ASSESSMENTS
     infect-households    ;; RUN FAMILY INFECTION ASSESSMENTS
     infect-friends       ;; RUN FRIEND INFECTION ASSESSMENTS
     activate-infection 
     recover-infection
     generate-values
           if count people with [person_infective_status = 3 OR person_infective_status = 2] = 0           ;; RUN IF NO INFECTIONS STARTED
                                   [IFELSE count people with [ever_infected = 1] <= (initial_infections) 
                                       [infect-initial go]  
                                       [set simulation_state "COMPLETED" stop]] 
     IF simulation_state = "COMPLETED" [stop]
end 

to quarantine-children
ASK people with [ptype = 2 AND person_infective_status = 3 and quarantined = 0]
   [IF random-float 1 < 0.3 [set quarantined 1]]
end 

to infect-schools                                                                     ;; TO INFECT SCHOOLS
  ask people with [ptype = 2 AND person_infective_status = 3 AND quarantined = 0]     ;; ASK EACH CHILD IN TURN WHO IS INFECTIVE AND IN SCHOOL
     [set temp_infector_who who                                                       ;; TO SET THE TEMP WHO VARIABLE AS THEIR OWN...
      ask in-schoollink-neighbors [                                                    ;; ...AND ASK THEIR CONNECTED SCHOOL...
       set temp_school_who who
       ask out-schoollink-neighbors with [person_infective_status = 1]               ;; ...TO ASK SUSCEPTIBLES THEY ARE CONNECTED TO...
         [IF random-float 1 < school_transmission_prob                                ;; ...TO MAKE AN ASSESSMENT OF WHETHER TO BECOME INFECTED
           [set person_infective_status 2 set infected_by_who temp_infector_who
            set infected_by_school temp_school_who]      ;; ...AND IF SO, TO SET THEMSELEVES AS SO, AND TO RECORD WHO INFECTED THEM
          ]
        ]]
set temp_school_who 0  
end 

to infect-households
  ask people with [person_infective_status = 3]                                       ;; ASK INFECTIVE PEOPLE...
      [set temp_infector_who who                                                      ;; TO SET THE TEMP WHO VARIABLE AS THEIR OWN...
        ask in-familylink-neighbors                                                   ;; ...AND ASK THEIR HOUSEHOLD...
        [ask out-familylink-neighbors with [person_infective_status = 1]              ;; ...TO ASK ALL FAMILY MEMBERS WHO ARE SUSCEPTIBLE...
          [IF random-float 1 < family_transmission_prob                               ;; ...TO EVALUATE WHETHER TO BECOME INFECTED...
            [set person_infective_status 2 set infected_by_who temp_infector_who]     ;; ...AND IF SO, TO SET THEMSELVES AS SO, AND TO RECORD WHO INFECTED THEM
          ]]]
end 

to infect-friends
ask people with [person_infective_status = 3]                                         ;; ASK INFECTIVE PEOPLE...
      [ set temp_infector_who who                                                     ;; ...TO SET THE TEMP WHO VARIABLE AS THEIR OWN...
         ask friendlink-neighbors with [person_infective_status = 1]                  ;; ...AND TO ASK EACH OF THEIR SUSCEPTIBLE FRIENDS...
             [IF random-float 1 < friend_transmission_prob                            ;; ...TO EVALUATE WHETHER TO BECOME INFECTED...
               [set person_infective_status 2 set infected_by_who temp_infector_who]  ;; ...AND IF SO, TO SET THEMSELVES AS SO, AND TO RECORD WHO INFECTED THEM
           ]] 
end 

;; ACTIVATE INFECTED INDIVIDUALS - ONLY WANT INFECTIONS TO DEVELOP AT THE END OF EACH TURN

to activate-infection
ASK people with [person_infective_status = 2]                                         ;; ASK THOSE MARKED TO BE INFECTED TO BECOME INFECTIOUS
   [become-activeinfected]
end 

to become-activeinfected                                                          ;; SUB FUNCTION RUN BY TURTLES
      set infective_recovery_time random 5 + 4                                        ;; SET HOW LONG RECOVERY WILL TAKE
      set person_infective_status 3                                                   ;; SET STATUS TO INFECTIOUS
      set size 1 * size_modifier                                                      ;; SET SIZE
      set color red                                                                   ;; SET COLOUR
      set ever_infected 1                                                             ;; RECORD AS A CASE
      IF infected_by_who <= 0 [stop]                                                  ;; IF AN INITIAL INFECTION, STOP HERE...
      IFELSE infected_by_school > 0 
         [create-infectorlink-from school_centre infected_by_school [set color red set thickness 0.02 set age decay_turns - 1 set initialcolor red]
          let temp_myschool infected_by_school
          ask school_centre temp_myschool [set size 5 set color red]
          ask person infected_by_who [create-infectorlink-to school_centre temp_myschool [set color red set thickness 0.02 set age decay_turns - 1 set initialcolor red]]]
         
         [create-infectorlink-from person infected_by_who [ ask end1 [set temp_ptype_sou ptype]  ;; ELSE CREATE A LINK BASED ON START AND END POINT TURTLES
                                                        ask end2 [set temp_ptype_rec ptype]
                                                        IF temp_ptype_sou = 2 AND temp_ptype_rec = 2 [set color yellow set thickness 0.02 set age decay_turns - 1 set initialcolor yellow]
                                                        IF temp_ptype_sou = 2 AND temp_ptype_rec = 1 [set color cyan set thickness 0.02 set age decay_turns - 1 set initialcolor cyan]
                                                        IF temp_ptype_sou = 1 AND temp_ptype_rec = 1 [set color orange set thickness 0.02 set age decay_turns - 1 set initialcolor orange]
                                                        IF temp_ptype_sou = 1 AND temp_ptype_rec = 2 [set color green set thickness 0.02 set age decay_turns - 1 set initialcolor green]]]
end 

to recover-infection
ASK people with [person_infective_status = 3]                                         ;; ASK ALL THOSE INFECTED
   [set infective_recovery_time infective_recovery_time - 1]                          ;; TO REDUCE THEIR RECOVERY TIME BY 1
ASK people with [person_infective_status = 3 AND infective_recovery_time <= 0]        ;; AND IF THEIR RECOVERY TIME IS 0 OR BELOW
   [set person_infective_status 4 set color yellow set size 0.75 * size_modifier]      ;; TO CHANGE STATUS TO RECOVERED
end 

;; VALUES FOR PLOTS AND OUTPUTS ;;

to generate-values 
  set percentage_susceptible 100 * count people with [person_infective_status = 1] / count people
  set percentage_infected 100 * count people with [person_infective_status = 3] / count people
  set percentage_immune 100 * count people with [person_infective_status > 3] / count people
  set percentage_ever_infected 100 * count people with [ever_infected = 1] / count people
  ask people with [person_infective_status > 2][set people_infected count my-out-infectorlinks]
end 











;; OLD CODE - KEPT FOR INTEREST

;; to infect-schools
;; ask school_centres
;;     [let temp_infected_children count out-schoollink-neighbors with [(quarantined = 0 AND person_infective_status = 3)]     ;; Temp variable of number of children not quarantined and infected
;;       let temp_attending_children count out-schoollink-neighbors with [quarantined = 0]                                     ;; Temp variable of number of children not quarantined
;;       IF temp_attending_children = 0 [stop]                                                                                 ;; If no children attending, stop
;;       IF temp_infected_children = 0 [stop]                                                                                  ;; If no children infected, stop
;;       set school_percentage_infected temp_infected_children / temp_attending_children                                       ;; Set school_percentage_infected as percentage
;;       set school_infective_risk 0.05                                                                                        ;; set school infective risk at 0.05
;;       IF school_percentage_infected < 0.10 [set school_infective_risk 0.02]                                                 ;; Lower it to 0.02 if less than 10% infected
;;       IF school_percentage_infected < 0.02 [set school_infective_risk 0.01]                                                 ;; Lower it to 0.01 if less than 2% infected
;;       let temp_school_infective_risk school_infective_risk                                                                  ;; Set temporary variable of the schools infective risk
;;       ask out-schoollink-neighbors with [(quarantined = 0 AND person_infective_status = 1)]
;;       [IF random-float 1 < temp_school_infective_risk [SET person_infective_status 2]]                                      ;; Ask each of the schools susceptible pupils to evaluate risk
;;       ]
;; end
;; to infect-households
;; ask house_centres
;;      [let temp_infected_members count out-familylink-neighbors with [person_infective_status = 3]                           ;; Create temp variable of family members infected
;;        let temp_active_members count out-familylink-neighbors                                                               ;; Create temp_variable of all family members
;;        IF temp_active_members = 0 [stop]                                                                                    ;; Stop if no family members (only use if add conditions to above)
;;        IF temp_infected_members = 0 [stop]                                                                                  ;; Stop if no family members infected
;;       set family_percentage_infected temp_infected_members / temp_active_members                                           ;; Percent family infected
;;        set family_infective_risk 0.05                                                                                       
;;        IF family_percentage_infected < 0.10 [set family_infective_risk 0.02]
;;        IF family_percentage_infected < 0.02 [set family_infective_risk 0.01]
;;        let temp_family_infective_risk family_infective_risk
;;        ask out-familylink-neighbors with [person_infective_status = 1]
;;        [IF random-float 1 < temp_family_infective_risk [SET person_infective_status 2]]
;;      ]
;;end

There is only one version of this model, created over 11 years ago by Christopher Chiswell.

Attached files

File Type Description Last updated
Infective Community Network.png preview Preview for 'Infective Community Network' over 11 years ago, by Christopher Chiswell Download

This model does not have any ancestors.

This model does not have any descendants.