Talk:World3 nonrenewable resource sector
From Wikipedia, the free encyclopedia
[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"]