$title External Equation - Example MCP 2 (EXMCP2,SEQ=574) $onText DLL Test Problem Number MCP2 -- dense nonlinear system $offText set i /i1*i8/; alias (i,j); variables x(i) Unknowns; equations equ(j) System of equations equx(j) System of equations with external equations; equ(j).. sqr(x(j)) + sum(i, 0.1 * ord(i) * x(i)) =e= 1; equx(j).. sum(i, ord(i) * x(i)) =x= ord(j); parameter x0(J) Starting point (for GAMS and external equations); x0(j) = uniform(0,1); option sysout=on; x.l(j) = x0(j); $ set pre $ifI %system.filesys%==unix $set pre 'lib' $ set suf '64' $set N exmcp2 $set cN %pre%%N%c%suf% $set c_cbN %pre%%N%c_cb%suf% $set fN %pre%%N%f%suf% $set f_cbN %pre%%N%f_cb%suf% model %N% 'GAMS implementation' / equ /; model %cN% 'External equations in C' / equx /; model %c_cbN% 'External equations in C, with callbacks' / equx /; model %fN% 'External equations in F77' / equx /; model %f_cbN% 'External equations in F77, with callbacks' / equx /; scalar totdist /0/; parameter solution(J,*); * Check that the model dimension here is consistent * with the external equation implementation abort$(card(i) ne 8) " Inconsistent dimension -- it must equal 8!"; $onEchoV > runme.gms x.l(j) = x0(j); solve %1 using mcp; solution(j,"%1") = x.l(j); totdist = totdist + sum {J, abs(x.l(J)-solution(J,'exmcp2'))}; $offEcho $ set ext '.dll' $ifI %system.filesys%==unix $set ext '.so' $ifI %system.platform%==dex $set ext '.dylib' $ifI %system.platform%==dax $set ext '.dylib' $ set eq $ifI %system.filesys%==unix $set eq "'" $if set runall $set runC '1' set runC_cb '1' set runF '1' set runF_cb '1' $ifThen not set nocomp $ ifI set runC $call gams complink lo=%gams.lo% --lang=c --files=exmcp2c.c --libname=%cN%%ext% $ if errorlevel 1 $abort Error compiling C Library $ ifI set runC_cb $call gams complink lo=%gams.lo% --lang=c --files=exmcp2c_cb.c --libname=%c_cbN%%ext% $ if errorlevel 1 $abort Error compiling C Library $ ifI set runF $call gams complink lo=%gams.lo% --lang=fortran90 --files=%eq%"gehelper.f90 exmcp2f.f90"%eq% --libname=%fN%%ext% $ if errorlevel 1 $abort Error compiling Fortran90 Library $ ifI set runF_cb $call gams complink lo=%gams.lo% --lang=fortran90 --files=%eq%"gehelper.f90 msg2_f.f90 exmcp2f_cb.f90"%eq% --libname=%f_cbN%%ext% $ if errorlevel 1 $abort Error compiling Fortran90 Library $endIf $ batInclude runme %N% $if set runC $batInclude runme %cN% $if set runC_cb $batInclude runme %c_cbN% $if set runF $batInclude runme %fN% $if set runF_cb $batInclude runme %f_cbN% display solution; if {(totdist < 1.0E-6), display "@@@@ #Test passed."; else abort totdist, "@@@@ #Test not passed. Inspect exmcp2.lst for details."; };