Talk:World3 nonrenewable resource sector

From Wikipedia, the free encyclopedia

WikiProject Systems This article is within the scope of WikiProject Systems, which collaborates on articles about the idea of systems. If you would like to help, you can edit this article or visit the project page, where you can join the project and/or contribute to the discussion.
Start This article has been rated as Start-Class on the assessment scale.
Mid This article is on a subject of mid importance within Systems.
This article has been marked as needing urgent attention.

This article has been rated but has no comments. If appropriate, please review the article and leave comments here to identify the strengths and weaknesses of the article and what work it will need.

[edit] Python program used to simulate the nonrenewable resource sector:

#!/usr/bin/env python

import math
from dynamo import *


#levels
nr = "nr" #Nonrenewable resources
ic = "ic" #Industrial Captial
nrtd = "nrtd" #Nonrenewable resource technology initiated
#nruf2_l1 = "nruf2_l1" #Nonrenewable resource usage rate delay level
#nruf2_l2 = "nruf2_l2" #Nonrenewable resource usage rate delay level
#nruf2_l3 = "nruf2_l3" #Nonrenewable resource usage rate delay level


#rates
nrur = "nrur" #Nonrenewabel resource usage rate
icir = "icir" #Industrial capital investment rate
icdr = "icdr" #Industrial capital depreciation rate
#nruf2_r1 = "nruf2_r1" #Nonrenewable resource usage rate delay rate
#nruf2_r2 = "nruf2_r2" #Nonrenewable resource usage rate delay rate
#nruf2_r3 = "nruf2_r3" #Nonrenewable resource usage rate delay rate
nrate = "nrate" #Nonrenewable resource technology improvement rate



#axillaries
nruf = "nruf" #Nonrenewable resource usage factor
pcrum = "pcrum" #Per capita resource use multiplier
nrfr = "nrfr" #Nonrenewable resource fraction remaining
fcaor ="fcaor" #Fraction of capital allocated to obtaining resources
fcaor1 = "fcaor1" #Normal fcaor
fcaor2 = "fcaor2" #Alternative fcaor
pop = "pop" #Population
pop1 = "pop1" #Exponentially growing pop
io = "io" #Industrial output
iopc = "iopc" #Industrial output percapita
nruf2 = "nruf2" #Nonrenewable resource usage factor after recycle year
nrcm = "nrcm" #Resource technological change multiplier
icor = "icor" #Industrial capital output ratio


#constants
nri = 1e12 #Nonrenewable resources initial
nruf1 = 1 #Nonrenewable resource usage factor 1
popi = 1.65e9 #Initial population in 1900
gc = 0.012 #Population growth constant
zpgt = 2500 #Zero population growth time
pop2 = popi*math.exp(gc*(zpgt-1900)) #population at zpgt
ici = 2.1e11 #Industrial capital initial
fioaa = 0.12 #Fraction of industrial output allocated to agriculture
fioas = 0.12 #Fraction of industrial output allocated to services
fioac = 0.43 #Fraction of industrial output allocated to consumption
alic = 14.0 #Average life of industrial capital
pyear = 1995 #Year to switch nruf
tdd=10 #Technological development and implementation delay
dnrur=2e9 #Desired nonrenewable resource usage rate

#parameters
dt = 1.0
initial_time = 1900.0

#initial data
i = {}

#Initial levels
i[nr] = nri
i[ic] = ici
i[nrtd]=1.0
smooth3_init(i,nruf2,i[nrtd])

