CONOPT
Loading...
Searching...
No Matches
tria01.f90
Go to the documentation of this file.
1!> @file tria01.f90
2!! @ingroup FORT1THREAD_EXAMPLES
3!!
4!!
5!! Triangular Demo model 01
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!!
19!! This model is triangular and the solution is known to be unique
20!! even though it is nonlinear. x2 is determined uniquely from e2 and it
21!! is no longer variable when it is used non-linearly in e1.
22!! CONOPT will therefore return model status = 1 or "Optimal" and
23!! not the usual model status = 2 or "Locally Optimal".
24!!
25!! model tria01 / all /;
26!!
27!! solve tria01 using nlp minimizing x3;
28!! @endverbatim
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 tria01
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 ) ) ! 3 variables
79 coi_error = max( coi_error, coidef_numcon( cntvect, 3 ) ) ! 3 constraints
80 coi_error = max( coi_error, coidef_numnz( cntvect, 6 ) ) ! 6 nonzeros in the Jacobian
81 coi_error = max( coi_error, coidef_numnlnz( cntvect, 1 ) ) ! 1 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, 'tria01.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 Tria01 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 /= 1 ) then
123 call flog( "Solver and Model Status was not as expected (1,1)", 1 )
124 elseif ( abs( obj-5.16d0 ) > 0.000001d0 ) then
125 call flog( "Incorrect objective returned", 1 )
126 Else
127 Call checkdual( 'Tria01', minimize )
128 endif
129
130 if ( coi_free(cntvect) /= 0 ) call flog( "Error while freeing control vector",1)
131
132 call flog( "Successful Solve", 0 )
133!
134! Free solution memory
135!
136 call finalize
138End Program tria01
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 defaults
177!
178! Information about Constraints:
179! Default: Rhs = 0
180! Default: the status information in Esta and the function
181! value in FV are not used.
182! Default: Type: There is no default.
183! 0 = Equality,
184! 1 = Greater than or equal,
185! 2 = Less than or equal,
186! 3 = Non binding.
187!
188! Constraint 1: e1
189! Rhs = 5.0 and type Equality
190!
191 rhs(1) = 5.0d0
192 type(1) = 0
193!
194! Constraint 2: e2
195! Rhs = 4.0 and type Equality
196!
197 rhs(2) = 4.0d0
198 type(2) = 0
199!
200! Constraint 3: e3
201! Rhs = 0.0 and type Equality
202!
203 type(3) = 0
204!
205! Information about the Jacobian. CONOPT expects a columnwise
206! representation in Rowno, Value, Nlflag and Colsta.
207!
208! Colsta = Start of column indices (No Defaults):
209! Rowno = Row indices
210! Value = Value of derivative (by default only linear
211! derivatives are used)
212! Nlflag = 0 for linear and 1 for nonlinear derivative
213! (not needed for completely linear models)
214!
215! Indices
216! x(1) x(2) x(3)
217! 1: 1 3
218! 2: 4
219! 3: 2 5 6
220!
221 colsta(1) = 1
222 colsta(2) = 3
223 colsta(3) = 6
224 colsta(4) = 7
225 rowno(1) = 1
226 rowno(2) = 3
227 rowno(3) = 1
228 rowno(4) = 2
229 rowno(5) = 3
230 rowno(6) = 3
231!
232! Nonlinearity Structure: L = 0 are linear and NL = 1 are nonlinear
233! x(1) x(2) x(3)
234! 1: L NL
235! 2: L
236! 3: L L L
237!
238 nlflag(1) = 0
239 nlflag(2) = 0
240 nlflag(3) = 1
241 nlflag(4) = 0
242 nlflag(5) = 0
243 nlflag(6) = 0
244!
245! Value (Linear only)
246! x(1) x(2) x(3)
247! 1: 1.0 NL
248! 2: 5.0
249! 3: -1.0 -1.0 1.0
250!
251 value(1) = 1.d0
252 value(2) = -1.d0
253 value(4) = 5.d0
254 value(5) = -1.d0
255 value(6) = 1.d0
256
257 tria_readmatrix = 0 ! Return value means OK
258
259end Function tria_readmatrix
260!
261!==========================================================================
262! Compute nonlinear terms and non-constant Jacobian elements
263!
264
265!> Compute nonlinear terms and non-constant Jacobian elements
266!!
267!! @include{doc} fdeval_params.dox
268Integer Function tria_fdeval( x, g, jac, rowno, jcnm, mode, ignerr, errcnt, &
269 n, nz, thread, usrmem )
270#ifdef dec_directives_win32
271!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_FDEval
272#endif
273 implicit none
274 integer, intent (in) :: n ! number of variables
275 integer, intent (in) :: rowno ! number of the row to be evaluated
276 integer, intent (in) :: nz ! number of nonzeros in this row
277 real*8, intent (in), dimension(n) :: x ! vector of current solution values
278 real*8, intent (in out) :: g ! constraint value
279 real*8, intent (in out), dimension(n) :: jac ! vector of derivatives for current constraint
280 integer, intent (in), dimension(nz) :: jcnm ! list of variables that appear nonlinearly
281 ! in this row. Ffor information only.
282 integer, intent (in) :: mode ! evaluation mode: 1 = function value
283 ! 2 = derivatives, 3 = both
284 integer, intent (in) :: ignerr ! if 1 then errors can be ignored as long
285 ! as errcnt is incremented
286 integer, intent (in out) :: errcnt ! error counter to be incremented in case
287 ! of function evaluation errors.
288 integer, intent (in) :: thread
289 real*8 usrmem(*) ! optional user memory
290!
291! Row 1: e1
292!
293 if ( rowno .eq. 1 ) then
294!
295! Mode = 1 or 3. G = sqr(x2)
296!
297 if ( mode .eq. 1 .or. mode .eq. 3 ) then
298 g = x(2)*x(2)
299 endif
300!
301! Mode = 2 or 3: Derivative values:
302!
303 if ( mode .eq. 2 .or. mode .eq. 3 ) then
304 jac(2) = 2.d0*x(2)
305 endif
306 tria_fdeval = 0
307!
308! Row 2 and 3: The rows are linear and will not be called
309!
310 else
311 tria_fdeval = 1
312 endif
313
314end Function tria_fdeval
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 minimize
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 tria01
Main program. A simple setup and call of CONOPT.
Definition tria01.f90:41