copper.gms : Modeling Investment in the World Copper Industry
This model has been used to analyze investment requirements
in the world copper sector.
Reference:
- Dammert, A, and Palaniappan, S, Modeling Investments in the World Copper Sector. The University of Texas Press, Austin, Texas, 1985.
Large Model of Type: MIP
$Title Modeling Investments in the World Copper Sector (COPPER,SEQ=45)
$Stitle Problems and Notes
$Ontext
This model has been used to analyze investment requirements
in the world copper sector.
Dammert, A, and Palaniappan, S, Modeling Investments in the World
Copper Sector. The University of Texas Press, Austin, Texas, 1985.
Scenario Definitions:
Base Case: With tariffs, minimum wire production level (at installed
capacity) for year 2000
Expt. 1 : No tariffs
Expt. 2 : Reduce operating cost of medium level ore processing in
Chile, Peru, and USSR by 25%
Expt. 3 : No minimum wire production
Expt. 4 : Increase operating costs in LDCs by 25%
Expt. 5 : Increase investment costs in LDCs by 25%
Expt. 6 : Dynamic version of base case with 5 year periods - 1985,
1990, 1995, 2000.
$Offtext
$Stitle set definitions
Set irun mine smelter and refinery locations /
peru , chile , zambia , zaire , mex+cam , s-africa , philipines , papua-ng
western-us , eastern-us, canada , ee+ussr , australia , w-europe , japan+kor /
i(irun) mine smelter and refinery location /
peru , chile , zambia , zaire , mex+cam , s-africa , philipines , papua-ng
western-us , eastern-us, canada , ee+ussr , australia , w-europe , japan+kor /
jrun wire tube and sheet plant and market locations /
usa , mex+cam , es-america , ws-america , w-europe , ee+ussr
c-africa , s-africa , o-asia , japan+kor , china , australia , canada /
j(jrun) wire tube and sheet plant and market locations /
usa , mex+cam , es-america , ws-america , w-europe , ee+ussr
c-africa , s-africa , o-asia , japan+kor , china , australia , canada /
c commodities /
ore
scrap-s scrap copper for smelting
blister
scrap-r scrap copper for refining
refined-cu refined copper
scrap-sps scrap copper for sheets plates and strip fabrication
sheets+p+s sheets plates and strip
wire
scrap-t scrap copper for tubes and rods fabrication
tubes+rods tubes and rods /
cm(c) commodities in mining and processing / ore, scrap-s, blister, scrap-r, refined-cu /
cs(c) commodities at wire tube & sheet plants / refined-cu, wire, scrap-t, tubes+rods, scrap-sps, sheets+p+s /
cf(c) final products / refined-cu, wire, tubes+rods, sheets+p+s /
cfr(c) final products from processing / refined-cu /
cfs(c) final products from semi-manufacture / wire, tubes+rods, sheets+p+s /
cim(c) final products at mines and smelters / ore, blister /
cil(c) scrap types / scrap-s, scrap-r, scrap-t, scrap-sps /
p processes /
high-grade high grade ore mining by open pit and concentrator
med-grade medium grade ore mining by open pit and concentrator
smelting-o smelting using primary copper ore
smelting-s smelting using scrap copper
refining-b refining using blister
refining-s refining using scrap copper
wire-ref-c wire fabrication from refined copper
tube-ref-c tube and rod fabrication from refined copper
tube-scrap tube and rod fabrication from scrap copper
s-ref-c sheet plate and strip fabrication from refined copper
s-scrap sheet plate and strip fabrication from scrap copper /
pm(p) process at mines smelters and refineries / high-grade, med-grade , smelting-o
smelting-s, refining-b , refining-s /
pmh(p) high grade ore mining processes / high-grade , med-grade /
pmm(p) mining processes / high-grade, med-grade /
ps(p) smelting processes / smelting-o , smelting-s /
pr(p) refining processes / refining-b , refining-s /
psm(p) semi-manufacturing process
pw(p) wire plant processes / wire-ref-c /
ptr(p) tube and rod plant processes / tube-ref-c, tube-scrap /
psh(p) sheet plant processes / s-ref-c, s-scrap /
m productive units /
open-pit open pit mines and concentrators
smelter
refinery
wire wire fabrication plant
tubes+rods tube and rod fabrication plant
sheets+p+s sheet plate and strip fabrication plant /
mm(m) productive units at mining and processing plants / open-pit, smelter, refinery/
ms(m) productive units at semi-manufacture plants
tg time periods / 1980*2000 /
t(tg) solution time period / 2000 /
tbase(tg) / 1980 /
Alias (tg,tgp),(i,ip),(j,jp),(t,tp),(irun,irunp),(jrun,jrunp);
psm(p) = not pm(p); ms(m) = not mm(m);
Display psm,pm;
$Eject
* transform the set of year labels to numerical values and compute length of time periods used in model:
Parameters ybase(tg) distance of year from base year
period(tg) interval length (used in objective function)
rph(tg) length of periods for reserves;
ybase(tg) = ord(tg) - smin(tgp$tbase(tgp), ord(tgp));
period(t) = ybase(t) - ybase(t-1);
rph(t) = period(t);
Display ybase,period,rph;
* for the static model we don't need to have the period length information. therefore reset period to 1.
period(t) = 1;
Scalar lbperton conversion from lbs to tons / 2240 /;
$Stitle demand data
Set cgr consumption growth rate intervals / g1, g2 /
tg1(tg) interval 1 definition / 1980*1985 /
tg2(tg) interval 2 definition / 1986*2000 /
mgr(cgr,tg) map of interval to years / g1.(1980*1985) , g2.(1986*2000) /
Parameter demand(jrun,cf,tg) demand for refined copper and semi-manufactures (1000 tons)
Table dem1980(jrun,*) consumption in 1980 and growth rates (1000 tons & %): table
wire tubes+rods sheets+p+s refined-cu g1 g2
* (1980-85) (1986-2000)
usa 1385 690 555 40 1.3 2.2
mex+cam 80 40 30 4 3.9 4
es-america 195 95 80 16 3.9 4
ws-america 40 20 15 3 3.9 4
w-europe 2075 1160 500 205 1 2.2
ee+ussr 1050 525 420 55 2.9 3
c-africa 15 7 5 1 3.9 4
s-africa 55 30 20 3 3.9 4
o-asia 90 45 35 6 3.9 4
japan+kor 875 440 350 45 3.4 3.7
china 195 100 80 11 3.3 2.4
australia 85 40 35 6 1.3 2.4
canada 125 60 50 5 1.3 2.4
;
demand(jrun,cf,tg1) = dem1980(jrun,cf) * (1 + sum(cgr$mgr(cgr,tg1), dem1980(jrun,cgr))/100)**(ord(tg1) - 1);
demand(jrun,cf,tg2) = demand(jrun,cf,"1985") * (1 + sum(cgr$mgr(cgr,tg2), dem1980(jrun,cgr))/100)**ord(tg2);
Display demand;
$Stitle technology data
Table a(c,p) input-output coefficients
high-grade med-grade smelting-o smelting-s refining-b refining-s
ore 1. 1. -1.03
blister 1. 1. -1.03
refined-cu 1. 1.
scrap-s -1.03
scrap-r -1.03
+ wire-ref-c tube-ref-c tube-scrap s-ref-c s-scrap
refined-cu -1.007 -.718 -.772
scrap-t -.718
scrap-sps -.772
wire 1.
tubes+rods 1. 1.
sheets+p+s 1. 1.
Table b(m,p) capacity utilization matrix
high-grade med-grade smelting-o smelting-s refining-b refining-s
open-pit 1. 1.6
smelter 1. .32
refinery 1. 1.
+ wire-ref-c tube-ref-c tube-scrap s-ref-c s-scrap
wire 1.
tubes+rods 1. 1.
sheets+p+s 1. 1.
*
* in the base case minimum wire production level is set to the installed capacity.
$Stitle scrap data
* 1. scrap cost is added to the "base" process operating cost to give the operating cost of processing scrap
* (see operating cost section). the major component of scrap cost is collection.
*
* 2. scrap quality determines if it will be used in smelting, refining or semi-manufacturing.
*
* 3. 1980 use of scrap in refineries & smelters is known, and is expected to grow at a constant rate.
*
* 4. in the model we can restrict the scrap availability for semi-manufacturing at either the aggregate
* semi-manufacturing level or at the particular process (tube and rods, and sheets) level.
Parameter scrapi(irun,tg,c) scrap availability at refineries and smelters (1000 tons)
scrapj(jrun,tg,*) scrap availability at semi-manufacturers (1000 tons);
Table hds1(irun,*) scrap usage in 1980 at smelters and refineries (1000 tons)
scrap-s scrap-r growth
* (%)
western-us 48 193.6 4
eastern-us 12 246.4 4
w-europe 130 460 1.7
japan+kor 50 141 4
australia 5 28 1.1
canada 40 4
mex+cam 5 4
Table hds2(jrun,*) scrap usage in semi-manufacturing in 1980 (1000 tons)
scrap-t scrap-sps other growth
* (%)
usa 440 340 100 1
w-europe 490 210 220 3.5
japan+kor 230 140 30 2.5
canada 5 4 10 3.5
australia 21 18 4 1.1
;
scrapi(irun,tg,cil) = hds1(irun,cil) * (1 + hds1(irun,"growth")/100)**(ord(tg)-1);
scrapj(jrun,tg,cil) = hds2(jrun,cil) * (1 + hds2(jrun,"growth")/100)**(ord(tg)-1);
scrapj(jrun,tg,"scrap") = sum(cil, scrapj(jrun,tg,cil));
Display scrapi,scrapj;
Set psi(p) refinery and smelter processes using scrap copper input
psj(p) wire tube and sheet processes using scrap copper input
Parameter mapic(irun,c) commodities at mines refineries and smelters
mapip(irun,p) processes at mines refineries and smelters
mapjc(jrun,c) commodities at wire tube and sheet plants
mapjp(jrun,p) processes ar wire tube and sheet plants;
$Eject
* the subset of scrap using processes is identified as only those processes which utilize scrap materials as inputs:
psi(pm) = yes$(sum(cil, a(cil,pm)) lt 0);
psj(psm) = yes$(sum(cil, a(cil,psm)) lt 0);
* first define all commodities to be available at all locations. then, if no scrap is available at a location
* this scrap type is then defined to not exist at the given location. similarly, first all processes are defined
* to exist at all locations; if the scrap commodity is not available at a location and if a process uses this
* scrap commodity as input, then this process is defined to not exist at the location.
mapic(irun,cm) = 1;
mapic(irun,cil)$(hds1(irun,cil) eq 0) = 0;
mapip(irun,pm) = 1;
mapip(irun,psi)$(sum(cil, a(cil,psi)*mapic(irun,cil)) eq 0) = 0;
mapjc(jrun,cs) = 1;
mapjc(jrun,cil)$(hds2(jrun,cil) eq 0) = 0;
mapjp(jrun,psm) = 1;
mapjp(jrun,psj)$(sum(cil, a(cil,psj)*mapjc(jrun,cil)) eq 0) = 0;
Display mapic,mapip,mapjc,mapjp;
$Stitle capacities and reserves
Parameter resc(irun,p) annual extraction limits on medium and high grade ores (thousand tons)
Table reserves(irun,p) ore reserves esitmates for next 20 years (1980-81 - million tons)
high-grade med-grade
peru 1.67 18.8
chile 55.77 17.29
zambia 18.01 1.21
zaire 16.97 1.48
mex+cam 3.61 20.14
s-africa 2.42 .76
papua-ng 9.5
philipines 4.93 3.97
western-us 19.38 25.87
eastern-us 5.35
canada 8.33 9.6
ee+ussr 38 17
australia 6 .8
w-europe 7.87
japan+kor 1.4
;
resc(irun,pmh) = 1000*reserves(irun,pmh)/20;
Display resc;
Table caps(jrun,m) existing capacity in semi-manufacturing in 1980 (1000 tons)
wire tubes+rods sheets+p+s
usa 2100 900 1000
mex+cam 105 40 15
es-america 270 65 30
ws-america 55 15 9
w-europe 1900 1200 900
ee+ussr 1200 600 350
c-africa 15 5 7
s-africa 55 40 25
o-asia 125 30 4
japan+kor 1200 600 410
china 250 85 60
australia 130 70 70
canada 200 50 60
$Eject
Table capm(irun,m) estimates of mine smelter and refinery capacities in 1980 (1000 tons)
open-pit smelter refinery
peru 590 350 230
chile 1330 950 810
zambia 550 601 610
zaire 630 430 140
mex+cam 324 86 100
s-africa 490 280 150
philipines 492
papua-ng 256
western-us 1675 1510 480
eastern-us 576 540 1670
canada 1254 610 610
ee+ussr 1720 1720 1600
australia 260 220 210
w-europe 608 820 1440
japan+kor 112 1180 1220
$Stitle investment data
Set ih(irun) refineries & smelters with high cost / peru , chile , mex+cam , zambia
zaire , s-africa , papua-ng , philipines /
il(irun) refineries & smelters with low cost
jh(jrun) semi-manufacturing locations with high cost / mex+cam , es-america, ws-america
c-africa , s-africa , o-asia , china /
jl(jrun) semi-manufacturing locations with low cost
it copper processing classifiction / iih requiring high cost, iil requiring low cost /
iit(it,irun) map of locations to classification
jt semi-manufacturing classification / industrial, non-ind /
jtj(jt,jrun) map of locations to classification;
il(irun) = not ih(irun);
jl(jrun) = not jh(jrun);
iit("iih",ih) = yes; iit("iil",il) = yes;
jtj("industrial",jl) = yes; jtj("non-ind",jh) = yes;
Display il,jl,iit,jtj;
Scalar rho discount rate / .1 /
life life of units (yrs) / 20 /
Parameter dis discount factor
sigma capital recovery factor
omegam scale cost of mining and processing plants (10e3 us$ per tpy)
omegas scale cost of of semi-manuacturing plants (10e3 us$ per tpy)
num proportional capital cost of mining and processing plants (10e3 us$ per tpy)
nus proportional capital cost of semi-manuf plants (10e3 us$ per tpy)
hbarm economies of scale size for processing plants (1000 tons)
hbars economies of scale size for semi-manuf plants (1000 tons)
hhatm maximum sizes for processing plants (1000 tons)
hhats maximum sizes for semi-manufacturing plants (1000 tons)
ts(t,tp) time summation matrix
sfi(irun) site factor for mining and processing plants
sfj(jrun) site factor for semi-manufacturing plants;
Table invm(irun,*) investment data for mines - 1980(1)
fixed var ec-scale
* (mill us$) (mill us$/1000 ton)(1000 tons)
(peru,chile,mex+cam,s-africa
philipines,papua-ng) 40 5.6 100
(zambia,zaire) 120 5.8 380
(western-us,canada,ee+ussr,australia
eastern-us,w-europe,japan+kor) 40 5.06 75
$Eject
Table invs(jt,m,*) investment costs for semi-manufacturing - 1980
fixed var ec-scale
* (mill us$) (mill us$/1000 tons) (1000 tons)
(industrial).wire 3.38 1.72 20
(non-ind ).wire 3.6 1.84 20
(industrial).tubes+rods 5.64 .94 30
(non-ind ).tubes+rods 6 1 30
(industrial).sheets+p+s 8.64 1.34 30
(non-ind ).sheets+p+s 9.2 1.44 30
Table invrs(it,m,*) investment costs for refinery and smelter - 1980(1)
fixed var ec-scale
* (mill us$) (mill us$/1000 tons) (1000 tons)
iih.smelter 50 2.166 150
iil.smelter 40 1.832 150
iih.refinery 5.02 .718 150
iil.refinery 4.02 .574 150
;
hbarm(irun,m) = sum(it$iit(it,irun), invrs(it,m,"ec-scale"));
hbarm(irun,"open-pit") = invm(irun,"ec-scale");
hbars(jrun,m) = sum(jt$jtj(jt,jrun), invs(jt,m,"ec-scale"));
hhatm(irun,m) = 40*hbarm(irun,m);
hhats(jrun,m) = 40*hbars(jrun,m);
omegam(irun,m)$hbarm(irun,m) = sum(it$iit(it,irun), invrs(it,m,"fixed"))/hbarm(irun,m);
omegam(irun,"open-pit")$hbarm(irun,"open-pit") = invm(irun,"fixed")/hbarm(irun,"open-pit");
omegas(jrun,m)$hbars(jrun,m) = sum(jt$jtj(jt,jrun), invs(jt,m,"fixed"))/hbars(jrun,m);
num(irun,m) = omegam(irun,m) + sum(it$iit(it,irun), invrs(it,m,"var"));
num(irun,"open-pit") = omegam(irun,"open-pit") + invm(irun,"var");
nus(jrun,m) = omegas(jrun,m) + sum(jt$jtj(jt,jrun), invs(jt,m,"var"));
sfi(irun) = 1;
sfj(jrun) = 1;
dis(t) = (1 + rho)**(-ybase(t));
dis(t) = 1;
sigma = rho*(1 + rho)**life / ((1 + rho)**life - 1);
ts(t,tp) = 1$(ord(t) ge ord(tp));
Display hbarm,hbars,omegam,omegas,num,nus,ts,dis,sigma;
$Stitle operating costs
Parameter opm(irun,p) mining and processing costs in 1980(1) (us$ per ton of copper content)
spr scap prices (at copper price of us$2000 a ton) / semi 1800 , smelting-s 1200
refining-s 1700 /
om(irun) mine operating cost in 1980(1) (us$ per ton of copper content) /
(peru,mex+cam,s-africa) 840
chile 1028
zambia 1044
zaire 681
philipines 1054
papua-ng 295
(western-us,eastern-us) 771
(canada,ee+ussr,australia,w-europe,japan+kor) 914 /
os(irun) smelter operating cost in 1980(1) (us$ per ton of copper content) /
(peru,mex+cam,s-africa,philipines,papua-ng,chile,zambia,zaire) 250
(western-us,eastern-us,canada,japan+kor,australia,w-europe,ee+ussr) 300 /
opr(irun) refinery operating cost in 1980(1) (us$ per ton of copper content)/
(peru,mex+cam,s-africa,philipines,papua-ng,chile,zambia,zaire) 150
(western-us,eastern-us,canada,japan+kor,australia,w-europe,ee+ussr) 170 /
opi(irun) operating cost escalator for mining and processing locations
opj(jrun) operating cost escalator for semi-manufacturing locations
Table ops(jrun,p) operating costs for semi-manufacturing in 1980(1) (1000 us$ per ton)
wire-ref-c tube-ref-c s-ref-c
(usa,w-europe,ee+ussr,
japan+kor,australia,canada) 1.87 1.687 2.36
(mex+cam,es-america,
ws-america,c-africa,s-africa) 1.33 1.507 2.09
(china,o-asia) 1.15 1.447 2
;
opm(irun,pmm)$mapip(irun,pmm) = om(irun);
opm(irun,ps)$mapip(irun,ps) = os(irun);
opm(irun,pr)$mapip(irun,pr) = opr(irun);
* the operating cost for locations with scrap process are adjusted as follows:
* the coefficients 1.03, .718, .772 are the scrap input requirements in these processes. this
* is necessary as the scrap collection costs for these processes (parameter spr) are given in
* terms of the price of copper.
opm(irun,pm)$mapip(irun,pm) = opm(irun,pm) + 1.03*spr(pm);
opm(irun,pm)$(not mapip(irun,pm)) = 0;
opm(irun,pm) = sum(m, b(m,pm)*opm(irun,pm));
ops(jrun,"tube-scrap") = ops(jrun,"tube-ref-c") + spr("semi")*.718/1000;
ops(jrun,"s-scrap") = ops(jrun,"s-ref-c") + spr("semi")*.772/1000;
ops(jrun,p) = sum(m, b(m,p)*ops(jrun,p));
opi(irun) = 1;
opj(jrun) = 1;
Display opm,ops;
$Stitle transport
* the following ports were used for computing distances:
* australia : bunbury c-africa,zaire,zambia : banana
* canada,eastern-us,usa : new-york chile,ws-america : valparaiso
* china : shanghai ee+ussr : leningrad
* es-america : rio-de-janerio japan+kor : tokyo
* mex+cam : veracruz o-asia : bombay/calcutta
* papua-ng : port moresby philipines : manila
* peru : callao s-africa : richmund bay
* w-europe : rotterdam western-us : portland
Set n of nodes - all locations; n(irun) = yes; n(jrun) = yes;
Alias(n,np,npp);
Table uc(*,*) transport cost of semi-manufactures and all other types of intermediates
ocean-fix ocean-var rail
* (us$ per ton) (us$ per ton per naut. mi) (us$ per ton per mile)
ore 3 .007 .04
b+r 4 .01 .05
semi 8 .02 .1
* the distance matrix below is a little confusing as it represents distances between all nodes
* (union of irun and jrun).
*
Table distance(*,*) sea distances in nautical miles
australia c-africa canada chile china eastern-us ee+ussr es-america japan+kor mex+cam
c-africa 9477
canada 11409 5325
chile 8358 7795 4634
china 3766 10205 10584 10148
eastern-us 11409 5325 4634 10584
ee+ussr 10361 5897 4711 8692 12068 4711
es-america 10238 4125 4770 3670 11109 4770 6538
japan+kor 4354 10974 9700 9280 1117 9700 12772 11513
mex+cam 10854 6017 2023 4079 9463 2023 6522 4079 9155
o-asia 4156 7103 11398 10275 4648 11398 12063 7848 4538 11927
papua-ng 1754 9184 10388 8400 2166 10388 11600 9945 2600 9100
peru 9597 7096 3368 1306 8872 3368 7430 4976 8934 2813
philipines 2600 9284 11388 9400 1166 11388 10952 10009 1770 10000
s-africa 6971 2506 6801 5694 7908 6801 7482 3267 8478 7346
usa 11409 5325 4634 10584 4711 4770 9700 2023
w-europe 9700 4657 3473 7454 10880 3473 2146 5300 11484 5284
western-us 8742 9615 5887 5764 5440 5887 9949 8353 4323 5332
ws-america 8358 7795 4634 10148 4634 8692 3670 9280 4079
zaire 9477 5325 7795 10205 5325 5897 4125 10974 6017
zambia 9477 5325 7795 10205 5325 5897 4125 10974 6017
$Eject
+ o-asia papua-ng peru philipines s-africa usa w-europe western-us ws-america
papua-ng 5900
peru 11581 9100
philipines 5900 1000 7706
s-africa 4581 6678 7000 6742
usa 11398 10388 3368 11388 6801
w-europe 11066 10400 6192 9714 6244 3473
western-us 7509 6923 4611 6024 10377 5887 8711
ws-america 10275 8710 1306 9400 5694 4634 7454 5764
zaire 7104 9184 7096 9284 2506 5325 4657 9615 7795
zambia 7104 9184 7096 9284 2506 5325 4657 9615 7795
Table drail rail distances (km)
zambia zaire ee+ussr canada
mex+cam 1002 902
s-africa 1125 902
canada 1002 902 1800
western-us 1002 902
eastern-us 1002 902 350
ee+ussr 1002 902
australia 1250 1350 1800
w-europe 1002 902
japan+kor 1250 1350 1800
usa 1002 902 350
es-america 1002 902
ws-america 1002 902
c-africa 1250 1350
o-asia 1250 1350 1800
china 1250 1350 1800
papua-ng 1250 1350
philipines 1250 1350
;
distance(n,np) = max(distance(n,np) , distance(np,n)); drail(n,np) = max(drail(n,np) , drail(np,n));
Display distance,drail;
* the distance matrix above has some errors (inconsistencies in distances) as the distances were computed by
* hand. for example if there are 3 points (a,b,c), it was found that the distance between a and c is much
* greater than by going from a to c through b. there might also be numerous such intermediate points b for
* some (a,c) combination. thus we determine the largest such discrepancy and reduce the direct distance between
* a and c by this value. this method only removes the first level errors. the following computation does this:
distance(n,np) = distance(n,np) - smax(npp, max(0, distance(n,np) - distance(n,npp) - distance(npp,np)) );
Parameter mur(irun,irun,cim) transport cost: raw material & intermediate goods (us$ per ton)
mui(irun,jrun) transport cost: refined copper to semi-manufacture and markets (us$ per ton)
mufs(jrun,jrun) transport cost: final: semi-manufactures from locations to markets (us$ per ton);
mur(irun,irunp,"ore") = uc("ore","ocean-fix")$distance(irun,irunp)
+ uc("ore","ocean-var")*distance(irun,irunp) + uc("ore","rail")*drail(irun,irunp);
mur(irun,irunp,"blister") = uc("b+r","ocean-fix")$distance(irun,irunp)
+ uc("b+r","ocean-var")*distance(irun,irunp) + uc("b+r","rail")*drail(irun,irunp);
mui(irun,jrun) = uc("b+r","ocean-fix")$distance(irun,jrun)
+ uc("b+r","ocean-var")*distance(irun,jrun) + uc("b+r","rail")*drail(irun,jrun);
mufs(jrun,jrunp) = uc("semi","ocean-fix")$distance(jrun,jrunp)
+ uc("semi","ocean-var")*distance(jrun,jrunp) + uc("semi","rail")*drail(jrun,jrunp);
Display mur,mui,mufs;
$Stitle prices and tariffs
Set ntfr(i,j) no tariffs on refined copper between / (peru,chile).ws-america , (zambia,zaire).c-africa
mex+cam.mex+cam , s-africa.s-africa
(western-us,eastern-us).usa, canada.canada
ee+ussr.ee+ussr , australia.australia
w-europe.w-europe , japan+kor.japan+kor /;
Parameter pc commodity prices (us$ per ton) / refined-cu 2000 , semi 2200 /
tariffr(i,j) tariffs on refined copper (us$ per ton of copper content)
tariffs(j,j) tariffs on semi-manufactured goods (us$ per ton of copper content);
Table itp(j,*) import tariffs (%)
refined-cu semi
usa 1 6
mex+cam 15 15
es-america 15 15
ws-america 15 15
w-europe 8
ee+ussr 15 15
c-africa 15 15
s-africa 15 15
o-asia 15 15
japan+kor 8.5 15
china 15 15
australia 15
canada 6
;
tariffs(jp,j) = pc("semi")*itp(j,"semi")/100;
tariffs(j,j) = 0;
tariffr(i,j)$(not ntfr(i,j)) = pc("refined-cu")*itp(j,"refined-cu")/100;
Display tariffs,tariffr;
$Stitle model definition
Variables zm(p,i,t) process level: mines smelters and refineries (1000 tpy)
zs(p,j,t) process level: wire sheet and tube plants (1000 tpy)
xi(c,i,i,t) interplant shipments of ore and blister (1000 tpy)
xir(i,j,t) shipments: refined copper from smelters to semi-manufacturers (1000 tpy)
xfr(i,j,t) shipments: refined copper to markets for end use (1000 tpy)
xfs(c,j,j,t) shipments: semi-manufactures to markets (1000 tpy)
ssr(c,i,t) scrap supply: smelters and refineries (1000 tpy)
ssm(c,j,t) scrap supply: sheet and tube plants (1000 tpy)
ssa(j,t) scrap supply: semi-manufacturing (1000 tpy)
hm(m,i,t) capacity expansion: mines smelters and refineries (1000 tpy)
sm(m,i,t) unused economies-of-scale expansion: mines smelters and refineries (1000 tpy)
hs(m,j,t) capacity expansion: wire tube and sheet plants (1000 tpy)
ss(m,j,t) unused economies-of-scale expansion: wire tube and sheet plants (1000 tpy)
ym(m,i,t) expansion decision variable: mines smelters and refineries
ys(m,j,t) expansion decision variable: wire tube and sheets plants
phikm(t) costs: capital charges at mines smelters and refineries (million us$)
phiks(t) costs: capital charges at wire tube and sheet plants (million us$)
phiom(t) costs: operating costs at mines smelters and refineries (million us$)
phios(t) costs: operating costs at wire tube and sheet plants (million us$)
phit(t) costs: transport costs (million us$)
phitf(t) costs: tariff costs (million us$)
phiu(t) costs: total annual undiscounted cost (million us$)
phiutf(t) costs: total annual undiscounted cost with tariffs (million us$)
phi1 total cost (million us$)
phi2 total cost with tariffs (million us$)
Positive Variable zm,zs,xi,xir,xfr,xfs,ssr,ssm,ssa,hm,hs,sm,ss
Binary Variable ym,ys
Equations mbm(c,i,t) material balance: mines smelters and refineries (1000 tpy)
mbs(c,j,t) material balance: semi-manufacturing (1000 tpy)
mr(c,j,t) market requirements (1000 tpy)
orec(p,i) high-grade ore mining limitations (1000 tpy)
sbs(j,t) scrap balance at semi-manufacturing locations (1000 tpy)
ccm(m,i,t) capacity constraint: mines smelters and refineries (1000 tpy)
ccs(m,j,t) capacity constraint: semi-manufacturing (1000 tpy)
icm1(m,i,t) maximum expansion: mines smelters and refineries (1000 tpy)
icm2(m,i,t) limits to economies-of-scale: mines smelters and refineries (1000 tpy)
ics1(m,j,t) maximum expansion: wire tube and sheet plants (1000 tpy)
ics2(m,j,t) limits to economies-of-scale: wire tube and sheet plants (1000 tpy)
akm(t) accounting: capital charges for mines smelters and refineries (million us$)
aks(t) accounting: capital charges for wire tube and sheet plants (million us$)
aom(t) accounting: operating cost for mines smelters and refineries (million us$)
aos(t) accounting: opearting cost for wire tube and sheet plants (million us$)
aot(t) accounting: transport (million us$)
aotf(t) accounting: tariffs (million us$)
au(t) accounting: undiscounted annual cost (million us$)
autf(t) accounting: undiscounted annual cost with tarifsf (million us$)
aobj objective function (million us$)
aobjtf objective function with tariffs (million us$);
$Eject
$Double
mbm(cm,i,t)$mapic(i,cm)..
sum(pm$mapip(i,pm), a(cm,pm)*zm(pm,i,t)) + sum(ip, xi(cm,ip,i,t))$cim(cm) + ssr(cm,i,t)$cil(cm)
=g= sum(j, xfr(i,j,t))$cfr(cm) + sum(ip, xi(cm,i,ip,t))$cim(cm) + sum(j, xir(i,j,t))$cfr(cm);
mbs(cs,j,t)$mapjc(j,cs).. sum(psm$mapjp(j,psm), a(cs,psm)*zs(psm,j,t)) + sum(i, xir(i,j,t))$cfr(cs)
+ ssm(cs,j,t)$cil(cs) =g= sum(jp, xfs(cs,j,jp,t))$cfs(cs) ;
mr(cf,j,t).. sum(i, xfr(i,j,t))$cfr(cf) + sum(jp, xfs(cf,jp,j,t))$cfs(cf) =g= demand(j,cf,t);
ccm(mm,i,t).. sum(pm$mapip(i,pm), b(mm,pm)*zm(pm,i,t)) =l= capm(i,mm) + sum(tp$ts(t,tp), hm(mm,i,tp));
ccs(ms,j,t).. sum(psm$mapjp(j,psm), b(ms,psm)*zs(psm,j,t)) =l= caps(j,ms) + sum(tp$ts(t,tp), hs(ms,j,tp));
icm1(mm,i,t).. hm(mm,i,t) =l= hhatm(i,mm)*ym(mm,i,t);
ics1(ms,j,t).. hs(ms,j,t) =l= hhats(j,ms)*ys(ms,j,t);
icm2(mm,i,t).. hm(mm,i,t) + sm(mm,i,t) =g= hbarm(i,mm)*ym(mm,i,t);
ics2(ms,j,t).. hs(ms,j,t) + ss(ms,j,t) =g= hbars(j,ms)*ys(ms,j,t);
orec(pmm,i).. sum(t, rph(t)*zm(pmm,i,t)) =l= 1000*reserves(i,pmm);
sbs(j,t).. ssa(j,t) =e= sum(cil, ssm(cil,j,t));
akm(t).. phikm(t) =e= sigma*sum(tp$ts(t,tp), sum((i,mm), sfi(i)*(omegam(i,mm)*sm(mm,i,tp) + num(i,mm)*hm(mm,i,tp))));
aks(t).. phiks(t) =e= sigma*sum(tp$ts(t,tp), sum((j,ms), sfj(j)*(omegas(j,ms)*ss(ms,j,tp) + nus(j,ms)*hs(ms,j,tp))));
aom(t).. phiom(t) =e= sum((pm,i)$mapip(i,pm), opi(i)*opm(i,pm)*zm(pm,i,t)) / 1000;
aos(t).. phios(t) =e= sum((psm,j), opj(j)*ops(j,psm)*zs(psm,j,t));
aot(t).. phit(t) =e= ( sum((cim,i,ip), mur(i,ip,cim)*xi(cim,i,ip,t)) + sum((cfs,j,jp), mufs(j,jp)*xfs(cfs,j,jp,t))
+ sum((i,j), mui(i,j)*(xir(i,j,t) + xfr(i,j,t))) ) / 1000;
aotf(t).. phitf(t) =e= sum(j, sum(i, tariffr(i,j)*(xfr(i,j,t) + xir(i,j,t)))
+ sum((cfs,jp), tariffs(jp,j)*xfs(cfs,jp,j,t)) )/1000;
au(t).. phiu(t) =e= phikm(t) + phiks(t) + phiom(t) + phios(t) + phit(t);
autf(t).. phiutf(t) =e= phikm(t) + phiks(t) + phiom(t) + phios(t) + phit(t) + phitf(t);
aobj.. phi1 =e= sum(t, period(t)*dis(t)*phiu(t));
aobjtf.. phi2 =e= sum(t, period(t)*dis(t)*phiutf(t));
$Single
* bounds
zm.up(pmh,i,t) = resc(i,pmh);
zs.lo("wire-ref-c",j,t) = caps(j,"wire");
ssr.up(cil,i,t) = scrapi(i,t,cil);
* depending on semi-manufacturing scrap formulation use either:
*ssm.up(cil,j,t) = scrapj(j,t,cil);
* or:
ssa.up(j,t) = scrapj(j,t,"scrap");
Model copper / all /;
Solve copper minimizing phi2 using mip;
$Stitle report
Set cps / exist-cap, new-cap, total-cap, production, shipped, slack /
Parameter xii(*,*,*) shipments of inputs (ore-blister-refined copper - 1000 tons)
xfd(*,*,c) shipments of final products: disaggregated (1000 tons)
cpdm capacity-production at mines (1000 tons)
cpds capacity-production at smelters (1000 tons)
cpdr capactiy-production at refineries (1000 tons)
cpdw capacity-production at wire plants (1000 tons)
cpdt capacity-production at tube plants (1000 tons)
cpdsh capacity-production at sheet plants (1000 tons);
xii(i,ip,cim) = sum(t, xi.l(cim,i,ip,t));
xii(i,i,"ore") = sum(t, sum(pmm, zm.l(pmm,i,t)) - sum(ip, xi.l("ore",i,ip,t)) );
xii(i,i,"blister") = sum(t, sum(ps, zm.l(ps,i,t)) - sum(ip, xi.l("blister",i,ip,t)) );
xii(i,j,"refined-cu") = sum(t, xir.l(i,j,t));
xii(i,"total",cim) = sum(ip, xii(i,ip,cim));
xii(i,"total",cfr) = sum(j, xii(i,j,cfr));
xii("total",i,cim) = sum(ip, xii(ip,i,cim));
xii("total",j,cfr) = sum(i, xii(i,j,cfr));
xii("total","total",c) = sum(i, xii(i,"total",c));
xfd(i,j,"refined-cu") = sum(t, xfr.l(i,j,t));
xfd(j,jp,cfs) = sum(t, xfs.l(cfs,j,jp,t));
xfd(i,"total",cfr) = sum(j, xfd(i,j,cfr));
xfd("total",j,cfr) = sum(i, xfd(i,j,cfr));
xfd(j,"total",cfs) = sum(jp, xfd(j,jp,cfs));
xfd("total",j,cfs) = sum(jp, xfd(jp,j,cfs));
xfd("total","total",c) = sum(j, xfd("total",j,c));
Display xii,xfd;
cpdm(i,"exist-cap") = capm(i,"open-pit");
cpdm(i,"new-cap") = sum(t, hm.l("open-pit",i,t));
cpdm(i,"total-cap") = cpdm(i,"exist-cap") + cpdm(i,"new-cap");
cpdm(i,"production") = sum((t,pmm), zm.l(pmm,i,t));
cpdm(i,"shipped") = xii(i,"total","ore");
cpdm(i,"slack") = round(cpdm(i,"total-cap") - sum((t,pmm), b("open-pit",pmm)*zm.l(pmm,i,t)),1);
cpdm(i,"cap-ut")$cpdm(i,"total-cap") = round(100*sum((t,pmm), b("open-pit",pmm)*zm.l(pmm,i,t))/cpdm(i,"total-cap"),1);
cpdm("**total**",cps) = sum(i, cpdm(i,cps));
cpds(i,"exist-cap") = capm(i,"smelter");
cpds(i,"new-cap") = sum(t, hm.l("smelter",i,t));
cpds(i,"total-cap") = cpds(i,"exist-cap") + cpds(i,"new-cap");
cpds(i,"production") = sum((t,ps), zm.l(ps,i,t));
cpds(i,"shipped") = xii(i,"total","blister");
cpds(i,"slack") = round(cpds(i,"total-cap") - sum((t,ps), b("smelter",ps)*zm.l(ps,i,t)),1);
cpds(i,"cap-ut")$cpds(i,"total-cap") = round(100*sum((t,ps), b("smelter",ps)*zm.l(ps,i,t))/cpds(i,"total-cap"),1);
cpds("**total**",cps) = sum(i, cpds(i,cps));
cpdr(i,"exist-cap") = capm(i,"refinery");
cpdr(i,"new-cap") = sum(t, hm.l("refinery",i,t));
cpdr(i,"total-cap") = cpdr(i,"exist-cap") + cpdr(i,"new-cap");
cpdr(i,"production") = sum((t,pr), zm.l(pr,i,t));
cpdr(i,"shipped") = xii(i,"total","refined-cu") + xfd(i,"total","refined-cu");
cpdr(i,"slack") = round(cpdr(i,"total-cap") - sum((t,pr), b("refinery",pr)*zm.l(pr,i,t)),1);
cpdr(i,"cap-ut")$cpdr(i,"total-cap") = round(100*sum((t,pr), b("refinery",pr)*zm.l(pr,i,t))/cpdr(i,"total-cap"),1);
cpdr("**total**",cps) = sum(i, cpdr(i,cps));
Display cpdm,cpds,cpdr;
cpdw(j,"exist-cap") = caps(j,"wire");
cpdw(j,"new-cap") = sum(t, hs.l("wire",j,t));
cpdw(j,"total-cap") = cpdw(j,"exist-cap") + cpdw(j,"new-cap");
cpdw(j,"production") = sum((t,pw), zs.l(pw,j,t));
cpdw(j,"shipped") = xfd(j,"total","wire");
cpdw(j,"slack") = round(cpdw(j,"production") - sum((t,pw), b("wire",pw)*zs.l(pw,j,t)),1);
cpdw(j,"cap-ut")$cpdw(j,"total-cap") = round(100*sum((t,pw), b("wire",pw)*zs.l(pw,j,t))/cpdw(j,"total-cap"),1);
cpdw("**total**",cps) = sum(j, cpdw(j,cps));
Display cpdw;
cpdt(j,"exist-cap") = caps(j,"tubes+rods");
cpdt(j,"new-cap") = sum(t, hs.l("tubes+rods",j,t));
cpdt(j,"total-cap") = cpdt(j,"exist-cap") + cpdt(j,"new-cap");
cpdt(j,"production") = sum((t,ptr), zs.l(ptr,j,t));
cpdt(j,"shipped") = xfd(j,"total","tubes+rods");
cpdt(j,"slack") = round(cpdt(j,"production") - sum((t,ptr), b("tubes+rods",ptr)*zs.l(ptr,j,t)),1);
cpdt(j,"cap-ut")$cpdt(j,"total-cap") = round(100*sum((t,ptr), b("tubes+rods",ptr)*zs.l(ptr,j,t))/cpdt(j,"total-cap")
,1);
cpdt("**total**",cps) = sum(j, cpdt(j,cps));
Display cpdt;
cpdsh(j,"exist-cap") = caps(j,"sheets+p+s");
cpdsh(j,"new-cap") = sum(t, hs.l("sheets+p+s",j,t));
cpdsh(j,"total-cap") = cpdsh(j,"exist-cap") + cpdsh(j,"new-cap") ;
cpdsh(j,"production") = sum((t,psh), zs.l(psh,j,t));
cpdsh(j,"shipped") = xfd(j,"total","sheets+p+s");
cpdsh(j,"slack") = round(cpdsh(j,"production") - sum((t,psh), b("sheets+p+s",psh)*zs.l(psh,j,t)),1);
cpdsh(j,"cap-ut")$cpdsh(j,"total-cap")
= round(100*sum((t,psh), b("sheets+p+s",psh)*zs.l(psh,j,t))/cpdsh(j,"total-cap"),1);
cpdsh("**total**",cps) = sum(j, cpdsh(j,cps));
Display cpdsh;
Parameter sprice(j,cf,*) shadow price of demand balance
costt(*) cost tabulation (million us$);
sprice(j,cf,"$-per-ton") = - 1000*sum(t, mr.m(cf,j,t));
sprice(j,cf,"$-per-lb") = sprice(j,cf,"$-per-ton")/lbperton;
Display sprice;
costt("capital-i") = sum(t, phikm.l(t));
costt("capital-j") = sum(t, phiks.l(t));
costt("operate-i") = sum(t, phiom.l(t));
costt("operate-j") = sum(t, phios.l(t));
costt("transport") = sum(t, phit.l(t));
costt("tariff") = sum(t, phitf.l(t));
costt("total-cost") = phi2.l;
Display costt;