def calc_auxiliaries_and_rates(n,time):
    #first the auxiliaries
    n[nruf2] = smooth3_cur_value(n,nruf2)
    n[nruf] = clip(n[nruf2],nruf1,time,pyear)
    n[nrfr] = n[nr]/nri
    
    n[fcaor1] = table_lookup(n[nrfr],0.0,1.0,0.1,[1.0, 0.9, 0.7, 0.5, 0.2, 0.1, 0.05, 0.05, 0.05, 0.05, 0.05])
    n[fcaor2] = table_lookup(n[nrfr],0.0,1.0,0.1,[1.0, 0.9, 0.7, 0.5, 0.2, 0.1, 0.05, 0.05, 0.05, 0.05, 0.05])
    n[fcaor] = clip(n[fcaor2],n[fcaor1],time,pyear)

    n[pop1] = popi*math.exp(gc*(time-1900.0))
    n[pop] = clip(pop2,n[pop1],time,zpgt)

    n[icor] = table_lookup(n[nrtd],0.0,1.0,0.2,[6.0,3.3,3.1,3.06,3.02,3.0])
    n[io] = n[ic]*(1.0 - n[fcaor])/n[icor]
    n[iopc] = n[io]/n[pop]
    
    n[pcrum] = table_lookup(n[iopc],0.0,1600.0,200.0,[0.0, 0.85, 2.6, 4.4, 5.4, 6.2, 6.8, 7.0, 7.0])


    #then the rates
    n[nrur] = n[pop]*n[pcrum]*n[nruf]
    n[icir] = n[io]*(1.0-fioaa-fioas-fioac)
    n[icdr] = n[ic]/alic
    n[nrcm] = table_lookup(1.0-n[nrur]/dnrur,-1.0,0.0,1.0,[-0.05,0.0])
    n[nrate] = clip(n[nrtd]*n[nrcm],0.0,time,pyear)

    smooth3_next_rates(n, nruf2, n[nrtd], tdd)    

    
calc_auxiliaries_and_rates(i,initial_time)

def get_next_time_step(j,time):
    n = {}
    #nextize levels
    n[nr] = j[nr]+dt*(-j[nrur])
    n[ic] = j[ic]+dt*(j[icir]-j[icdr])
    n[nrtd] = j[nrtd]+dt*(j[nrate])

    smooth3_next_levels(n,j,nruf2,dt)    

    calc_auxiliaries_and_rates(n,time)
    return n

run_times(initial_time,dt,200,i,get_next_time_step)

Dynamo include:

import math

def print_sorted_keys(dict,width):
    keys = dict.keys()
    keys.sort()
    f = "%"+str(width)+"s"
    for key in keys[:-1]:
        print (f+",") % key,
    print f % keys[-1]

def print_sorted_values(dict,width):
    keys = dict.keys()
    keys.sort()
    f = "%"+str(width)+"s"
    for key in keys[:-1]:
        print (f+",") % dict[key],
    print f % dict[keys[-1]]

def run_times(initial_time,dt,times,initial,get_next_time_step):
    prev = initial

    width = 20
    f = "%"+str(width)+"s,"
    print f % "time",
    print_sorted_keys(initial,width)
    print f % initial_time,
    print_sorted_values(initial,width)
    
    for i in range(1,times+1):
        time = i*dt + initial_time
        next = get_next_time_step(prev,time)
        print f % time,
        print_sorted_values(next,width)

        prev = next
    print f % "time",
    print_sorted_keys(initial,width)


def step(value,time,currentTime):
    if currentTime >= time:
        return value
    else:
        return 0.0

def clip(after_cutoff,before,value,cutoff_value):
    if value < cutoff_value:
        return before
    else:
        return after_cutoff

def table_lookup(value,low,high,increment,list):
    if value <= low:
        return list[0]
    elif high <= value:
        return list[-1]
    else:
        trans = (value - low)/increment
        low_index = int(math.floor(trans))
        delta = trans - low_index
        return list[low_index]*(1.0-delta)+list[low_index+1]*delta
        
def smooth3_init(init_dictionary,name,value):
    init_dictionary[name+"_l1"] = value
    init_dictionary[name+"_l2"] = value
    init_dictionary[name+"_l3"] = value

def smooth3_next_levels(cur_dict, prev_dict, name, dt):
    cur_dict[name+"_l1"] = prev_dict[name+"_l1"]+dt*prev_dict[name+"_r1"]
    cur_dict[name+"_l2"] = prev_dict[name+"_l2"]+dt*prev_dict[name+"_r2"]
    cur_dict[name+"_l3"] = prev_dict[name+"_l3"]+dt*prev_dict[name+"_r3"]

def smooth3_next_rates(cur_dict, name, value, delay):
    cur_dict[name+"_r1"] = (value - cur_dict[name+"_l1"])/(delay/3.0)
    cur_dict[name+"_r2"] = (cur_dict[name+"_l1"] - cur_dict[name+"_l2"])/(delay/3.0)
    cur_dict[name+"_r3"] = (cur_dict[name+"_l2"] - cur_dict[name+"_l3"])/(delay/3.0)

def smooth3_cur_value(cur_dict, name):
    return cur_dict[name+"_l3"]