tabora.gms : Tabora Rural Development - Fuelwood Production

**Description**

A village in Tanzania, growing maize and tobacco, is faced with the decision to either invest in a managed forest close to the village or continue to harvest wood from the natural forest which requires increasing travel time as the resource gets depleted. The investments in the managed forest are analyzed using a 30 year dynamic model.

**Reference**

- World Bank, Tanzania: Appraisal of the Tabora Rural Development Project. Tech. rep., The World Bank, 1977.

**Large Model of Type :** LP

**Category :** GAMS Model library

**Main file :** tabora.gms

```
$Title Tabora Rural Development - Fuelwood Production (TABORA,SEQ=57)
$Ontext
A village in Tanzania, growing maize and tobacco, is faced with the
decision to either invest in a managed forest close to the village or
continue to harvest wood from the natural forest which requires increasing
travel time as the resource gets depleted. The investments in the
managed forest are analyzed using a 30 year dynamic model.
World Bank, Tanzania: Appraisal of the Tabora Rural Development Project.
Tech. rep., The World Bank, 1977.
$Offtext
Set t time periods / y01*y30 /
a age of trees / a01*a24 /
m month / jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec /
mc(m) cutting months / jul, aug, sep, oct /
i annuly / 1*9 /
c annual crops / maize, tobacco /
Table ld(*,m) labor requirements
jan feb mar apr may jun jul aug sep oct nov dec
tobacco 44.7 84.2 87.3 90.7 20.5 37.3 44.7 19.7 46.4
maize 46.7 10.0 13.0 16.7 18.3 13.3 33.3
timber-1 10.0 3.0 10.0 1.0 7.0 8.0 9.0
timber-2 7.0 10.0 1.0
other 10.0 8.0 12.0 10.0 4.0 2.0 10.0 28.0 24.0
Table tmd(*,c) crop data
tobacco maize
input-cost 2000 20
yield 675 750
price 8.4 .8
Scalars nfam number of families in village / 400 /
sfam size of family (adult equiv) / 3 /
resw reservation wage (tsh per hour) / .5 /
fdmaize domestic maize demand (kg per family) / 650 /
tob steady state tobacco (ha) / 234 /
sr starting radius of annulus (km) / 5 /
width width of annulus (km) / 1 /
ws walking speed (km per hour) / 5 /
whd work hours per day / 10 /
wdm working days per month / 25 /
tr transport cost (tsh per m3 per km) / 1.31 /
tc timber planting cost (tsh per ha) / 349 /
wrc wood for curing (m3 per ha) / 46.75 /
dwr domestic wood requirement (m3 per family) / 10 /
labwc labor for cutting forest (man-days per m3) / 1 /
labvc labor for cutting timber (man-days per m3) / .5 /
yw yield of existing forest (m3 per ha) / 40 /
rho discount rate / .1 /
matr improvement in maize yield after tobacco / .25/
dmaize domestic maize demand in village (kg)
wr wood requirements for domestic use and tobacco curing (m3)
Parameters yv(a) yield of planted timber (m3 per ha) / (a08,a16,a24) = 120 /
vr(t) residual value of timber (tsh)
labor(m) village labor supply (man-days)
fa(i) area of annulus (ha)
dist(i) average distance of annulus (km)
labw(i) labor for cutting forest (man-days)
cc(c) input cost (tsh per ha)
yc(c) crop yields (kg per ha)
pc(c) crop prices (tsh per kg)
cr(c) crop revenues (tsh per ha)
delt(t) discount factor
delta(a) discount factor for tree age;
dmaize = fdmaize*nfam;
wr = tob*wrc + dwr*nfam;
delt(t) = (1+rho)**(-ord(t));
delta(a) = (1+rho)**(-ord(a));
vr(t) = tr*sr*sum(a$(ord(t)+ord(a) gt card(t)), yv(a)*delta(a));
dist(i) = sr - width/2 + width*ord(i) ;
fa(i) = 100*3.1416*dist(i)*width ;
labor(m) = nfam*(sfam*wdm - ld("other",m));
labw(i) = yw*labwc*whd/(whd - 2*dist(i)/ws);
cc(c) = tmd("input-cost",c);
yc(c) = tmd("yield",c);
pc(c) = tmd("price",c);
cr(c) = yc(c)*pc(c);
Display dmaize,wr,delt,delta,vr,fa,yv,dist,labor,labw,pc,yc,cc,cr;
$Stitle model definition
Variables w(t,i) cutting of existing forest (ha)
v(t) management of planted timber (ha)
x(t,c) cropping activity (ha)
mat(t) maize after tobacco (ha)
lc(t,m) labor for wood cutting (man-days)
rev(t) revenue (1000 tsh)
cost(t) annual cost (1000 tsh)
income discounted income (discounted 1000 tsh)
Positive Variables w,v,x,mat,lc
Equations wb(t) wood balance (m3)
wa(i) wood availability (ha)
lb(t,m) labor balance (man-days)
lw(t) labor constraint for wood cutting (man-days)
matd1(t) maize after tobacco: type 1 (ha)
matd2(t) maize after tobacco: type 2 (ha)
mm(t) minimum maize demand (kg)
ttb(t) post terminal timber bounds (m3)
rd(t) revenue definition (1000 tsh)
cd(t) cost definition (1000 tsh)
od objective definition (discounted 1000 tsh);
$Eject
wb(t).. yw*sum(i, w(t,i)) + sum(a, yv(a)*v(t-ord(a))) =g= wrc*x(t,"tobacco") + dwr*nfam;
wa(i).. sum(t, w(t,i)) =l= fa(i) ;
lb(t,m).. ld("timber-1",m)*v(t) + ld("timber-2",m)*v(t-1) + sum(c, ld(c,m)*x(t,c)) + lc(t,m)$mc(m) =l= labor(m);
lw(t).. sum(mc, lc(t,mc)) =e= sum(i, labw(i)*w(t,i)) + sum(a, labvc*yv(a)*v(t-ord(a)));
mm(t).. yc("maize")*(x(t,"maize") + matr*mat(t)) =g= dmaize;
ttb(t).. sum(a , yv(a)*v(t+(card(t)-ord(a))) ) =l= wr;
matd1(t-1).. mat(t) =l= x(t-1,"tobacco");
matd2(t).. mat(t) =l= x(t,"maize");
rd(t).. rev(t) =e= (sum(c, cr(c)*x(t,c)) + matr*cr("maize")*mat(t))/1000;
cd(t).. cost(t) =e= (sum(c, cc(c)*x(t,c)) + tc*v(t) + resw*whd*sum(mc, lc(t,mc)) + sum(i, tr*yw*dist(i)*w(t,i)))/1000;
od.. income =e= sum(t, delt(t)*(rev(t) - cost(t) + vr(t)*v(t)/1000) );
mat.up("y01") = tob;
Model tabora /all/ ;
* this problem is poorly scaled and the shadow prices are so small to
* be indistinguishable from zero in the last few periods. automatic scaling
* was required when using apex4. the folling option statement was needed.
* option scale=on;
Solve tabora maximizing income using lp;
Parameter rep1 summary report;
rep1(t,"income") = rev.l(t) - cost.l(t); rep1(t,"timber") = v.l(t);
rep1(t,c) = x.l(t,c); rep1(t,"forest") = sum(i, w.l(t,i));
rep1(t,"distance")$rep1(t,"forest") = sum(i, dist(i)*w.l(t,i))/rep1(t,"forest");
Display rep1;
```