Description
This model has been used to analyze investment requirements in the world copper sector.
Large Model of Type : MIP
Category : GAMS Model library
Main file : copper.gms
$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.
Keywords: mixed integer linear programming, investment planning, copper industry,
international trade
$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;
* transform the set of year labels to numerical values and compute length of time periods used in model:
Parameter
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';
* 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)) < 0);
psj(psm) = yes$(sum(cil, a(cil,psm)) < 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) = 0) = 0;
mapip(irun,pm) = 1;
mapip(irun,psi)$(sum(cil, a(cil,psi)*mapic(irun,cil)) = 0) = 0;
mapjc(jrun,cs) = 1;
mapjc(jrun,cil)$(hds2(jrun,cil) = 0) = 0;
mapjp(jrun,psm) = 1;
mapjp(jrun,psj)$(sum(cil, a(cil,psj)*mapjc(jrun,cil)) = 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;
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 tons)
* /1000 ton)
(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;
Table invs(jt,m,*) 'investment costs for semi-manufacturing - 1980'
fixed var ec-scale
* (mill us$) (mill us$ (1000 tons)
* /1000 ton)
(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 ton)
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) >= 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 (us$ per ton
* per naut. mi) 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
+ 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
Variable
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;
Equation
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$)';
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));
* 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;