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!> Main program. A simple setup and call of CONOPT
34!!
35Program tria01
36
37 Use proginfo
38 Use coidef
39 implicit None
40!
41! Declare the user callback routines as Integer, External:
42!
43 Integer, External :: tria_readmatrix ! Mandatory Matrix definition routine defined below
44 Integer, External :: tria_fdeval ! Function and Derivative evaluation routine
45 ! needed a nonlinear model.
46 Integer, External :: std_status ! Standard callback for displaying solution status
47 Integer, External :: std_solution ! Standard callback for displaying solution values
48 Integer, External :: std_message ! Standard callback for managing messages
49 Integer, External :: std_errmsg ! Standard callback for managing error messages
50 Integer, External :: std_triord ! Standard callback for triangular order
51#if defined(itl)
52!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_ReadMatrix
53!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_FDEval
54!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Status
55!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Solution
56!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Message
57!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_ErrMsg
58!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_TriOrd
59#endif
60!
61! Control vector
62!
63 INTEGER :: numcallback
64 INTEGER, Dimension(:), Pointer :: cntvect
65 INTEGER :: coi_error
66
67 call startup
68!
69! Create and initialize a Control Vector
70!
71 numcallback = coidef_size()
72 Allocate( cntvect(numcallback) )
73 coi_error = coidef_inifort( cntvect )
74!
75! Tell CONOPT about the size of the model by populating the Control Vector:
76!
77 coi_error = max( coi_error, coidef_numvar( cntvect, 3 ) ) ! 3 variables
78 coi_error = max( coi_error, coidef_numcon( cntvect, 3 ) ) ! 3 constraints
79 coi_error = max( coi_error, coidef_numnz( cntvect, 6 ) ) ! 6 nonzeros in the Jacobian
80 coi_error = max( coi_error, coidef_numnlnz( cntvect, 1 ) ) ! 1 of which are nonlinear
81 coi_error = max( coi_error, coidef_optdir( cntvect, -1 ) ) ! Minimize
82 coi_error = max( coi_error, coidef_objvar( cntvect, 3 ) ) ! Objective is variable 3
83 coi_error = max( coi_error, coidef_optfile( cntvect, 'tria01.opt' ) )
84!
85! Tell CONOPT about the callback routines:
86!
87 coi_error = max( coi_error, coidef_readmatrix( cntvect, tria_readmatrix ) )
88 coi_error = max( coi_error, coidef_fdeval( cntvect, tria_fdeval ) )
89 coi_error = max( coi_error, coidef_status( cntvect, std_status ) )
90 coi_error = max( coi_error, coidef_solution( cntvect, std_solution ) )
91 coi_error = max( coi_error, coidef_message( cntvect, std_message ) )
92 coi_error = max( coi_error, coidef_errmsg( cntvect, std_errmsg ) )
93 coi_error = max( coi_error, coidef_triord( cntvect, std_triord ) )
94
95#if defined(LICENSE_INT_1) && defined(LICENSE_INT_2) && defined(LICENSE_INT_3) && defined(LICENSE_TEXT)
96 coi_error = max( coi_error, coidef_license( cntvect, license_int_1, license_int_2, license_int_3, license_text) )
97#endif
98
99 If ( coi_error .ne. 0 ) THEN
100 write(*,*)
101 write(*,*) '**** Fatal Error while loading CONOPT Callback routines.'
102 write(*,*)
103 call flog( "Skipping Solve due to setup errors", 1 )
104 ENDIF
105!
106! Save the solution so we can check the duals:
107!
108 do_allocate = .true.
109!
110! Start CONOPT:
111!
112 coi_error = coi_solve( cntvect )
113
114 write(*,*)
115 write(*,*) 'End of Tria01 example. Return code=',coi_error
116
117 If ( coi_error /= 0 ) then
118 call flog( "Errors encountered during solution", 1 )
119 elseif ( stacalls == 0 .or. solcalls == 0 ) then
120 call flog( "Status or Solution routine was not called", 1 )
121 elseif ( sstat /= 1 .or. mstat /= 1 ) then
122 call flog( "Solver and Model Status was not as expected (1,1)", 1 )
123 elseif ( abs( obj-5.16d0 ) > 0.000001d0 ) then
124 call flog( "Incorrect objective returned", 1 )
125 Else
126 Call checkdual( 'Tria01', minimize )
127 endif
128
129 if ( coi_free(cntvect) /= 0 ) call flog( "Error while freeing control vector",1)
130
131 call flog( "Successful Solve", 0 )
132
133End Program tria01
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#if defined(itl)
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 defaults
172!
173! Information about Constraints:
174! Default: Rhs = 0
175! Default: the status information in Esta and the function
176! value in FV are not used.
177! Default: Type: There is no default.
178! 0 = Equality,
179! 1 = Greater than or equal,
180! 2 = Less than or equal,
181! 3 = Non binding.
182!
183! Constraint 1: e1
184! Rhs = 5.0 and type Equality
185!
186 rhs(1) = 5.0d0
187 type(1) = 0
188!
189! Constraint 2: e2
190! Rhs = 4.0 and type Equality
191!
192 rhs(2) = 4.0d0
193 type(2) = 0
194!
195! Constraint 3: e3
196! Rhs = 0.0 and type Equality
197!
198 type(3) = 0
199!
200! Information about the Jacobian. We use the standard method with
201! Rowno, Value, Nlflag and Colsta and we do not use Colno.
202!
203! Colsta = Start of column indices (No Defaults):
204! Rowno = Row indices
205! Value = Value of derivative (by default only linear
206! derivatives are used)
207! Nlflag = 0 for linear and 1 for nonlinear derivative
208! (not needed for completely linear models)
209!
210! Indices
211! x(1) x(2) x(3)
212! 1: 1 3
213! 2: 4
214! 3: 2 5 6
215!
216 colsta(1) = 1
217 colsta(2) = 3
218 colsta(3) = 6
219 colsta(4) = 7
220 rowno(1) = 1
221 rowno(2) = 3
222 rowno(3) = 1
223 rowno(4) = 2
224 rowno(5) = 3
225 rowno(6) = 3
226!
227! Nonlinearity Structure: L = 0 are linear and NL = 1 are nonlinear
228! x(1) x(2) x(3)
229! 1: L NL
230! 2: L
231! 3: L L L
232!
233 nlflag(1) = 0
234 nlflag(2) = 0
235 nlflag(3) = 1
236 nlflag(4) = 0
237 nlflag(5) = 0
238 nlflag(6) = 0
239!
240! Value (Linear only)
241! x(1) x(2) x(3)
242! 1: 1.0 NL
243! 2: 5.0
244! 3: -1.0 -1.0 1.0
245!
246 value(1) = 1.d0
247 value(2) = -1.d0
248 value(4) = 5.d0
249 value(5) = -1.d0
250 value(6) = 1.d0
251
252 tria_readmatrix = 0 ! Return value means OK
253
254end Function tria_readmatrix
255!
256!==========================================================================
257! Compute nonlinear terms and non-constant Jacobian elements
258!
259
260!> Compute nonlinear terms and non-constant Jacobian elements
261!!
262!! @include{doc} fdeval_params.dox
263Integer Function tria_fdeval( x, g, jac, rowno, jcnm, mode, ignerr, errcnt, &
264 n, nz, thread, usrmem )
265#if defined(itl)
266!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_FDEval
267#endif
268 implicit none
269 integer, intent (in) :: n ! number of variables
270 integer, intent (in) :: rowno ! number of the row to be evaluated
271 integer, intent (in) :: nz ! number of nonzeros in this row
272 real*8, intent (in), dimension(n) :: x ! vector of current solution values
273 real*8, intent (in out) :: g ! constraint value
274 real*8, intent (in out), dimension(n) :: jac ! vector of derivatives for current constraint
275 integer, intent (in), dimension(nz) :: jcnm ! list of variables that appear nonlinearly
276 ! in this row. Ffor information only.
277 integer, intent (in) :: mode ! evaluation mode: 1 = function value
278 ! 2 = derivatives, 3 = both
279 integer, intent (in) :: ignerr ! if 1 then errors can be ignored as long
280 ! as errcnt is incremented
281 integer, intent (in out) :: errcnt ! error counter to be incremented in case
282 ! of function evaluation errors.
283 integer, intent (in) :: thread
284 real*8 usrmem(*) ! optional user memory
285!
286! Row 1: e1
287!
288 if ( rowno .eq. 1 ) then
289!
290! Mode = 1 or 3. G = sqr(x2)
291!
292 if ( mode .eq. 1 .or. mode .eq. 3 ) then
293 g = x(2)*x(2)
294 endif
295!
296! Mode = 2 or 3: Derivative values:
297!
298 if ( mode .eq. 2 .or. mode .eq. 3 ) then
299 jac(2) = 2.d0*x(2)
300 endif
301 tria_fdeval = 0
302!
303! Row 2 and 3: The rows are linear and will not be called
304!
305 else
306 tria_fdeval = 1
307 endif
308
309end 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_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 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 tria01
Main program. A simple setup and call of CONOPT.
Definition tria01.f90:35