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!> Main program. A simple setup and call of CONOPT
34!!
35Program triabad07
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 ) ) ! # variables
78 coi_error = max( coi_error, coidef_numcon( cntvect, 5 ) ) ! # constraints
79 coi_error = max( coi_error, coidef_numnz( cntvect, 9 ) ) ! # nonzeros in the Jacobian
80 coi_error = max( coi_error, coidef_numnlnz( cntvect, 6 ) ) ! # 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, 'triabad07.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 Triabad07 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 /= 5 ) then
122 call flog( "Solver and Model Status was not as expected (1,5)", 1 )
123! No objective test for infeasible model
124 Else
125 Call checkdual( 'Triabad07', infeasible )
126 endif
127
128 if ( coi_free(cntvect) /= 0 ) call flog( "Error while freeing control vector",1)
129
130 call flog( "Successful Solve", 0 )
131
132End Program triabad07
133!
134! ============================================================================
135! Define information about the model:
136!
137
138!> Define information about the model
139!!
140!! @include{doc} readMatrix_params.dox
141Integer Function tria_readmatrix( lower, curr, upper, vsta, type, rhs, esta, &
142 colsta, rowno, value, nlflag, n, m, nz, &
143 usrmem )
144#if defined(itl)
145!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_ReadMatrix
146#endif
147 implicit none
148 integer, intent (in) :: n ! number of variables
149 integer, intent (in) :: m ! number of constraints
150 integer, intent (in) :: nz ! number of nonzeros
151 real*8, intent (in out), dimension(n) :: lower ! vector of lower bounds
152 real*8, intent (in out), dimension(n) :: curr ! vector of initial values
153 real*8, intent (in out), dimension(n) :: upper ! vector of upper bounds
154 integer, intent (in out), dimension(n) :: vsta ! vector of initial variable status
155 ! (not defined here)
156 integer, intent (out), dimension(m) :: type ! vector of equation types
157 integer, intent (in out), dimension(m) :: esta ! vector of initial equation status
158 ! (not defined here)
159 real*8, intent (in out), dimension(m) :: rhs ! vector of right hand sides
160 integer, intent (in out), dimension(n+1) :: colsta ! vector with start of column indices
161 integer, intent (out), dimension(nz) :: rowno ! vector of row numbers
162 integer, intent (in out), dimension(nz) :: nlflag ! vector of nonlinearity flags
163 real*8, intent (in out), dimension(nz) :: value ! vector of matrix values
164 real*8 usrmem(*) ! optional user memory
165!
166! Information about Variables:
167! Default: Lower = -Inf, Curr = 0, and Upper = +inf.
168! Default: the status information in Vsta is not used.
169!
170! The model uses initial values for x1 and x2
171!
172 curr(1) = 0.99d0
173 curr(2) = 0.70d0
174!
175! Information about Constraints:
176! Default: Rhs = 0
177! Default: the status information in Esta and the function
178! value in FV are not used.
179! Default: Type: There is no default.
180! 0 = Equality,
181! 1 = Greater than or equal,
182! 2 = Less than or equal,
183! 3 = Non binding.
184!
185! Constraint 1: e1
186! Rhs = 1.0 and type Equality
187!
188 rhs(1) = 1.0d0
189 type(1) = 0
190!
191! Constraint 2: e2
192! Rhs = 1.0 and type Equality
193!
194 rhs(2) = 1.0d0
195 type(2) = 0
196!
197! Constraint 3: e3
198! Rhs = 4.0 and type Equality
199!
200 rhs(3) = 4.0d0
201 type(3) = 0
202!
203! Constraint 4: e4
204! Rhs = 3.5 and type Equality
205!
206 rhs(4) = 3.5d0
207 type(4) = 0
208!
209! Constraint 5: e5
210! Rhs = 0.0 and type Equality
211!
212 type(5) = 0
213!
214! Information about the Jacobian. We use the standard method with
215! Rowno, Value, Nlflag and Colsta and we do not use Colno.
216!
217! Colsta = Start of column indices (No Defaults):
218! Rowno = Row indices
219! Value = Value of derivative (by default only linear
220! derivatives are used)
221! Nlflag = 0 for linear and 1 for nonlinear derivative
222! (not needed for completely linear models)
223!
224! Indices
225! x(1) x(2) x(3)
226! 1: 1
227! 2: 5
228! 3: 2 6
229! 4: 3 7
230! 5: 4 8 9
231!
232 colsta(1) = 1
233 colsta(2) = 5
234 colsta(3) = 9
235 colsta(4) = 10
236 rowno(1) = 1
237 rowno(2) = 3
238 rowno(3) = 4
239 rowno(4) = 5
240 rowno(5) = 2
241 rowno(6) = 3
242 rowno(7) = 4
243 rowno(8) = 5
244 rowno(9) = 5
245!
246! Nonlinearity Structure: L = 0 are linear and NL = 1 are nonlinear
247! x(1) x(2) x(3)
248! 1: NL
249! 2: NL
250! 3: NL L
251! 4: NL L
252! 5: NL NL L
253!
254 nlflag(1) = 1
255 nlflag(2) = 1
256 nlflag(3) = 1
257 nlflag(4) = 1
258 nlflag(5) = 1
259 nlflag(6) = 0
260 nlflag(7) = 0
261 nlflag(8) = 1
262 nlflag(9) = 0
263!
264! Value (Linear only)
265! x(1) x(2) x(3)
266! 1: NL
267! 2: NL
268! 3: NL 3.0
269! 4: NL 1.0
270! 5: NL NL 1.0
271!
272 value(6) = 1.d0
273 value(7) = 1.d0
274 value(9) = 1.d0
275
276 tria_readmatrix = 0 ! Return value means OK
277
278end Function tria_readmatrix
279!
280!==========================================================================
281! Compute nonlinear terms and non-constant Jacobian elements
282!
283
284!> Compute nonlinear terms and non-constant Jacobian elements
285!!
286!! @include{doc} fdeval_params.dox
287Integer Function tria_fdeval( x, g, jac, rowno, jcnm, mode, ignerr, errcnt, &
288 n, nz, thread, usrmem )
289#if defined(itl)
290!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_FDEval
291#endif
292 implicit none
293 integer, intent (in) :: n ! number of variables
294 integer, intent (in) :: rowno ! number of the row to be evaluated
295 integer, intent (in) :: nz ! number of nonzeros in this row
296 real*8, intent (in), dimension(n) :: x ! vector of current solution values
297 real*8, intent (in out) :: g ! constraint value
298 real*8, intent (in out), dimension(n) :: jac ! vector of derivatives for current constraint
299 integer, intent (in), dimension(nz) :: jcnm ! list of variables that appear nonlinearly
300 ! in this row. Ffor information only.
301 integer, intent (in) :: mode ! evaluation mode: 1 = function value
302 ! 2 = derivatives, 3 = both
303 integer, intent (in) :: ignerr ! if 1 then errors can be ignored as long
304 ! as errcnt is incremented
305 integer, intent (in out) :: errcnt ! error counter to be incremented in case
306 ! of function evaluation errors.
307 integer, intent (in) :: thread
308 real*8 usrmem(*) ! optional user memory
309!
310! Row 1: e1 .. sqr(x1) =E= 1;
311!
312 if ( rowno == 1 ) then
313!
314! Mode = 1 or 3. G = sqr(x1)
315!
316 if ( mode == 1 .or. mode == 3 ) then
317 g = x(1)*x(1)
318 endif
319!
320! Mode = 2 or 3: Derivative values:
321!
322 if ( mode .eq. 2 .or. mode .eq. 3 ) then
323 jac(1) = 2.d0*x(1)
324 endif
325 tria_fdeval = 0
326 else if ( rowno == 2 ) then
327!
328! e2 .. sqr(x2) =E= 1;
329!
330 if ( mode == 1 .or. mode == 3 ) then
331 g = x(2)*x(2)
332 endif
333 if ( mode .eq. 2 .or. mode .eq. 3 ) then
334 jac(2) = 2.d0*x(2)
335 endif
336 tria_fdeval = 0
337 else if ( rowno == 3 .or. rowno == 4 ) then
338!
339! e3 .. sqr(x1) + x2 =E= 3;
340! e4 .. sqr(x1) + x2 =E= 3.5;
341! These row have the same nonlinear term and they are implemented
342! together
343!
344 if ( mode == 1 .or. mode == 3 ) then
345 g = x(1)*x(1)
346 endif
347 if ( mode .eq. 2 .or. mode .eq. 3 ) then
348 jac(1) = 2.d0*x(1)
349 endif
350 tria_fdeval = 0
351 else if ( rowno == 5 ) then
352!
353! e5 .. x3 =E= sqr(x1 + x2);
354!
355 if ( mode == 1 .or. mode == 3 ) then
356 g = -(x(1)+x(2))*(x(1)+x(2))
357 endif
358 if ( mode .eq. 2 .or. mode .eq. 3 ) then
359 jac(1) = -2.d0*(x(1)+x(2))
360 jac(2) = jac(1)
361 endif
362 tria_fdeval = 0
363 else
364 tria_fdeval = 1
365 endif
366
367end Function tria_fdeval
368
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
integer solcalls
Definition comdecl.f90:9
integer sstat
Definition comdecl.f90:12
integer, parameter infeasible
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 triabad07
Main program. A simple setup and call of CONOPT.
Definition triabad07.f90:35