CONOPT
Loading...
Searching...
No Matches
mono02.f90
Go to the documentation of this file.
1!> @file mono02.f90
2!! @ingroup FORT1THREAD_EXAMPLES
3!!
4!!
5!! Monotone function to bound conversion example 02
6!!
7!! Note that without the lower bound on x1 the log function is not
8!! monotone and the inequality is not converted into a bound.
9!!
10!! This is a CONOPT implementation of the GAMS model:
11!!
12!! @verbatim
13!! variable x1
14!! equation e1;
15!!
16!! e1 .. log(x1) =G= -2;
17!!
18!! x1.l = 1;
19!! x1.lo = 1.e-9
20!! model mono / all /;
21!! Option domlim = 1000;
22!! solve mono using nlp minimizing x1;
23!! @endverbatim
24!!
25!!
26!!
27!! For more information about the individual callbacks, please have a look at the source code.
28
29!> Main program. A simple setup and call of CONOPT
30!!
31Program mono02
32
33 Use proginfo
34 Use coidef
35 implicit None
36!
37! Declare the user callback routines as Integer, External:
38!
39 Integer, External :: mono_readmatrix ! Mandatory Matrix definition routine defined below
40 Integer, External :: mono_fdeval ! Function and Derivative evaluation routine
41 ! needed a nonlinear model.
42 Integer, External :: mono_fdinterval ! Function and Derivative evaluation routine
43 ! needed a nonlinear model.
44 Integer, External :: std_status ! Standard callback for displaying solution status
45 Integer, External :: std_solution ! Standard callback for displaying solution values
46 Integer, External :: std_message ! Standard callback for managing messages
47 Integer, External :: std_errmsg ! Standard callback for managing error messages
48 Integer, External :: std_triord ! Standard callback for Monongular order
49#if defined(itl)
50!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Mono_ReadMatrix
51!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Mono_FDEval
52!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Mono_FDInterval
53!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Status
54!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Solution
55!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Message
56!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_ErrMsg
57!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_TriOrd
58#endif
59!
60! Control vector
61!
62 INTEGER :: numcallback
63 INTEGER, Dimension(:), Pointer :: cntvect
64 INTEGER :: coi_error
65
66 call startup
67!
68! Create and initialize a Control Vector
69!
70 numcallback = coidef_size()
71 Allocate( cntvect(numcallback) )
72 coi_error = coidef_inifort( cntvect )
73!
74! Tell CONOPT about the size of the model by populating the Control Vector:
75!
76 coi_error = max( coi_error, coidef_numvar( cntvect, 1 ) ) ! # variables
77 coi_error = max( coi_error, coidef_numcon( cntvect, 1 ) ) ! # constraints
78 coi_error = max( coi_error, coidef_numnz( cntvect, 1 ) ) ! # nonzeros in the Jacobian
79 coi_error = max( coi_error, coidef_numnlnz( cntvect, 1 ) ) ! # of which are nonlinear
80 coi_error = max( coi_error, coidef_optdir( cntvect, -1 ) ) ! Minimize
81 coi_error = max( coi_error, coidef_objvar( cntvect, 1 ) ) ! Objective is variable 3
82 coi_error = max( coi_error, coidef_optfile( cntvect, 'Mono02.opt' ) )
83!
84! Tell CONOPT about the callback routines:
85!
86 coi_error = max( coi_error, coidef_readmatrix( cntvect, mono_readmatrix ) )
87 coi_error = max( coi_error, coidef_fdeval( cntvect, mono_fdeval ) )
88 coi_error = max( coi_error, coidef_fdinterval( cntvect, mono_fdinterval ) )
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 Mono02 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-exp(-2.0d0) ) > 0.000001d0 ) then
124 call flog( "Incorrect objective returned", 1 )
125 Else
126 Call checkdual( 'Mono02', 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 mono02
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 mono_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 :: Mono_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 = -2.0 and type Greater than or Equal
185!
186 rhs(1) = -2.0d0
187 type(1) = 1
188!
189 lower(1) = 1.0d-9
190 curr(1) = 1.0d0
191!
192! Information about the Jacobian. We use the standard method with
193! Rowno, Value, Nlflag and Colsta and we do not use Colno.
194!
195! Colsta = Start of column indices (No Defaults):
196! Rowno = Row indices
197! Value = Value of derivative (by default only linear
198! derivatives are used)
199! Nlflag = 0 for linear and 1 for nonlinear derivative
200! (not needed for completely linear models)
201!
202! Indices
203! x(1)
204! 1: 1
205!
206 colsta(1) = 1
207 colsta(2) = 2
208 rowno(1) = 1
209!
210! Nonlinearity Structure: L = 0 are linear and NL = 1 are nonlinear
211! x(1)
212! 1: NL
213!
214 nlflag(1) = 1
215!
216! Value (Linear only)
217! x(1)
218! 1: NL
219!
220 mono_readmatrix = 0 ! Return value means OK
221
222end Function mono_readmatrix
223!
224!==========================================================================
225! Compute nonlinear terms and non-constant Jacobian elements
226!
227
228!> Compute nonlinear terms and non-constant Jacobian elements
229!!
230!! @include{doc} fdeval_params.dox
231Integer Function mono_fdeval( x, g, jac, rowno, jcnm, mode, ignerr, errcnt, &
232 n, nz, thread, usrmem )
233#if defined(itl)
234!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Mono_FDEval
235#endif
236 implicit none
237 integer, intent (in) :: n ! number of variables
238 integer, intent (in) :: rowno ! number of the row to be evaluated
239 integer, intent (in) :: nz ! number of nonzeros in this row
240 real*8, intent (in), dimension(n) :: x ! vector of current solution values
241 real*8, intent (in out) :: g ! constraint value
242 real*8, intent (in out), dimension(n) :: jac ! vector of derivatives for current constraint
243 integer, intent (in), dimension(nz) :: jcnm ! list of variables that appear nonlinearly
244 ! in this row. Ffor information only.
245 integer, intent (in) :: mode ! evaluation mode: 1 = function value
246 ! 2 = derivatives, 3 = both
247 integer, intent (in) :: ignerr ! if 1 then errors can be ignored as long
248 ! as errcnt is incremented
249 integer, intent (in out) :: errcnt ! error counter to be incremented in case
250 ! of function evaluation errors.
251 integer, intent (in) :: thread
252 real*8 usrmem(*) ! optional user memory
253!
254! Report an error for bad points
255!
256 mono_fdeval = 0 ! OK unless error found later
257 If ( x(1) <= 0.0d0 ) then
258 errcnt = errcnt + 1
259 return
260 endif
261!
262! Row 1: e1
263!
264 if ( rowno .eq. 1 ) then
265!
266! Mode = 1 or 3. G = log(x1)
267!
268 if ( mode .eq. 1 .or. mode .eq. 3 ) then
269 g = log(x(1))
270 endif
271!
272! Mode = 2 or 3: Derivative values:
273!
274 if ( mode .eq. 2 .or. mode .eq. 3 ) then
275 jac(1) = 1.d0/x(1)
276 endif
277 else
278!
279! There are no other rows:
280!
281 mono_fdeval = 1
282 endif
283
284end Function mono_fdeval
285
286
287!> Evaluating nonlinear functions and derivatives on an interval. Used in preprocessing
288!!
289!! @include{doc} fdinterval_params.dox
290Integer Function mono_fdinterval( XMIN, XMAX, GMIN, GMAX, &
291 JMIN, JMAX, ROWNO, JCNM, &
292 MODE, PINF, N, NJ, USRMEM )
293#if defined(itl)
294!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Mono_FDInterval
295#endif
296 Implicit None
297 INTEGER, Intent(IN) :: rowno, mode, n, nj
298 INTEGER, Dimension(NJ), Intent(IN) :: jcnm
299 real*8, Dimension(N), Intent(IN) :: xmin, xmax
300 real*8, Intent(IN OUT) :: gmin, gmax
301 real*8, Dimension(N), Intent(IN OUT) :: jmin, jmax
302 real*8, Intent(IN) :: pinf
303 real*8, Intent(IN OUT) :: usrmem(*)
304
305!
306! Row 1: e1
307!
308 write(10,*) 'Enter Mono_FDInterval. Row=',rowno,' Mode=',mode
309 write(10,*) 'Xmin=',xmin
310 write(10,*) 'Xmax=',xmax
311 if ( rowno .eq. 1 ) then
312!
313! Mode = 1 or 3. G = log(x1)
314!
315 if ( mode .eq. 1 .or. mode .eq. 3 ) then
316 If ( xmin(1) <= 0.0d0 ) then
317 gmin = -pinf
318 else
319 gmin = log(xmin(1))
320 endif
321 If ( xmax(1) <= 0.0d0 ) then
322 gmax = -pinf
323 else
324 gmax = log(xmax(1))
325 endif
326 write(10,*) 'Gmin=',gmin,' Gmax=',gmax
327 endif
328!
329! Mode = 2 or 3: Derivative values:
330!
331 if ( mode .eq. 2 .or. mode .eq. 3 ) then
332 If ( xmin(1) <= 0.0d0 ) then
333 jmin(1) = -pinf
334 jmax(1) = +pinf
335 else
336 jmin(1) = 1.0d0/xmax(1)
337 jmax(1) = 1.0d0/xmin(1)
338 endif
339 write(10,*) 'Jmin=',jmin
340 write(10,*) 'Jmax=',jmax
341 endif
343 else
344!
345! There are no other rows:
346!
348 endif
349
350end Function mono_fdinterval
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_fdinterval(cntvect, coi_fdinterval)
define callback routine for performing function and derivative evaluations on intervals.
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 function mono_fdinterval(xmin, xmax, gmin, gmax, jmin, jmax, rowno, jcnm, mode, pinf, n, nj, usrmem)
Evaluating nonlinear functions and derivatives on an interval. Used in preprocessing.
Definition mono01.f90:281
integer function mono_readmatrix(lower, curr, upper, vsta, type, rhs, esta, colsta, rowno, value, nlflag, n, m, nz, usrmem)
Define information about the model.
Definition mono01.f90:140
integer function mono_fdeval(x, g, jac, rowno, jcnm, mode, ignerr, errcnt, n, nz, thread, usrmem)
Compute nonlinear terms and non-constant Jacobian elements.
Definition mono01.f90:228
program mono02
Main program. A simple setup and call of CONOPT.
Definition mono02.f90:31
#define nj
Definition mp_trans.c:46
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