$title Intermixed External Rows: External Equation - Example MCP 5 (EXMCP5,SEQ=577) set i / i1 * i5 /; set c / c1 * c3 /; alias (i,j), (c,d); scalar NI, NC; NI = card(i); NC = card(c); positive variables u(i) 'external variables 1..NI' v(i) 'external variables NI+1..NI+NI' w(c) x(c) 'external variables 2*NI+1..2*NI+NC' y(i) ; equations du(i) dv(i) ev(i) 'external version of dv: 1..NI' dw(c) dx(c) ex(c) 'external version of dx: NI+1..NI+NC' dy(i) ; du(i) .. sqr(u(i)) =n= ord(i) - 2.5; dv(i) .. exp(v(i)) =n= u(i); ev(i) .. ord(i)*u(i) + (NI+ord(i))*v(i) =x= ord(i); dw(c) .. w(c)**1.5 =n= 0.1 * sum{j, u(j)}; dx(c) .. x(c)**1.75 =n= 0.2 * sum{i, u(i)}; ex(c) .. (2*NI + ord(c))*x(c) + sum{i, ord(i)*u(i)} =x= NI + ord(c); dy(i) .. 5*y(i) =g= u(i) - v(i) + sqrt(.125 * sum{c, x(c)}); $ set pre $ifI %system.filesys%==unix $set pre 'lib' $ set suf '64' $set N exmcp5 $set cN %pre%%N%c%suf% model %N% 'GAMS implementation' / du.u, dv.v, dw.w, dx.x, dy.y /; model %cN% 'External equations in C' / du.u, ev.v, dw.w, ex.x, dy.y /; $ set ext '.dll' $ifI %system.filesys%==unix $set ext '.so' $ifI %system.platform%==dex $set ext '.dylib' $ifI %system.platform%==dax $set ext '.dylib' $ifThen not set nocomp $ call gams complink lo=%gams.lo% --lang=c --files=exmcp5c.c --libname=%cN%%ext% $ if errorlevel 1 $abort Error compiling C Library $endIf w.lo(c) = 1e-4; x.lo(c) = 1e-4; scalar totdist / 0 /; parameter solution_u(i,*), solution_v(i,*), solution_w(c,*), solution_x(c,*), solution_y(i,*); u.l(i) = 0; v.l(i) = 0; w.l(c) = 0; x.l(c) = 0; y.l(j) = 0; solve %N% using mcp; solution_u(i,'%N%') = u.l(i); solution_v(i,'%N%') = v.l(i); solution_w(c,'%N%') = w.l(c); solution_x(c,'%N%') = x.l(c); solution_y(i,'%N%') = y.l(i); u.l(i) = 0; v.l(i) = 0; w.l(c) = 0; x.l(c) = 0; y.l(i) = 0; solve %cN% using mcp; solution_u(i,'%cN%') = u.l(i); solution_v(i,'%cN%') = v.l(i); solution_w(c,'%cN%') = w.l(c); solution_x(c,'%cN%') = x.l(c); solution_y(i,'%cN%') = y.l(i); totdist = totdist + sum {i, abs(u.l(i)-solution_u(i,'%N%'))}; totdist = totdist + sum {i, abs(v.l(i)-solution_v(i,'%N%'))}; totdist = totdist + sum {c, abs(w.l(c)-solution_w(c,'%N%'))}; totdist = totdist + sum {c, abs(x.l(c)-solution_x(c,'%N%'))}; totdist = totdist + sum {i, abs(y.l(i)-solution_y(i,'%N%'))}; display solution_u, solution_v, solution_w, solution_x, solution_y; if {(totdist < 1.0E-6), display "@@@@ #Test passed."; else abort totdist, "@@@@ #Test not passed. Inspect exmcp5.lst for details."; };