CONOPT
Loading...
Searching...
No Matches
ident22.f90
Go to the documentation of this file.
1!> @file ident22.f90
2!! @ingroup FORT1THREAD_EXAMPLES
3!!
4!!
5!! Model with identical variables, i.e. <code>a*xi =E= b*xj</code>.
6!! Similar to ident21, but with bounds on the variables.
7!! The bounds are not consistent with the identities
8!! and they prevent the global minimum of zero.
9!!
10!! This is a CONOPT implementation of the GAMS model:
11!!
12!! @verbatim
13!! variable x1, x2, x3, x4, x5;
14!! equation e1, e2, e3, e4;
15!!
16!! e1.. x1 =E= x3;
17!! e2.. x2 + x4 =E= 0;
18!! e3.. x1 + 2*x2 =E= 1;
19!! e4.. x5 =E= sqr(x1+x2+x3+x4);
20!!
21!! x1.lo = -1;
22!! x4.lo = -0.4;
23!! x2.lo = 0;
24!!
25!! model m / all /;
26!! solve m using nlp minimizing x5;
27!! @endverbatim
28!!
29!!
30!! For more information about the individual callbacks, please have a look at the source code.
31
32!> Main program. A simple setup and call of CONOPT
33!!
34Program ident22
35
36 Use proginfo
37 Use coidef
38 implicit None
39!
40! Declare the user callback routines as Integer, External:
41!
42 Integer, External :: ident_readmatrix ! Mandatory Matrix definition routine defined below
43 Integer, External :: ident_fdeval ! Function and Derivative evaluation routine
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#if defined(itl)
49!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Ident_ReadMatrix
50!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Ident_FDEval
51!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Status
52!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Solution
53!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Message
54!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_ErrMsg
55#endif
56!
57! Control vector
58!
59 INTEGER :: numcallback
60 INTEGER, Dimension(:), Pointer :: cntvect
61 INTEGER :: coi_error
62
63 call startup
64!
65! Create and initialize a Control Vector
66!
67 numcallback = coidef_size()
68 Allocate( cntvect(numcallback) )
69 coi_error = coidef_inifort( cntvect )
70!
71! Tell CONOPT about the size of the model by populating the Control Vector:
72!
73 coi_error = max( coi_error, coidef_numvar( cntvect, 5 ) )
74 coi_error = max( coi_error, coidef_numcon( cntvect, 4 ) )
75 coi_error = max( coi_error, coidef_numnz( cntvect, 11 ) )
76 coi_error = max( coi_error, coidef_numnlnz( cntvect, 4 ) )
77 coi_error = max( coi_error, coidef_optdir( cntvect, -1 ) ) ! minimize
78 coi_error = max( coi_error, coidef_objvar( cntvect, 5 ) ) ! Objective is x5
79 coi_error = max( coi_error, coidef_optfile( cntvect, 'Ident22.opt' ) )
80!
81! Tell CONOPT about the callback routines:
82!
83 coi_error = max( coi_error, coidef_readmatrix( cntvect, ident_readmatrix ) )
84 coi_error = max( coi_error, coidef_fdeval( cntvect, ident_fdeval ) )
85 coi_error = max( coi_error, coidef_status( cntvect, std_status ) )
86 coi_error = max( coi_error, coidef_solution( cntvect, std_solution ) )
87 coi_error = max( coi_error, coidef_message( cntvect, std_message ) )
88 coi_error = max( coi_error, coidef_errmsg( cntvect, std_errmsg ) )
89
90#if defined(LICENSE_INT_1) && defined(LICENSE_INT_2) && defined(LICENSE_INT_3) && defined(LICENSE_TEXT)
91 coi_error = max( coi_error, coidef_license( cntvect, license_int_1, license_int_2, license_int_3, license_text) )
92#endif
93
94 If ( coi_error .ne. 0 ) THEN
95 write(*,*)
96 write(*,*) '**** Fatal Error while loading CONOPT Callback routines.'
97 write(*,*)
98 call flog( "Skipping Solve due to setup errors", 1 )
99 ENDIF
100!
101! Save the solution so we can check the duals:
102!
103 do_allocate = .true.
104!
105! Start CONOPT:
106!
107 coi_error = coi_solve( cntvect )
108
109 write(*,*)
110 write(*,*) 'End of Ident example 1. Return code=',coi_error
111
112 If ( coi_error /= 0 ) then
113 call flog( "Errors encountered during solution", 1 )
114 elseif ( stacalls == 0 .or. solcalls == 0 ) then
115 call flog( "Status or Solution routine was not called", 1 )
116 elseif ( .not. ( sstat == 1 .and. mstat == 2 ) ) then
117 call flog( "Solver or Model status was not as expected (1,2)", 1 )
118 elseif ( abs( obj - 0.16d0 ) > 1.d-7 ) then
119 call flog( "Incorrect objective returned", 1 )
120 Else
121 Call checkdual( 'Ident22', minimize )
122 endif
123
124 if ( coi_free(cntvect) /= 0 ) call flog( "Error while freeing control vector",1)
125
126 call flog( "Successful Solve", 0 )
127
128End Program ident22
129!
130! ============================================================================
131! Define information about the model:
132!
133
134!> Define information about the model
135!!
136!! @include{doc} readMatrix_params.dox
137Integer Function ident_readmatrix( lower, curr, upper, vsta, type, rhs, esta, &
138 colsta, rowno, value, nlflag, n, m, nz, &
139 usrmem )
140#if defined(itl)
141!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Ident_ReadMatrix
142#endif
143 implicit none
144 integer, intent (in) :: n ! number of variables
145 integer, intent (in) :: m ! number of constraints
146 integer, intent (in) :: nz ! number of nonzeros
147 real*8, intent (in out), dimension(n) :: lower ! vector of lower bounds
148 real*8, intent (in out), dimension(n) :: curr ! vector of initial values
149 real*8, intent (in out), dimension(n) :: upper ! vector of upper bounds
150 integer, intent (in out), dimension(n) :: vsta ! vector of initial variable status
151 ! (not defined here)
152 integer, intent (out), dimension(m) :: type ! vector of equation types
153 integer, intent (in out), dimension(m) :: esta ! vector of initial equation status
154 ! (not defined here)
155 real*8, intent (in out), dimension(m) :: rhs ! vector of right hand sides
156 integer, intent (in out), dimension(n+1) :: colsta ! vector with start of column indices
157 integer, intent (out), dimension(nz) :: rowno ! vector of row numbers
158 integer, intent (in out), dimension(nz) :: nlflag ! vector of nonlinearity flags
159 real*8, intent (in out), dimension(nz) :: value ! vector of matrix values
160 real*8 usrmem(*) ! optional user memory
161
162!
163! Information about Variables:
164! Default: Lower = -Inf, Curr = 0, and Upper = +inf.
165! Default: the status information in Vsta is not used.
166!
167 lower(1) = -1.0d0
168 lower(2) = 0.0d0;
169 lower(4) = -0.4d0
170!
171! Information about Constraints:
172! Default: Rhs = 0
173! Default: the status information in Esta and the function
174! value in FV are not used.
175! Default: Type: There is no default.
176! 0 = Equality,
177! 1 = Greater than or equal,
178! 2 = Less than or equal,
179! 3 = Non binding.
180!
181! Constraints 1 to Nrow:
182! Rhs = Obs(i) and type Equality
183!
184 type(1) = 0
185 type(2) = 0
186 type(3) = 0
187 type(4) = 0
188 rhs(3) = 1.0d0
189!
190! Information about the Jacobian. We use the standard method with
191! Rowno, Value, Nlflag and Colsta and we do not use Colno.
192!
193! Colsta = Start of column indices (No Defaults):
194! Rowno = Row indices
195! Value = Value of derivative (by default only linear
196! derivatives are used)
197! Nlflag = 0 for linear and 1 for nonlinear derivative
198! (not needed for completely linear models)
199!
200! x1 x2 x3 x4 x5
201! e1 1 7
202! e2 4 9
203! e3 2 5
204! e4 3 6 8 10 11
205
206! e1.. x1 =E= x3;
207! e2.. x2 + x4 =E= 0;
208! e3.. x1 + 2*x2 =E= 1;
209! e4.. x5 =E= sqr(x1+x2+x3+x4);
210! x1 x2 x3 x4 x5
211! e1 1.0 -1.0
212! e2 1.0 1.0
213! e3 1.0 2.0
214! e4 NL NL NL NL 1.0
215!
216 colsta(1) = 1
217 colsta(2) = 4
218 colsta(3) = 7
219 colsta(4) = 9
220 colsta(5) = 11
221 colsta(6) = 12
222 rowno(1) = 1; nlflag(1) = 0; value(1) = 1.0d0
223 rowno(2) = 3; nlflag(2) = 0; value(2) = 1.0d0
224 rowno(3) = 4; nlflag(3) = 1;
225 rowno(4) = 2; nlflag(4) = 0; value(4) = 1.0d0
226 rowno(5) = 3; nlflag(5) = 0; value(5) = 2.0d0
227 rowno(6) = 4; nlflag(6) = 1;
228 rowno(7) = 1; nlflag(7) = 0; value(7) = -1.0d0
229 rowno(8) = 4; nlflag(8) = 1;
230 rowno(9) = 2; nlflag(9) = 0; value(9) = 1.0d0
231 rowno(10) = 4; nlflag(10) = 1;
232 rowno(11) = 4; nlflag(11) = 0; value(11) = 1.0d0
233
234 ident_readmatrix = 0 ! Return value means OK
235
236end Function ident_readmatrix
237
238
239!> Compute nonlinear terms and non-constant Jacobian elements
240!!
241!! @include{doc} fdeval_params.dox
242Integer Function ident_fdeval( x, g, jac, rowno, jcnm, mode, ignerr, errcnt, &
243 n, nz, thread, usrmem )
244#if defined(itl)
245!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Ident_FDEval
246#endif
247 Use ident
248 implicit none
249 integer, intent (in) :: n ! number of variables
250 integer, intent (in) :: rowno ! number of the row to be evaluated
251 integer, intent (in) :: nz ! number of nonzeros in this row
252 real*8, intent (in), dimension(n) :: x ! vector of current solution values
253 real*8, intent (in out) :: g ! constraint value
254 real*8, intent (in out), dimension(n) :: jac ! vector of derivatives for current constraint
255 integer, intent (in), dimension(nz) :: jcnm ! list of variables that appear nonlinearly
256 ! in this row. Ffor information only.
257 integer, intent (in) :: mode ! evaluation mode: 1 = function value
258 ! 2 = derivatives, 3 = both
259 integer, intent (in) :: ignerr ! if 1 then errors can be ignored as long
260 ! as errcnt is incremented
261 integer, intent (in out) :: errcnt ! error counter to be incremented in case
262 ! of function evaluation errors.
263 integer, intent (in) :: thread
264 real*8 usrmem(*) ! optional user memory
265!
266 if ( rowno .eq. 4 ) then
267!
268! Mode = 1 or 3. Function value: -sqr(x1+x2+x3+x4)
269!
270 if ( mode .eq. 1 .or. mode .eq. 3 ) then
271 g = -(x(1)+x(2)+x(3)+x(4))**2
272 endif
273!
274! Mode = 2 or 3: Derivative values:
275!
276 if ( mode .eq. 2 .or. mode .eq. 3 ) then
277 jac(1) = -2.d0*(x(1)+x(2)+x(3)+x(4))
278 jac(2) = -2.d0*(x(1)+x(2)+x(3)+x(4))
279 jac(3) = -2.d0*(x(1)+x(2)+x(3)+x(4))
280 jac(4) = -2.d0*(x(1)+x(2)+x(3)+x(4))
281 endif
282 ident_fdeval = 0
283 else
284 ident_fdeval = 1 ! Illegal row number
285 endif
286
287end Function ident_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_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
integer function ident_readmatrix(lower, curr, upper, vsta, type, rhs, esta, colsta, rowno, value, nlflag, n, m, nz, usrmem)
Define information about the model.
Definition ident01.f90:131
integer function ident_fdeval(x, g, jac, rowno, jcnm, mode, ignerr, errcnt, n, nz, thread, usrmem)
Compute nonlinear terms and non-constant Jacobian elements.
Definition ident20.f90:232
program ident22
Main program. A simple setup and call of CONOPT.
Definition ident22.f90:34
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