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 )
137!
138! Free solution memory
139!
140 call finalize
142End Program triabad12
143!
144! ============================================================================
145! Define information about the model:
146!
147
148!> Define information about the model
149!!
150!! @include{doc} readMatrix_params.dox
151Integer Function tria_readmatrix( lower, curr, upper, vsta, type, rhs, esta, &
152 colsta, rowno, value, nlflag, n, m, nz, &
153 usrmem )
154#ifdef dec_directives_win32
155!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_ReadMatrix
156#endif
157 implicit none
158 integer, intent (in) :: n ! number of variables
159 integer, intent (in) :: m ! number of constraints
160 integer, intent (in) :: nz ! number of nonzeros
161 real*8, intent (in out), dimension(n) :: lower ! vector of lower bounds
162 real*8, intent (in out), dimension(n) :: curr ! vector of initial values
163 real*8, intent (in out), dimension(n) :: upper ! vector of upper bounds
164 integer, intent (in out), dimension(n) :: vsta ! vector of initial variable status
165 ! (not defined here)
166 integer, intent (out), dimension(m) :: type ! vector of equation types
167 integer, intent (in out), dimension(m) :: esta ! vector of initial equation status
168 ! (not defined here)
169 real*8, intent (in out), dimension(m) :: rhs ! vector of right hand sides
170 integer, intent (in out), dimension(n+1) :: colsta ! vector with start of column indices
171 integer, intent (out), dimension(nz) :: rowno ! vector of row numbers
172 integer, intent (in out), dimension(nz) :: nlflag ! vector of nonlinearity flags
173 real*8, intent (in out), dimension(nz) :: value ! vector of matrix values
174 real*8 usrmem(*) ! optional user memory
175!
176! Information about Variables:
177! Default: Lower = -Inf, Curr = 0, and Upper = +inf.
178! Default: the status information in Vsta is not used.
179!
180! The model uses initial values for x1 and x2
181!
182 curr(1) = 0.999d0
183 curr(2) = 0.01d0
184!
185! Information about Constraints:
186! Default: Rhs = 0
187! Default: the status information in Esta and the function
188! value in FV are not used.
189! Default: Type: There is no default.
190! 0 = Equality,
191! 1 = Greater than or equal,
192! 2 = Less than or equal,
193! 3 = Non binding.
194!
195! Constraint 1: e1
196! Rhs = 1.0 and type Equality
197!
198 rhs(1) = 1.0d0
199 type(1) = 0
200!
201! Constraint 2: e2
202! Rhs = 1.0 and type Equality
203!
204 rhs(2) = 1.0d0
205 type(2) = 0
206!
207! Constraint 3: e3
208! Rhs = 2.0 and type Equality
209!
210 rhs(3) = 2.0d0
211 type(3) = 0
212!
213! Constraint 4: e4
214! Rhs = 2.0 and type Equality
215!
216 rhs(4) = 2.0d0
217 type(4) = 0
218!
219! Constraint 5: e5
220! Rhs = 0.0 and type Equality
221!
222 type(5) = 0
223!
224! Information about the Jacobian. CONOPT expects a columnwise
225! representation in Rowno, Value, Nlflag and Colsta.
226!
227! Colsta = Start of column indices (No Defaults):
228! Rowno = Row indices
229! Value = Value of derivative (by default only linear
230! derivatives are used)
231! Nlflag = 0 for linear and 1 for nonlinear derivative
232! (not needed for completely linear models)
233!
234! Indices
235! x(1) x(2) x(3) x(4)
236! 1: 1
237! 2: 4
238! 3: 2 6
239! 4: 5 7
240! 5: 3 8 9
241!
242 colsta(1) = 1
243 colsta(2) = 4
244 colsta(3) = 6
245 colsta(4) = 9
246 colsta(5) = 10
247 rowno(1) = 1
248 rowno(2) = 3
249 rowno(3) = 5
250 rowno(4) = 2
251 rowno(5) = 4
252 rowno(6) = 3
253 rowno(7) = 4
254 rowno(8) = 5
255 rowno(9) = 5
256!
257! Nonlinearity Structure: L = 0 are linear and NL = 1 are nonlinear
258! x(1) x(2) x(3) x(4)
259! 1: NL
260! 2: NL
261! 3: L L
262! 4: NL L
263! 5: L L L
264!
265 nlflag(1) = 1
266 nlflag(2) = 0
267 nlflag(3) = 0
268 nlflag(4) = 1
269 nlflag(5) = 1
270 nlflag(6) = 0
271 nlflag(7) = 0
272 nlflag(8) = 0
273 nlflag(9) = 0
274! e1 .. sqr(x1) =E= 1;
275! e2 .. power(x2,3) =E= 1;
276! e3 .. x1 + x3 =E= 2;
277! e4 .. x3 + sqr(x2) =E= 2;
278! e5 .. x4 =E= x1 + x3;
279!
280! Value (Linear only)
281! x(1) x(2) x(3) x(4)
282! 1: NL
283! 2: NL
284! 3: 1.0 1.0
285! 4: NL 1.0
286! 5: -1.0 -1.0 1.0
287!
288 value(2) = 1.d0
289 value(3) = -1.d0
290 value(6) = 1.d0
291 value(7) = 1.d0
292 value(8) = -1.d0
293 value(9) = 1.d0
294
295 tria_readmatrix = 0 ! Return value means OK
296
297end Function tria_readmatrix
298!
299!==========================================================================
300! Compute nonlinear terms and non-constant Jacobian elements
301!
302
303!> Compute nonlinear terms and non-constant Jacobian elements
304!!
305!! @include{doc} fdeval_params.dox
306Integer Function tria_fdeval( x, g, jac, rowno, jcnm, mode, ignerr, errcnt, &
307 n, nz, thread, usrmem )
308#ifdef dec_directives_win32
309!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_FDEval
310#endif
311 implicit none
312 integer, intent (in) :: n ! number of variables
313 integer, intent (in) :: rowno ! number of the row to be evaluated
314 integer, intent (in) :: nz ! number of nonzeros in this row
315 real*8, intent (in), dimension(n) :: x ! vector of current solution values
316 real*8, intent (in out) :: g ! constraint value
317 real*8, intent (in out), dimension(n) :: jac ! vector of derivatives for current constraint
318 integer, intent (in), dimension(nz) :: jcnm ! list of variables that appear nonlinearly
319 ! in this row. Ffor information only.
320 integer, intent (in) :: mode ! evaluation mode: 1 = function value
321 ! 2 = derivatives, 3 = both
322 integer, intent (in) :: ignerr ! if 1 then errors can be ignored as long
323 ! as errcnt is incremented
324 integer, intent (in out) :: errcnt ! error counter to be incremented in case
325 ! of function evaluation errors.
326 integer, intent (in) :: thread
327 real*8 usrmem(*) ! optional user memory
328!
329! Row 1: e1 .. sqr(x1) =E= 1;
330!
331 if ( rowno == 1 ) then
332!
333! Mode = 1 or 3. G = sqr(x1)
334!
335 if ( mode == 1 .or. mode == 3 ) then
336 g = x(1)*x(1)
337 endif
338!
339! Mode = 2 or 3: Derivative values:
340!
341 if ( mode .eq. 2 .or. mode .eq. 3 ) then
342 jac(1) = 2.d0*x(1)
343 endif
344 tria_fdeval = 0
345 else if ( rowno == 2 ) then
346!
347! e2 .. power(x2,3) =E= 1;
348!
349 if ( mode == 1 .or. mode == 3 ) then
350 g = x(2)*x(2)*x(2)
351 endif
352 if ( mode .eq. 2 .or. mode .eq. 3 ) then
353 jac(2) = 3.d0*x(2)*x(2)
354 endif
355 tria_fdeval = 0
356 else if ( rowno == 4 ) then
357!
358! e4 .. x3 + sqr(x2) =E= 2;
359!
360 if ( mode == 1 .or. mode == 3 ) then
361 g = x(2)*x(2)
362 endif
363 if ( mode .eq. 2 .or. mode .eq. 3 ) then
364 jac(2) = 2.d0*x(2)
365 endif
366 tria_fdeval = 0
367 else
368 tria_fdeval = 1
369 endif
370
371end Function tria_fdeval
372
integer function std_solution(xval, xmar, xbas, xsta, yval, ymar, ybas, ysta, n, m, usrmem)
Definition comdecl.f90:170
integer function std_status(modsta, solsta, iter, objval, usrmem)
Definition comdecl.f90:126
subroutine checkdual(case, minmax)
Definition comdecl.f90:432
integer function std_message(smsg, dmsg, nmsg, llen, usrmem, msgv)
Definition comdecl.f90:243
integer function std_triord(mode, type, status, irow, icol, inf, value, resid, usrmem)
Definition comdecl.f90:327
integer function std_errmsg(rowno, colno, posno, msglen, usrmem, msg)
Definition comdecl.f90:286
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
subroutine finalize
Definition comdecl.f90:79
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:257
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:140
program triabad12
Main program. A simple setup and call of CONOPT.
Definition triabad12.f90:45