CONOPT
Loading...
Searching...
No Matches
tria04.f90
Go to the documentation of this file.
1!> @file tria04.f90
2!! @ingroup FORT1THREAD_EXAMPLES
3!!
4!!
5!! Triangular Demo model 04
6!!
7!! This is a CONOPT implementation of the GAMS model:
8!!
9!! @verbatim
10!! variable x1, x2, x3 ;
11!! equation e1, e2, e3 ;
12!!
13!! e1 .. x1 + sqr(x2) =e= 5;
14!!
15!! e2 .. 5*x2 =e= 4;
16!!
17!! e3 .. x3 =e= x2 + x1;
18!! @endverbatim
19!!
20!! This model is triangular and the solution is known to be unique
21!! even though it is nonlinear. x2 is determined uniquely from e2 and it
22!! is no longer variable when it is used nonlinearly in e1.
23!! CONOPT will therefore return model status = 1 or "Optimal" and
24!! not the usual model status = 2 or "Locally Optimal".
25!!
26!! @verbatim
27!! model tria04 / all /;
28!!
29!! solve tria04 using nlp minimizing x3;
30!! @endverbatim
31!!
32!!
33!! Add a lower bound on x1 that is too high and solve again.
34!! The model will now be infeasible due to the bound.
35!! The infeasibility is not local since x2 is unique from e2 and
36!! x1 appears linearly in e1.
37!!
38!! @verbatim
39!! x1.lo = 5;
40!!
41!! solve tria04 using nlp minimizing x3;
42!! @endverbatim
43!!
44!!
45!! For more information about the individual callbacks, please have a look at the source code.
46
47
48!> Main program. A simple setup and call of CONOPT
49!!
50Program tria04
51
52 Use proginfo
53 Use coidef
54 use casedata_num
55 implicit None
56!
57! Declare the user callback routines as Integer, External:
58!
59 Integer, External :: tria_readmatrix ! Mandatory Matrix definition routine defined below
60 Integer, External :: tria_fdeval ! Function and Derivative evaluation routine
61 ! needed a nonlinear model.
62 Integer, External :: std_status ! Standard callback for displaying solution status
63 Integer, External :: std_solution ! Standard callback for displaying solution values
64 Integer, External :: std_message ! Standard callback for managing messages
65 Integer, External :: std_errmsg ! Standard callback for managing error messages
66 Integer, External :: std_triord ! callback for triangular order
67#if defined(itl)
68!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_ReadMatrix
69!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_FDEval
70!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Status
71!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Solution
72!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Message
73!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_ErrMsg
74!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_TriOrd
75#endif
76!
77! Control vector
78!
79 INTEGER :: numcallback
80 INTEGER, Dimension(:), Pointer :: cntvect
81 INTEGER :: coi_error
82
83 call startup
84!
85! Create and initialize a Control Vector
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, 3 ) ) ! 3 variables
94 coi_error = max( coi_error, coidef_numcon( cntvect, 3 ) ) ! 3 constraints
95 coi_error = max( coi_error, coidef_numnz( cntvect, 6 ) ) ! 6 nonzeros in the Jacobian
96 coi_error = max( coi_error, coidef_numnlnz( cntvect, 1 ) ) ! 1 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, 'tria04.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 coi_error = max( coi_error, coidef_triord( cntvect, std_triord ) )
110
111#if defined(LICENSE_INT_1) && defined(LICENSE_INT_2) && defined(LICENSE_INT_3) && defined(LICENSE_TEXT)
112 coi_error = max( coi_error, coidef_license( cntvect, license_int_1, license_int_2, license_int_3, license_text) )
113#endif
114
115 If ( coi_error .ne. 0 ) THEN
116 write(*,*)
117 write(*,*) '**** Fatal Error while loading CONOPT Callback routines.'
118 write(*,*)
119 call flog( "Skipping Solve due to setup errors", 1 )
120 ENDIF
121!
122! Save the solution so we can check the duals:
123!
124 do_allocate = .true.
125!
126! Start CONOPT:
127!
128 casenum = 1
129 coi_error = coi_solve( cntvect )
130
131 If ( coi_error /= 0 ) then
132 call flog( "Solve 1: Errors encountered during solution", 1 )
133 elseif ( stacalls == 0 .or. solcalls == 0 ) then
134 call flog( "Solve 1: Status or Solution routine was not called", 1 )
135 elseif ( sstat /= 1 .or. mstat /= 1 ) then
136 call flog( "Solve 1: Solver and Model Status was not as expected (1,1)", 1 )
137 elseif ( abs( obj-5.16d0 ) > 0.000001d0 ) then
138 call flog( "Solve 1: Incorrect objective returned", 1 )
139 Else
140 Call checkdual( 'Tria04-Opt', minimize )
141 endif
142
143 casenum = 2
144 coi_error = coi_solve( cntvect )
145
146 If ( coi_error /= 0 ) then
147 call flog( "Solve 2: Errors encountered during solution", 1 )
148 elseif ( stacalls == 0 .or. solcalls == 0 ) then
149 call flog( "Solve 2: Status or Solution routine was not called", 1 )
150 elseif ( sstat /= 1 .or. mstat /= 4 ) then
151 call flog( "Solve 2: Solver and Model Status was not as expected (1,4)", 1 )
152! No objective test for infeasible model
153 Elseif ( abs( xprim(1)+xprim(2)**2-uprim(1) ) > 1.d-7 ) then
154 call flog( "Solve 2: Activity level in constraint 1 is not corrrect.", 1 )
155 Elseif ( abs( 5*xprim(2)-uprim(2) ) > 1.d-7 ) then
156 call flog( "Solve 2: Activity level in constraint 2 is not corrrect.", 1 )
157 Elseif ( abs( xprim(3) - xprim(2) - xprim(1) - uprim(3) ) > 1.d-7 ) then
158 call flog( "Solve 2: Activity level in constraint 3 is not corrrect.", 1 )
159 Else
160 Call checkdual( 'Tria04-Inf', infeasible )
161 endif
162
163 if ( coi_free(cntvect) /= 0 ) call flog( "Error while freeing control vector",1)
164
165 write(*,*)
166 write(*,*) 'End of Tria04 example. Return code=',coi_error
167 call flog( "Successful Solve", 0 )
168
169End Program tria04
170!
171! ============================================================================
172! Define information about the model:
173!
174
175!> Define information about the model
176!!
177!! @include{doc} readMatrix_params.dox
178Integer Function tria_readmatrix( lower, curr, upper, vsta, type, rhs, esta, &
179 colsta, rowno, value, nlflag, n, m, nz, &
180 usrmem )
181#if defined(itl)
182!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_ReadMatrix
183#endif
184 use casedata_num
185 implicit none
186 integer, intent (in) :: n ! number of variables
187 integer, intent (in) :: m ! number of constraints
188 integer, intent (in) :: nz ! number of nonzeros
189 real*8, intent (in out), dimension(n) :: lower ! vector of lower bounds
190 real*8, intent (in out), dimension(n) :: curr ! vector of initial values
191 real*8, intent (in out), dimension(n) :: upper ! vector of upper bounds
192 integer, intent (in out), dimension(n) :: vsta ! vector of initial variable status
193 ! (not defined here)
194 integer, intent (out), dimension(m) :: type ! vector of equation types
195 integer, intent (in out), dimension(m) :: esta ! vector of initial equation status
196 ! (not defined here)
197 real*8, intent (in out), dimension(m) :: rhs ! vector of right hand sides
198 integer, intent (in out), dimension(n+1) :: colsta ! vector with start of column indices
199 integer, intent (out), dimension(nz) :: rowno ! vector of row numbers
200 integer, intent (in out), dimension(nz) :: nlflag ! vector of nonlinearity flags
201 real*8, intent (in out), dimension(nz) :: value ! vector of matrix values
202 real*8 usrmem(*) ! optional user memory
203!
204! Information about Variables:
205! Default: Lower = -Inf, Curr = 0, and Upper = +inf.
206! Default: the status information in Vsta is not used.
207!
208! The model uses defaults, except for the second solve where we have
209! a lower bound on x1
210!
211 If ( casenum == 2 ) lower(1) = 5.0d0
212!
213! Information about Constraints:
214! Default: Rhs = 0
215! Default: the status information in Esta and the function
216! value in FV are not used.
217! Default: Type: There is no default.
218! 0 = Equality,
219! 1 = Greater than or equal,
220! 2 = Less than or equal,
221! 3 = Non binding.
222!
223! Constraint 1: e1
224! Rhs = 5.0 and type Equality
225!
226 rhs(1) = 5.0d0
227 type(1) = 0
228!
229! Constraint 2: e2
230! Rhs = 4.0 and type Equality
231!
232 rhs(2) = 4.0d0
233 type(2) = 0
234!
235! Constraint 3: e3
236! Rhs = 0.0 and type Equality
237!
238 type(3) = 0
239!
240! Information about the Jacobian. We use the standard method with
241! Rowno, Value, Nlflag and Colsta and we do not use Colno.
242!
243! Colsta = Start of column indices (No Defaults):
244! Rowno = Row indices
245! Value = Value of derivative (by default only linear
246! derivatives are used)
247! Nlflag = 0 for linear and 1 for nonlinear derivative
248! (not needed for completely linear models)
249!
250! Indices
251! x(1) x(2) x(3)
252! 1: 1 3
253! 2: 4
254! 3: 2 5 6
255!
256 colsta(1) = 1
257 colsta(2) = 3
258 colsta(3) = 6
259 colsta(4) = 7
260 rowno(1) = 1
261 rowno(2) = 3
262 rowno(3) = 1
263 rowno(4) = 2
264 rowno(5) = 3
265 rowno(6) = 3
266!
267! Nonlinearity Structure: L = 0 are linear and NL = 1 are nonlinear
268! x(1) x(2) x(3)
269! 1: L NL
270! 2: L
271! 3: L L L
272!
273 nlflag(1) = 0
274 nlflag(2) = 0
275 nlflag(3) = 1
276 nlflag(4) = 0
277 nlflag(5) = 0
278 nlflag(6) = 0
279!
280! Value (Linear only)
281! x(1) x(2) x(3)
282! 1: 1.0 NL
283! 2: 5.0
284! 3: -1.0 -1.0 1.0
285!
286 value(1) = 1.d0
287 value(2) = -1.d0
288 value(4) = 5.d0
289 value(5) = -1.d0
290 value(6) = 1.d0
291
292 tria_readmatrix = 0 ! Return value means OK
293
294end Function tria_readmatrix
295!
296!==========================================================================
297! Compute nonlinear terms and non-constant Jacobian elements
298!
299
300!> Compute nonlinear terms and non-constant Jacobian elements
301!!
302!! @include{doc} fdeval_params.dox
303Integer Function tria_fdeval( x, g, jac, rowno, jcnm, mode, ignerr, errcnt, &
304 n, nz, thread, usrmem )
305#if defined(itl)
306!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_FDEval
307#endif
308 implicit none
309 integer, intent (in) :: n ! number of variables
310 integer, intent (in) :: rowno ! number of the row to be evaluated
311 integer, intent (in) :: nz ! number of nonzeros in this row
312 real*8, intent (in), dimension(n) :: x ! vector of current solution values
313 real*8, intent (in out) :: g ! constraint value
314 real*8, intent (in out), dimension(n) :: jac ! vector of derivatives for current constraint
315 integer, intent (in), dimension(nz) :: jcnm ! list of variables that appear nonlinearly
316 ! in this row. Ffor information only.
317 integer, intent (in) :: mode ! evaluation mode: 1 = function value
318 ! 2 = derivatives, 3 = both
319 integer, intent (in) :: ignerr ! if 1 then errors can be ignored as long
320 ! as errcnt is incremented
321 integer, intent (in out) :: errcnt ! error counter to be incremented in case
322 ! of function evaluation errors.
323 integer, intent (in) :: thread
324 real*8 usrmem(*) ! optional user memory
325!
326! Row 1: e1
327!
328 if ( rowno .eq. 1 ) then
329!
330! Mode = 1 or 3. G = sqr(x2)
331!
332 if ( mode .eq. 1 .or. mode .eq. 3 ) then
333 g = x(2)*x(2)
334 endif
335!
336! Mode = 2 or 3: Derivative values:
337!
338 if ( mode .eq. 2 .or. mode .eq. 3 ) then
339 jac(2) = 2.d0*x(2)
340 endif
341 tria_fdeval = 0
342!
343! Row 2 and 3: The rows are linear and will not be called
344!
345 else
346 tria_fdeval = 1
347 endif
348
349end Function tria_fdeval
350
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_triord(mode, type, status, irow, icol, inf, value, resid, usrmem)
Definition comdecl.f90:291
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_triord(cntvect, coi_triord)
define callback routine for providing the triangular order information.
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
real *8, dimension(:), pointer xprim
Definition comdecl.f90:17
real *8, dimension(:), pointer uprim
Definition comdecl.f90:18
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 tria04
Main program. A simple setup and call of CONOPT.
Definition tria04.f90:50