CONOPT
Loading...
Searching...
No Matches
tria01a.f90
Go to the documentation of this file.
1!> @file tria01a.f90
2!! @ingroup FORT1THREAD_EXAMPLES
3!!
4!!
5!! Similar to Tria01 except that FDEval has an error in the Rowno test
6!! and it will therefore return an error that the main program should
7!! detect.
8!!
9!! Triangular Demo model 01
10!!
11!! This is a CONOPT implementation of the GAMS model:
12!!
13!! @verbatim
14!! variable x1, x2, x3 ;
15!! equation e1, e2, e3 ;
16!!
17!! e1 .. x1 + sqr(x2) =e= 5;
18!!
19!! e2 .. 5*x2 =e= 4;
20!!
21!! e3 .. x3 =e= x2 + x1;
22!!
23!! This model is triangular and the solution is known to be unique
24!! even though it is nonlinear. x2 is determined uniquely from e2 and it
25!! is no longer variable when it is used nonlinearly in e1.
26!! CONOPT will therefore return model status = 1 or "Optimal" and
27!! not the usual model status = 2 or "Locally Optimal".
28!!
29!! model tria01 / all /;
30!!
31!! solve tria01 using nlp minimizing x3;
32!! @endverbatim
33!!
34!!
35!! For more information about the individual callbacks, please have a look at the source code.
36
37!> Main program. A simple setup and call of CONOPT
38!!
39Program tria01
40
41 Use proginfo
42 Use coidef
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#if defined(itl)
55!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_ReadMatrix
56!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_FDEval
57!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Status
58!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Solution
59!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Message
60!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_ErrMsg
61#endif
62!
63! Control vector
64!
65 INTEGER :: numcallback
66 INTEGER, Dimension(:), Pointer :: cntvect
67 INTEGER :: coi_error
68
69 call startup
70!
71! Create and initialize a Control Vector
72!
73 numcallback = coidef_size()
74 Allocate( cntvect(numcallback) )
75 coi_error = coidef_inifort( cntvect )
76!
77! Tell CONOPT about the size of the model by populating the Control Vector:
78!
79 coi_error = max( coi_error, coidef_numvar( cntvect, 3 ) ) ! 3 variables
80 coi_error = max( coi_error, coidef_numcon( cntvect, 3 ) ) ! 3 constraints
81 coi_error = max( coi_error, coidef_numnz( cntvect, 6 ) ) ! 6 nonzeros in the Jacobian
82 coi_error = max( coi_error, coidef_numnlnz( cntvect, 1 ) ) ! 1 of which are nonlinear
83 coi_error = max( coi_error, coidef_optdir( cntvect, -1 ) ) ! Minimize
84 coi_error = max( coi_error, coidef_objvar( cntvect, 3 ) ) ! Objective is variable 3
85 coi_error = max( coi_error, coidef_optfile( cntvect, 'tria01a.opt' ) )
86!
87! Tell CONOPT about the callback routines:
88!
89 coi_error = max( coi_error, coidef_readmatrix( cntvect, tria_readmatrix ) )
90 coi_error = max( coi_error, coidef_fdeval( cntvect, tria_fdeval ) )
91 coi_error = max( coi_error, coidef_status( cntvect, std_status ) )
92 coi_error = max( coi_error, coidef_solution( cntvect, std_solution ) )
93 coi_error = max( coi_error, coidef_message( cntvect, std_message ) )
94 coi_error = max( coi_error, coidef_errmsg( cntvect, std_errmsg ) )
95
96#if defined(LICENSE_INT_1) && defined(LICENSE_INT_2) && defined(LICENSE_INT_3) && defined(LICENSE_TEXT)
97 coi_error = max( coi_error, coidef_license( cntvect, license_int_1, license_int_2, license_int_3, 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! Start CONOPT:
108!
109 coi_error = coi_solve( cntvect )
110
111 write(*,*)
112 write(*,*) 'End of Tria01a example. Return code=',coi_error
113
114 If ( coi_error /= -1 ) then
115 call flog( "The expected error return of -1 caused by FDEval was not seen", 1 )
116 endif
117
118 if ( coi_free(cntvect) /= 0 ) call flog( "Error while freeing control vector",1)
119
120 call flog( "Successful Solve", 0 )
121
122End Program tria01
123!
124! ============================================================================
125! Define information about the model:
126!
127
128!> Define information about the model
129!!
130!! @include{doc} readMatrix_params.dox
131Integer Function tria_readmatrix( lower, curr, upper, vsta, type, rhs, esta, &
132 colsta, rowno, value, nlflag, n, m, nz, &
133 usrmem )
134#if defined(itl)
135!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_ReadMatrix
136#endif
137 implicit none
138 integer, intent (in) :: n ! number of variables
139 integer, intent (in) :: m ! number of constraints
140 integer, intent (in) :: nz ! number of nonzeros
141 real*8, intent (in out), dimension(n) :: lower ! vector of lower bounds
142 real*8, intent (in out), dimension(n) :: curr ! vector of initial values
143 real*8, intent (in out), dimension(n) :: upper ! vector of upper bounds
144 integer, intent (in out), dimension(n) :: vsta ! vector of initial variable status
145 ! (not defined here)
146 integer, intent (out), dimension(m) :: type ! vector of equation types
147 integer, intent (in out), dimension(m) :: esta ! vector of initial equation status
148 ! (not defined here)
149 real*8, intent (in out), dimension(m) :: rhs ! vector of right hand sides
150 integer, intent (in out), dimension(n+1) :: colsta ! vector with start of column indices
151 integer, intent (out), dimension(nz) :: rowno ! vector of row numbers
152 integer, intent (in out), dimension(nz) :: nlflag ! vector of nonlinearity flags
153 real*8, intent (in out), dimension(nz) :: value ! vector of matrix values
154 real*8 usrmem(*) ! optional user memory
155!
156! Information about Variables:
157! Default: Lower = -Inf, Curr = 0, and Upper = +inf.
158! Default: the status information in Vsta is not used.
159!
160! The model uses defaults
161!
162! Information about Constraints:
163! Default: Rhs = 0
164! Default: the status information in Esta and the function
165! value in FV are not used.
166! Default: Type: There is no default.
167! 0 = Equality,
168! 1 = Greater than or equal,
169! 2 = Less than or equal,
170! 3 = Non binding.
171!
172! Constraint 1: e1
173! Rhs = 5.0 and type Equality
174!
175 rhs(1) = 5.0d0
176 type(1) = 0
177!
178! Constraint 2: e2
179! Rhs = 4.0 and type Equality
180!
181 rhs(2) = 4.0d0
182 type(2) = 0
183!
184! Constraint 3: e3
185! Rhs = 0.0 and type Equality
186!
187 type(3) = 0
188!
189! Information about the Jacobian. We use the standard method with
190! Rowno, Value, Nlflag and Colsta and we do not use Colno.
191!
192! Colsta = Start of column indices (No Defaults):
193! Rowno = Row indices
194! Value = Value of derivative (by default only linear
195! derivatives are used)
196! Nlflag = 0 for linear and 1 for nonlinear derivative
197! (not needed for completely linear models)
198!
199! Indices
200! x(1) x(2) x(3)
201! 1: 1 3
202! 2: 4
203! 3: 2 5 6
204!
205 colsta(1) = 1
206 colsta(2) = 3
207 colsta(3) = 6
208 colsta(4) = 7
209 rowno(1) = 1
210 rowno(2) = 3
211 rowno(3) = 1
212 rowno(4) = 2
213 rowno(5) = 3
214 rowno(6) = 3
215!
216! Nonlinearity Structure: L = 0 are linear and NL = 1 are nonlinear
217! x(1) x(2) x(3)
218! 1: L NL
219! 2: L
220! 3: L L L
221!
222 nlflag(1) = 0
223 nlflag(2) = 0
224 nlflag(3) = 1
225 nlflag(4) = 0
226 nlflag(5) = 0
227 nlflag(6) = 0
228!
229! Value (Linear only)
230! x(1) x(2) x(3)
231! 1: 1.0 NL
232! 2: 5.0
233! 3: -1.0 -1.0 1.0
234!
235 value(1) = 1.d0
236 value(2) = -1.d0
237 value(4) = 5.d0
238 value(5) = -1.d0
239 value(6) = 1.d0
240
241 tria_readmatrix = 0 ! Return value means OK
242
243end Function tria_readmatrix
244!
245!==========================================================================
246! Compute nonlinear terms and non-constant Jacobian elements
247!
248
249!> Compute nonlinear terms and non-constant Jacobian elements
250!!
251!! @include{doc} fdeval_params.dox
252Integer Function tria_fdeval( x, g, jac, rowno, jcnm, mode, ignerr, errcnt, &
253 n, nz, thread, usrmem )
254#if defined(itl)
255!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_FDEval
256#endif
257 implicit none
258 integer, intent (in) :: n ! number of variables
259 integer, intent (in) :: rowno ! number of the row to be evaluated
260 integer, intent (in) :: nz ! number of nonzeros in this row
261 real*8, intent (in), dimension(n) :: x ! vector of current solution values
262 real*8, intent (in out) :: g ! constraint value
263 real*8, intent (in out), dimension(n) :: jac ! vector of derivatives for current constraint
264 integer, intent (in), dimension(nz) :: jcnm ! list of variables that appear nonlinearly
265 ! in this row. Ffor information only.
266 integer, intent (in) :: mode ! evaluation mode: 1 = function value
267 ! 2 = derivatives, 3 = both
268 integer, intent (in) :: ignerr ! if 1 then errors can be ignored as long
269 ! as errcnt is incremented
270 integer, intent (in out) :: errcnt ! error counter to be incremented in case
271 ! of function evaluation errors.
272 integer, intent (in) :: thread
273 real*8 usrmem(*) ! optional user memory
274!
275! Row 1: e1
276!
277 if ( rowno .eq. 2 ) then ! This is an error and FDeval will return a nonzero value
278!
279! Mode = 1 or 3. G = sqr(x2)
280!
281 if ( mode .eq. 1 .or. mode .eq. 3 ) then
282 g = x(2)*x(2)
283 endif
284!
285! Mode = 2 or 3: Derivative values:
286!
287 if ( mode .eq. 2 .or. mode .eq. 3 ) then
288 jac(2) = 2.d0*x(2)
289 endif
290 tria_fdeval = 0
291!
292! Row 1 and 3: The rows are linear and will not be called
293!
294 else
295 tria_fdeval = 1
296 endif
297
298end 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
integer function std_message(smsg, dmsg, nmsg, llen, usrmem, msgv)
Definition comdecl.f90:203
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_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
subroutine flog(msg, code)
Definition comdecl.f90:56
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