CONOPT
Loading...
Searching...
No Matches
triabad12.f90
Go to the documentation of this file.
1!> @file triabad12.f90
2!! @ingroup FORT1THREAD_EXAMPLES
3!!
4!! This is a CONOPT implementation of the GAMS model:
5!!
6!! @verbatim
7!! variable x1, x2, x3, x4;
8!! equation e1, e2, e3, e4, e5;
9!!
10!! e1 .. sqr(x1) =E= 1;
11!! e2 .. power(x2,3) =E= 1;
12!! e3 .. x1 + x3 =E= 2;
13!! e4 .. x3 + sqr(x2) =E= 2;
14!! e5 .. x4 =E= x1 + x3;
15!!
16!! x1.l = 0.999;
17!! x2.l = 0.010;
18!!
19!! model m / all /;
20!! solve m using nlp maximizing x4;
21!! @endverbatim
22!!
23!! Similar to triabad11 but with one extra recursive equation added.
24!! First e1 and e2 are recursive singletons and e1 will be solved first
25!! for x1 due to the better initial value.
26!! Given x1, e2 and e3 are recursive singletons, and e3 will be solved
27!! first with respect to x3 because it is linear.
28!! Given x1 and x3, e2, e4, and e5 are recursive singletons. e5 is
29!! linear so it is solved first wrt x4, the objective function.
30!! Finally e2 and e4 both candidate equations and the one to be selected
31!! depends on the pivot size and since we expect x2 < 1, e4 should
32!! have the better pivot.
33!!
34!!
35!! For more information about the individual callbacks, please have a look at the source code.
36
37#if defined(_WIN32) && !defined(_WIN64)
38#define dec_directives_win32
39#endif
40
41!> Main program. A simple setup and call of CONOPT
42!!
43Program triabad12
44
46 Use conopt
47 implicit None
48!
49! Declare the user callback routines as Integer, External:
50!
51 Integer, External :: tria_readmatrix ! Mandatory Matrix definition routine defined below
52 Integer, External :: tria_fdeval ! Function and Derivative evaluation routine
53 ! needed a nonlinear model.
54 Integer, External :: std_status ! Standard callback for displaying solution status
55 Integer, External :: std_solution ! Standard callback for displaying solution values
56 Integer, External :: std_message ! Standard callback for managing messages
57 Integer, External :: std_errmsg ! Standard callback for managing error messages
58 Integer, External :: std_triord ! Standard callback for triangular order
59#ifdef dec_directives_win32
60!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_ReadMatrix
61!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_FDEval
62!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Status
63!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Solution
64!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Message
65!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_ErrMsg
66!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_TriOrd
67#endif
68!
69! Control vector
70!
71 INTEGER, Dimension(:), Pointer :: cntvect
72 INTEGER :: coi_error
73!
74! Create and initialize a Control Vector
75!
76 call startup
77
78 coi_error = coi_create( cntvect )
79!
80! Tell CONOPT about the size of the model by populating the Control Vector:
81!
82 coi_error = max( coi_error, coidef_numvar( cntvect, 4 ) ) ! # variables
83 coi_error = max( coi_error, coidef_numcon( cntvect, 5 ) ) ! # constraints
84 coi_error = max( coi_error, coidef_numnz( cntvect, 9 ) ) ! # nonzeros in the Jacobian
85 coi_error = max( coi_error, coidef_numnlnz( cntvect, 3 ) ) ! # of which are nonlinear
86 coi_error = max( coi_error, coidef_optdir( cntvect, -1 ) ) ! Minimize
87 coi_error = max( coi_error, coidef_objvar( cntvect, 4 ) ) ! Objective is variable 4
88 coi_error = max( coi_error, coidef_optfile( cntvect, 'triabad12.opt' ) )
89!
90! Tell CONOPT about the callback routines:
91!
92 coi_error = max( coi_error, coidef_readmatrix( cntvect, tria_readmatrix ) )
93 coi_error = max( coi_error, coidef_fdeval( cntvect, tria_fdeval ) )
94 coi_error = max( coi_error, coidef_status( cntvect, std_status ) )
95 coi_error = max( coi_error, coidef_solution( cntvect, std_solution ) )
96 coi_error = max( coi_error, coidef_message( cntvect, std_message ) )
97 coi_error = max( coi_error, coidef_errmsg( cntvect, std_errmsg ) )
98 coi_error = max( coi_error, coidef_triord( cntvect, std_triord ) )
99
100#if defined(CONOPT_LICENSE_INT_1) && defined(CONOPT_LICENSE_INT_2) && defined(CONOPT_LICENSE_INT_3) && defined(CONOPT_LICENSE_TEXT)
101 coi_error = max( coi_error, coidef_license( cntvect, conopt_license_int_1, conopt_license_int_2, conopt_license_int_3, conopt_license_text) )
102#endif
103
104 If ( coi_error .ne. 0 ) THEN
105 write(*,*)
106 write(*,*) '**** Fatal Error while loading CONOPT Callback routines.'
107 write(*,*)
108 call flog( "Skipping Solve due to setup errors", 1 )
109 ENDIF
110!
111! Save the solution so we can check the duals:
112!
113 do_allocate = .true.
114!
115! Start CONOPT:
116!
117 coi_error = coi_solve( cntvect )
118
119 write(*,*)
120 write(*,*) 'End of Triabad12 example. Return code=',coi_error
121
122 If ( coi_error /= 0 ) then
123 call flog( "Errors encountered during solution", 1 )
124 elseif ( stacalls == 0 .or. solcalls == 0 ) then
125 call flog( "Status or Solution routine was not called", 1 )
126 elseif ( sstat /= 1 .or. mstat /= 2 ) then
127 call flog( "Solver and Model Status was not as expected (1,2)", 1 )
128 elseif ( abs( obj-2.0d0 ) > 0.000001d0 ) then
129 call flog( "Incorrect objective returned", 1 )
130 Else
131 Call checkdual( 'Triabad12', infeasible )
132 endif
133
134 if ( coi_free(cntvect) /= 0 ) call flog( "Error while freeing control vector",1)
135
136 call flog( "Successful Solve", 0 )
138End Program triabad12
139!
140! ============================================================================
141! Define information about the model:
142!
143
144!> Define information about the model
145!!
146!! @include{doc} readMatrix_params.dox
147Integer Function tria_readmatrix( lower, curr, upper, vsta, type, rhs, esta, &
148 colsta, rowno, value, nlflag, n, m, nz, &
149 usrmem )
150#ifdef dec_directives_win32
151!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_ReadMatrix
152#endif
153 implicit none
154 integer, intent (in) :: n ! number of variables
155 integer, intent (in) :: m ! number of constraints
156 integer, intent (in) :: nz ! number of nonzeros
157 real*8, intent (in out), dimension(n) :: lower ! vector of lower bounds
158 real*8, intent (in out), dimension(n) :: curr ! vector of initial values
159 real*8, intent (in out), dimension(n) :: upper ! vector of upper bounds
160 integer, intent (in out), dimension(n) :: vsta ! vector of initial variable status
161 ! (not defined here)
162 integer, intent (out), dimension(m) :: type ! vector of equation types
163 integer, intent (in out), dimension(m) :: esta ! vector of initial equation status
164 ! (not defined here)
165 real*8, intent (in out), dimension(m) :: rhs ! vector of right hand sides
166 integer, intent (in out), dimension(n+1) :: colsta ! vector with start of column indices
167 integer, intent (out), dimension(nz) :: rowno ! vector of row numbers
168 integer, intent (in out), dimension(nz) :: nlflag ! vector of nonlinearity flags
169 real*8, intent (in out), dimension(nz) :: value ! vector of matrix values
170 real*8 usrmem(*) ! optional user memory
171!
172! Information about Variables:
173! Default: Lower = -Inf, Curr = 0, and Upper = +inf.
174! Default: the status information in Vsta is not used.
175!
176! The model uses initial values for x1 and x2
177!
178 curr(1) = 0.999d0
179 curr(2) = 0.01d0
180!
181! Information about Constraints:
182! Default: Rhs = 0
183! Default: the status information in Esta and the function
184! value in FV are not used.
185! Default: Type: There is no default.
186! 0 = Equality,
187! 1 = Greater than or equal,
188! 2 = Less than or equal,
189! 3 = Non binding.
190!
191! Constraint 1: e1
192! Rhs = 1.0 and type Equality
193!
194 rhs(1) = 1.0d0
195 type(1) = 0
196!
197! Constraint 2: e2
198! Rhs = 1.0 and type Equality
199!
200 rhs(2) = 1.0d0
201 type(2) = 0
202!
203! Constraint 3: e3
204! Rhs = 2.0 and type Equality
205!
206 rhs(3) = 2.0d0
207 type(3) = 0
208!
209! Constraint 4: e4
210! Rhs = 2.0 and type Equality
211!
212 rhs(4) = 2.0d0
213 type(4) = 0
214!
215! Constraint 5: e5
216! Rhs = 0.0 and type Equality
217!
218 type(5) = 0
219!
220! Information about the Jacobian. CONOPT expects a columnwise
221! representation in Rowno, Value, Nlflag and Colsta.
222!
223! Colsta = Start of column indices (No Defaults):
224! Rowno = Row indices
225! Value = Value of derivative (by default only linear
226! derivatives are used)
227! Nlflag = 0 for linear and 1 for nonlinear derivative
228! (not needed for completely linear models)
229!
230! Indices
231! x(1) x(2) x(3) x(4)
232! 1: 1
233! 2: 4
234! 3: 2 6
235! 4: 5 7
236! 5: 3 8 9
237!
238 colsta(1) = 1
239 colsta(2) = 4
240 colsta(3) = 6
241 colsta(4) = 9
242 colsta(5) = 10
243 rowno(1) = 1
244 rowno(2) = 3
245 rowno(3) = 5
246 rowno(4) = 2
247 rowno(5) = 4
248 rowno(6) = 3
249 rowno(7) = 4
250 rowno(8) = 5
251 rowno(9) = 5
252!
253! Nonlinearity Structure: L = 0 are linear and NL = 1 are nonlinear
254! x(1) x(2) x(3) x(4)
255! 1: NL
256! 2: NL
257! 3: L L
258! 4: NL L
259! 5: L L L
260!
261 nlflag(1) = 1
262 nlflag(2) = 0
263 nlflag(3) = 0
264 nlflag(4) = 1
265 nlflag(5) = 1
266 nlflag(6) = 0
267 nlflag(7) = 0
268 nlflag(8) = 0
269 nlflag(9) = 0
270! e1 .. sqr(x1) =E= 1;
271! e2 .. power(x2,3) =E= 1;
272! e3 .. x1 + x3 =E= 2;
273! e4 .. x3 + sqr(x2) =E= 2;
274! e5 .. x4 =E= x1 + x3;
275!
276! Value (Linear only)
277! x(1) x(2) x(3) x(4)
278! 1: NL
279! 2: NL
280! 3: 1.0 1.0
281! 4: NL 1.0
282! 5: -1.0 -1.0 1.0
283!
284 value(2) = 1.d0
285 value(3) = -1.d0
286 value(6) = 1.d0
287 value(7) = 1.d0
288 value(8) = -1.d0
289 value(9) = 1.d0
290
291 tria_readmatrix = 0 ! Return value means OK
292
293end Function tria_readmatrix
294!
295!==========================================================================
296! Compute nonlinear terms and non-constant Jacobian elements
297!
298
299!> Compute nonlinear terms and non-constant Jacobian elements
300!!
301!! @include{doc} fdeval_params.dox
302Integer Function tria_fdeval( x, g, jac, rowno, jcnm, mode, ignerr, errcnt, &
303 n, nz, thread, usrmem )
304#ifdef dec_directives_win32
305!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_FDEval
306#endif
307 implicit none
308 integer, intent (in) :: n ! number of variables
309 integer, intent (in) :: rowno ! number of the row to be evaluated
310 integer, intent (in) :: nz ! number of nonzeros in this row
311 real*8, intent (in), dimension(n) :: x ! vector of current solution values
312 real*8, intent (in out) :: g ! constraint value
313 real*8, intent (in out), dimension(n) :: jac ! vector of derivatives for current constraint
314 integer, intent (in), dimension(nz) :: jcnm ! list of variables that appear nonlinearly
315 ! in this row. Ffor information only.
316 integer, intent (in) :: mode ! evaluation mode: 1 = function value
317 ! 2 = derivatives, 3 = both
318 integer, intent (in) :: ignerr ! if 1 then errors can be ignored as long
319 ! as errcnt is incremented
320 integer, intent (in out) :: errcnt ! error counter to be incremented in case
321 ! of function evaluation errors.
322 integer, intent (in) :: thread
323 real*8 usrmem(*) ! optional user memory
324!
325! Row 1: e1 .. sqr(x1) =E= 1;
326!
327 if ( rowno == 1 ) then
328!
329! Mode = 1 or 3. G = sqr(x1)
330!
331 if ( mode == 1 .or. mode == 3 ) then
332 g = x(1)*x(1)
333 endif
334!
335! Mode = 2 or 3: Derivative values:
336!
337 if ( mode .eq. 2 .or. mode .eq. 3 ) then
338 jac(1) = 2.d0*x(1)
339 endif
340 tria_fdeval = 0
341 else if ( rowno == 2 ) then
342!
343! e2 .. power(x2,3) =E= 1;
344!
345 if ( mode == 1 .or. mode == 3 ) then
346 g = x(2)*x(2)*x(2)
347 endif
348 if ( mode .eq. 2 .or. mode .eq. 3 ) then
349 jac(2) = 3.d0*x(2)*x(2)
350 endif
351 tria_fdeval = 0
352 else if ( rowno == 4 ) then
353!
354! e4 .. x3 + sqr(x2) =E= 2;
355!
356 if ( mode == 1 .or. mode == 3 ) then
357 g = x(2)*x(2)
358 endif
359 if ( mode .eq. 2 .or. mode .eq. 3 ) then
360 jac(2) = 2.d0*x(2)
361 endif
362 tria_fdeval = 0
363 else
364 tria_fdeval = 1
365 endif
366
367end Function tria_fdeval
368
integer function std_solution(xval, xmar, xbas, xsta, yval, ymar, ybas, ysta, n, m, usrmem)
Definition comdecl.f90:132
integer function std_status(modsta, solsta, iter, objval, usrmem)
Definition comdecl.f90:88
subroutine checkdual(case, minmax)
Definition comdecl.f90:394
integer function std_message(smsg, dmsg, nmsg, llen, usrmem, msgv)
Definition comdecl.f90:205
integer function std_triord(mode, type, status, irow, icol, inf, value, resid, usrmem)
Definition comdecl.f90:289
integer function std_errmsg(rowno, colno, posno, msglen, usrmem, msg)
Definition comdecl.f90:248
integer(c_int) function coidef_message(cntvect, coi_message)
define callback routine for handling messages returned during the solution process.
Definition conopt.f90:1265
integer(c_int) function coidef_solution(cntvect, coi_solution)
define callback routine for returning the final solution values.
Definition conopt.f90:1238
integer(c_int) function coidef_status(cntvect, coi_status)
define callback routine for returning the completion status.
Definition conopt.f90:1212
integer(c_int) function coidef_readmatrix(cntvect, coi_readmatrix)
define callback routine for providing the matrix data to CONOPT.
Definition conopt.f90:1111
integer(c_int) function coidef_errmsg(cntvect, coi_errmsg)
define callback routine for returning error messages for row, column or Jacobian elements.
Definition conopt.f90:1291
integer(c_int) function coidef_fdeval(cntvect, coi_fdeval)
define callback routine for performing function and derivative evaluations.
Definition conopt.f90:1135
integer(c_int) function coidef_optfile(cntvect, optfile)
define callback routine for defining an options file.
Definition conopt.f90:928
integer(c_int) function coidef_triord(cntvect, coi_triord)
define callback routine for providing the triangular order information.
Definition conopt.f90:1371
integer(c_int) function coidef_license(cntvect, licint1, licint2, licint3, licstring)
define the License Information.
Definition conopt.f90:293
integer(c_int) function coidef_numvar(cntvect, numvar)
defines the number of variables in the model.
Definition conopt.f90:97
integer(c_int) function coidef_numcon(cntvect, numcon)
defines the number of constraints in the model.
Definition conopt.f90:121
integer(c_int) function coidef_numnlnz(cntvect, numnlnz)
defines the Number of Nonlinear Nonzeros.
Definition conopt.f90:167
integer(c_int) function coidef_optdir(cntvect, optdir)
defines the Optimization Direction.
Definition conopt.f90:213
integer(c_int) function coidef_numnz(cntvect, numnz)
defines the number of nonzero elements in the Jacobian.
Definition conopt.f90:144
integer(c_int) function coidef_objvar(cntvect, objvar)
defines the Objective Variable.
Definition conopt.f90:257
integer(c_int) function coi_create(cntvect)
initializes CONOPT and creates the control vector.
Definition conopt.f90:1726
integer(c_int) function coi_free(cntvect)
frees the control vector.
Definition conopt.f90:1749
integer(c_int) function coi_solve(cntvect)
method for starting the solving process of CONOPT.
Definition conopt.f90:1625
real *8 obj
Definition comdecl.f90:16
integer solcalls
Definition comdecl.f90:15
integer sstat
Definition comdecl.f90:18
integer, parameter infeasible
Definition comdecl.f90:31
integer stacalls
Definition comdecl.f90:14
subroutine flog(msg, code)
Definition comdecl.f90:62
logical do_allocate
Definition comdecl.f90:27
integer mstat
Definition comdecl.f90:17
subroutine startup
Definition comdecl.f90:41
integer function tria_fdeval(x, g, jac, rowno, jcnm, mode, ignerr, errcnt, n, nz, thread, usrmem)
Compute nonlinear terms and non-constant Jacobian elements.
Definition tria01.f90:253
integer function tria_readmatrix(lower, curr, upper, vsta, type, rhs, esta, colsta, rowno, value, nlflag, n, m, nz, usrmem)
Define information about the model.
Definition tria01.f90:136
program triabad12
Main program. A simple setup and call of CONOPT.
Definition triabad12.f90:45