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