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#if defined(_WIN32) && !defined(_WIN64)
38#define dec_directives_win32
39#endif
40
41!> Main program. A simple setup and call of CONOPT
42!!
43Program tria01
44
46 Use conopt
47 implicit None
48!
49! Declare the user callback routines as Integer, External:
50!
51 Integer, External :: tria_readmatrix ! Mandatory Matrix definition routine defined below
52 Integer, External :: tria_fdeval ! Function and Derivative evaluation routine
53 ! needed a nonlinear model.
54 Integer, External :: std_status ! Standard callback for displaying solution status
55 Integer, External :: std_solution ! Standard callback for displaying solution values
56 Integer, External :: std_message ! Standard callback for managing messages
57 Integer, External :: std_errmsg ! Standard callback for managing error messages
58#ifdef dec_directives_win32
59!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_ReadMatrix
60!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_FDEval
61!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Status
62!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Solution
63!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Message
64!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_ErrMsg
65#endif
66!
67! Control vector
68!
69 INTEGER, Dimension(:), Pointer :: cntvect
70 INTEGER :: coi_error
71
72 call startup
73!
74! Create and initialize a Control Vector
75!
76 coi_error = coi_create( cntvect )
77!
78! Tell CONOPT about the size of the model by populating the Control Vector:
79!
80 coi_error = max( coi_error, coidef_numvar( cntvect, 3 ) ) ! 3 variables
81 coi_error = max( coi_error, coidef_numcon( cntvect, 3 ) ) ! 3 constraints
82 coi_error = max( coi_error, coidef_numnz( cntvect, 6 ) ) ! 6 nonzeros in the Jacobian
83 coi_error = max( coi_error, coidef_numnlnz( cntvect, 1 ) ) ! 1 of which are nonlinear
84 coi_error = max( coi_error, coidef_optdir( cntvect, -1 ) ) ! Minimize
85 coi_error = max( coi_error, coidef_objvar( cntvect, 3 ) ) ! Objective is variable 3
86 coi_error = max( coi_error, coidef_optfile( cntvect, 'tria01a.opt' ) )
87!
88! Tell CONOPT about the callback routines:
89!
90 coi_error = max( coi_error, coidef_readmatrix( cntvect, tria_readmatrix ) )
91 coi_error = max( coi_error, coidef_fdeval( cntvect, tria_fdeval ) )
92 coi_error = max( coi_error, coidef_status( cntvect, std_status ) )
93 coi_error = max( coi_error, coidef_solution( cntvect, std_solution ) )
94 coi_error = max( coi_error, coidef_message( cntvect, std_message ) )
95 coi_error = max( coi_error, coidef_errmsg( cntvect, std_errmsg ) )
96
97#if defined(CONOPT_LICENSE_INT_1) && defined(CONOPT_LICENSE_INT_2) && defined(CONOPT_LICENSE_INT_3) && defined(CONOPT_LICENSE_TEXT)
98 coi_error = max( coi_error, coidef_license( cntvect, conopt_license_int_1, conopt_license_int_2, conopt_license_int_3, conopt_license_text) )
99#endif
100
101 If ( coi_error .ne. 0 ) THEN
102 write(*,*)
103 write(*,*) '**** Fatal Error while loading CONOPT Callback routines.'
104 write(*,*)
105 call flog( "Skipping Solve due to setup errors", 1 )
106 ENDIF
107!
108! Start CONOPT:
109!
110 coi_error = coi_solve( cntvect )
111
112 write(*,*)
113 write(*,*) 'End of Tria01a example. Return code=',coi_error
114
115 If ( coi_error /= -1 ) then
116 call flog( "The expected error return of -1 caused by FDEval was not seen", 1 )
117 endif
118
119 if ( coi_free(cntvect) /= 0 ) call flog( "Error while freeing control vector",1)
120
121 call flog( "Successful Solve", 0 )
122!
123! Free solution memory
124!
125 call finalize
126
127End Program tria01
128!
129! ============================================================================
130! Define information about the model:
131!
132
133!> Define information about the model
134!!
135!! @include{doc} readMatrix_params.dox
136Integer Function tria_readmatrix( lower, curr, upper, vsta, type, rhs, esta, &
137 colsta, rowno, value, nlflag, n, m, nz, &
138 usrmem )
139#ifdef dec_directives_win32
140!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_ReadMatrix
141#endif
142 implicit none
143 integer, intent (in) :: n ! number of variables
144 integer, intent (in) :: m ! number of constraints
145 integer, intent (in) :: nz ! number of nonzeros
146 real*8, intent (in out), dimension(n) :: lower ! vector of lower bounds
147 real*8, intent (in out), dimension(n) :: curr ! vector of initial values
148 real*8, intent (in out), dimension(n) :: upper ! vector of upper bounds
149 integer, intent (in out), dimension(n) :: vsta ! vector of initial variable status
150 ! (not defined here)
151 integer, intent (out), dimension(m) :: type ! vector of equation types
152 integer, intent (in out), dimension(m) :: esta ! vector of initial equation status
153 ! (not defined here)
154 real*8, intent (in out), dimension(m) :: rhs ! vector of right hand sides
155 integer, intent (in out), dimension(n+1) :: colsta ! vector with start of column indices
156 integer, intent (out), dimension(nz) :: rowno ! vector of row numbers
157 integer, intent (in out), dimension(nz) :: nlflag ! vector of nonlinearity flags
158 real*8, intent (in out), dimension(nz) :: value ! vector of matrix values
159 real*8 usrmem(*) ! optional user memory
160!
161! Information about Variables:
162! Default: Lower = -Inf, Curr = 0, and Upper = +inf.
163! Default: the status information in Vsta is not used.
164!
165! The model uses defaults
166!
167! Information about Constraints:
168! Default: Rhs = 0
169! Default: the status information in Esta and the function
170! value in FV are not used.
171! Default: Type: There is no default.
172! 0 = Equality,
173! 1 = Greater than or equal,
174! 2 = Less than or equal,
175! 3 = Non binding.
176!
177! Constraint 1: e1
178! Rhs = 5.0 and type Equality
179!
180 rhs(1) = 5.0d0
181 type(1) = 0
182!
183! Constraint 2: e2
184! Rhs = 4.0 and type Equality
185!
186 rhs(2) = 4.0d0
187 type(2) = 0
188!
189! Constraint 3: e3
190! Rhs = 0.0 and type Equality
191!
192 type(3) = 0
193!
194! Information about the Jacobian. CONOPT expects a columnwise
195! representation in Rowno, Value, Nlflag and Colsta.
196!
197! Colsta = Start of column indices (No Defaults):
198! Rowno = Row indices
199! Value = Value of derivative (by default only linear
200! derivatives are used)
201! Nlflag = 0 for linear and 1 for nonlinear derivative
202! (not needed for completely linear models)
203!
204! Indices
205! x(1) x(2) x(3)
206! 1: 1 3
207! 2: 4
208! 3: 2 5 6
209!
210 colsta(1) = 1
211 colsta(2) = 3
212 colsta(3) = 6
213 colsta(4) = 7
214 rowno(1) = 1
215 rowno(2) = 3
216 rowno(3) = 1
217 rowno(4) = 2
218 rowno(5) = 3
219 rowno(6) = 3
220!
221! Nonlinearity Structure: L = 0 are linear and NL = 1 are nonlinear
222! x(1) x(2) x(3)
223! 1: L NL
224! 2: L
225! 3: L L L
226!
227 nlflag(1) = 0
228 nlflag(2) = 0
229 nlflag(3) = 1
230 nlflag(4) = 0
231 nlflag(5) = 0
232 nlflag(6) = 0
233!
234! Value (Linear only)
235! x(1) x(2) x(3)
236! 1: 1.0 NL
237! 2: 5.0
238! 3: -1.0 -1.0 1.0
239!
240 value(1) = 1.d0
241 value(2) = -1.d0
242 value(4) = 5.d0
243 value(5) = -1.d0
244 value(6) = 1.d0
246 tria_readmatrix = 0 ! Return value means OK
247
248end Function tria_readmatrix
249!
250!==========================================================================
251! Compute nonlinear terms and non-constant Jacobian elements
252!
253
254!> Compute nonlinear terms and non-constant Jacobian elements
255!!
256!! @include{doc} fdeval_params.dox
257Integer Function tria_fdeval( x, g, jac, rowno, jcnm, mode, ignerr, errcnt, &
258 n, nz, thread, usrmem )
259#ifdef dec_directives_win32
260!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Tria_FDEval
261#endif
262 implicit none
263 integer, intent (in) :: n ! number of variables
264 integer, intent (in) :: rowno ! number of the row to be evaluated
265 integer, intent (in) :: nz ! number of nonzeros in this row
266 real*8, intent (in), dimension(n) :: x ! vector of current solution values
267 real*8, intent (in out) :: g ! constraint value
268 real*8, intent (in out), dimension(n) :: jac ! vector of derivatives for current constraint
269 integer, intent (in), dimension(nz) :: jcnm ! list of variables that appear nonlinearly
270 ! in this row. Ffor information only.
271 integer, intent (in) :: mode ! evaluation mode: 1 = function value
272 ! 2 = derivatives, 3 = both
273 integer, intent (in) :: ignerr ! if 1 then errors can be ignored as long
274 ! as errcnt is incremented
275 integer, intent (in out) :: errcnt ! error counter to be incremented in case
276 ! of function evaluation errors.
277 integer, intent (in) :: thread
278 real*8 usrmem(*) ! optional user memory
279!
280! Row 1: e1
281!
282 if ( rowno .eq. 2 ) then ! This is an error and FDeval will return a nonzero value
283!
284! Mode = 1 or 3. G = sqr(x2)
285!
286 if ( mode .eq. 1 .or. mode .eq. 3 ) then
287 g = x(2)*x(2)
288 endif
289!
290! Mode = 2 or 3: Derivative values:
291!
292 if ( mode .eq. 2 .or. mode .eq. 3 ) then
293 jac(2) = 2.d0*x(2)
294 endif
295 tria_fdeval = 0
296!
297! Row 1 and 3: The rows are linear and will not be called
298!
299 else
300 tria_fdeval = 1
301 endif
302
303end 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
integer function std_message(smsg, dmsg, nmsg, llen, usrmem, msgv)
Definition comdecl.f90:243
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_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
subroutine finalize
Definition comdecl.f90:79
subroutine flog(msg, code)
Definition comdecl.f90:62
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