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