CONOPT
Loading...
Searching...
No Matches
range07.f90
Go to the documentation of this file.
1!> @file range07.f90
2!! @ingroup FORT1THREAD_EXAMPLES
3!!
4!!
5!! Range07:
6!! Model where some constraints can be combined into a single ranged constraint.
7!!
8!! This is a CONOPT implementation of the GAMS model:
9!!
10!! @verbatim
11!! positive variable x1, x2, x3, x4
12!! equation e1, e2, e3, e4, e5;
13!! e1.. x1 + x2 =L= 0;
14!! e2.. x1 +3x3 +3x4 =L= 4.5;
15!! e3.. x2 + x3 + x4 =G= 0.5;
16!! e4.. x3 + x4 =L= 2;
17!! e5.. 2x3 +2x4 =G= 2.2;
18!! x4.up = 1;
19!! minimize x3;
20!! @endverbatim
21!!
22!! Similar to Range04 but with changed rhs and e2 scaled so it will be the surviving range.
23!!
24!!
25!! For more information about the individual callbacks, please have a look at the source code.
26
27#if defined(_WIN32) && !defined(_WIN64)
28#define dec_directives_win32
29#endif
30
31!> Main program. A simple setup and call of CONOPT
32!!
33Program range07
34
36 Use conopt
37 implicit None
38!
39! Declare the user callback routines as Integer, External:
40!
41 Integer, External :: rng_readmatrix ! Mandatory Matrix definition routine defined below
42 Integer, External :: std_status ! Standard callback for displaying solution status
43 Integer, External :: std_solution ! Standard callback for displaying solution values
44 Integer, External :: std_message ! Standard callback for managing messages
45 Integer, External :: std_errmsg ! Standard callback for managing error messages
46#ifdef dec_directives_win32
47!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Rng_ReadMatrix
48!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Status
49!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Solution
50!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_Message
51!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Std_ErrMsg
52#endif
53!
54! Control vector
55!
56 INTEGER, Dimension(:), Pointer :: cntvect
57 INTEGER :: coi_error
58!
59! Create and initialize a Control Vector
60!
61 call startup
62
63 coi_error = coi_create( cntvect )
64!
65! Tell CONOPT about the size of the model by populating the Control Vector:
66!
67 coi_error = max( coi_error, coidef_numvar( cntvect, 4 ) ) ! 4 variables
68 coi_error = max( coi_error, coidef_numcon( cntvect, 5 ) ) ! 5 constraints
69 coi_error = max( coi_error, coidef_numnz( cntvect, 12 ) ) ! 12 nonzeros in the Jacobian
70 coi_error = max( coi_error, coidef_numnlnz( cntvect, 0 ) ) ! 0 of which are nonlinear
71 coi_error = max( coi_error, coidef_optdir( cntvect, -1 ) ) ! Minimize
72 coi_error = max( coi_error, coidef_objvar( cntvect, 3 ) ) ! Objective is variable 3
73 coi_error = max( coi_error, coidef_optfile( cntvect, 'Range07.opt' ) )
74!
75! Tell CONOPT about the callback routines:
76!
77 coi_error = max( coi_error, coidef_readmatrix( cntvect, rng_readmatrix ) )
78 coi_error = max( coi_error, coidef_status( cntvect, std_status ) )
79 coi_error = max( coi_error, coidef_solution( cntvect, std_solution ) )
80 coi_error = max( coi_error, coidef_message( cntvect, std_message ) )
81 coi_error = max( coi_error, coidef_errmsg( cntvect, std_errmsg ) )
82
83#if defined(CONOPT_LICENSE_INT_1) && defined(CONOPT_LICENSE_INT_2) && defined(CONOPT_LICENSE_INT_3) && defined(CONOPT_LICENSE_TEXT)
84 coi_error = max( coi_error, coidef_license( cntvect, conopt_license_int_1, conopt_license_int_2, conopt_license_int_3, conopt_license_text) )
85#endif
86
87 If ( coi_error .ne. 0 ) THEN
88 write(*,*)
89 write(*,*) '**** Fatal Error while loading CONOPT Callback routines.'
90 write(*,*)
91 call flog( "Skipping Solve due to setup errors", 1 )
92 ENDIF
93!
94! Save the solution so we can check the duals:
95!
96 do_allocate = .true.
97!
98! Start CONOPT:
99!
100 coi_error = coi_solve( cntvect )
101
102 write(*,*)
103 write(*,*) 'End of Range07 example A. Return code=',coi_error
104
105 If ( coi_error /= 0 ) then
106 call flog( "Errors encountered during solution A", 1 )
107 elseif ( stacalls == 0 .or. solcalls == 0 ) then
108 call flog( "Status or Solution routine was not called A", 1 )
109 elseif ( sstat /= 1 .or. mstat /= 1 ) then ! Linear model
110 call flog( "Solver and Model Status was not as expected (1,1) A", 1 )
111 elseif ( abs( obj-0.1d0 ) > 0.000001d0 ) then
112 call flog( "Incorrect objective returned A", 1 )
113 Else
114 Call checkdual( 'Range07A', minimize )
115 endif
116!
117! We now reverse the direction of optimization and check that the dual still
118! are OK
119!
120 coi_error = max( coi_error, coidef_optdir( cntvect, +1 ) ) ! Maximize
121 coi_error = coi_solve( cntvect )
122
123 write(*,*)
124 write(*,*) 'End of Range07 example B. Return code=',coi_error
125
126 If ( coi_error /= 0 ) then
127 call flog( "Errors encountered during solution B", 1 )
128 elseif ( stacalls == 0 .or. solcalls == 0 ) then
129 call flog( "Status or Solution routine was not called B", 1 )
130 elseif ( sstat /= 1 .or. mstat /= 1 ) then ! Linear model
131 call flog( "Solver and Model Status was not as expected (1,1) B", 1 )
132 elseif ( abs( obj-1.5d0 ) > 0.000001d0 ) then
133 call flog( "Incorrect objective returned B", 1 )
134 Else
135 Call checkdual( 'Range07B', maximize )
136 endif
137
138 if ( coi_free(cntvect) /= 0 ) call flog( "Error while freeing control vector",1)
139
140 call flog( "Successful Solve", 0 )
141!
142! Free solution memory
143!
144 call finalize
145
146End Program range07
147!
148! ============================================================================
149! Define information about the model:
150!
151
152!> Define information about the model
153!!
154!! @include{doc} readMatrix_params.dox
155Integer Function rng_readmatrix( lower, curr, upper, vsta, type, rhs, esta, &
156 colsta, rowno, value, nlflag, n, m, nz, &
157 usrmem )
158#ifdef dec_directives_win32
159!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Rng_ReadMatrix
160#endif
161 implicit none
162 integer, intent (in) :: n ! number of variables
163 integer, intent (in) :: m ! number of constraints
164 integer, intent (in) :: nz ! number of nonzeros
165 real*8, intent (in out), dimension(n) :: lower ! vector of lower bounds
166 real*8, intent (in out), dimension(n) :: curr ! vector of initial values
167 real*8, intent (in out), dimension(n) :: upper ! vector of upper bounds
168 integer, intent (in out), dimension(n) :: vsta ! vector of initial variable status
169 ! (not defined here)
170 integer, intent (out), dimension(m) :: type ! vector of equation types
171 integer, intent (in out), dimension(m) :: esta ! vector of initial equation status
172 ! (not defined here)
173 real*8, intent (in out), dimension(m) :: rhs ! vector of right hand sides
174 integer, intent (in out), dimension(n+1) :: colsta ! vector with start of column indices
175 integer, intent (out), dimension(nz) :: rowno ! vector of row numbers
176 integer, intent (in out), dimension(nz) :: nlflag ! vector of nonlinearity flags
177 real*8, intent (in out), dimension(nz) :: value ! vector of matrix values
178 real*8 usrmem(*) ! optional user memory
179!
180! Information about Variables:
181! Default: Lower = -Inf, Curr = 0, and Upper = +inf.
182! Default: the status information in Vsta is not used.
183!
184 lower(1) = 0.0d0
185 lower(2) = 0.0d0
186 lower(3) = 0.0d0
187 lower(4) = 0.0d0
188 upper(4) = 1.0d0
189!
190! Information about Constraints:
191! Default: Rhs = 0
192! Default: the status information in Esta and the function
193! value in FV are not used.
194! Default: Type: There is no default.
195! 0 = Equality,
196! 1 = Greater than or equal,
197! 2 = Less than or equal,
198! 3 = Non binding.
199!
200 type(1) = 2
201 type(2) = 2; rhs(2) = 4.5d0
202 type(3) = 1; rhs(3) = 0.5d0
203 type(4) = 2; rhs(4) = 2.0d0
204 type(5) = 1; rhs(5) = 2.2d0
205!
206! Information about the Jacobian. CONOPT expects a columnwise
207! representation in Rowno, Value, Nlflag and Colsta.
208!
209! Colsta = Start of column indices (No Defaults):
210! Rowno = Row indices
211! Value = Value of derivative (by default only linear
212! derivatives are used)
213! Nlflag = 0 for linear and 1 for nonlinear derivative
214! (not needed for completely linear models)
215!
216! Indices
217! x(1) x(2) x(3) x(4)
218! 1: 1 3
219! 2: 2 5 9
220! 3: 4 6 10
221! 4: 7 11
222! 5: 8 12
223!
224 colsta(1) = 1
225 colsta(2) = 3
226 colsta(3) = 5
227 colsta(4) = 9
228 colsta(5) = 13
229 rowno(1) = 1
230 rowno(2) = 2
231 rowno(3) = 1
232 rowno(4) = 3
233 rowno(5) = 2
234 rowno(6) = 3
235 rowno(7) = 4
236 rowno(8) = 5
237 rowno(9) = 2
238 rowno(10) = 3
239 rowno(11) = 4
240 rowno(12) = 5
241!
242! Nonlinearity Structure: Model is linear and nlfalg is not needed
243!
244! Value (Linear only)
245! x(1) x(2) x(3) x(4)
246! 1: +1 +1
247! 2: +1 +3 +3
248! 3: +1 +1
249! 4: +1 +1
250! 5: +2 +2
251!
252 value(1) = 1.d0
253 value(2) = 1.d0
254 value(3) = 1.d0
255 value(4) = 1.d0
256 value(5) = 3.d0
257 value(6) = 1.d0
258 value(7) = 1.d0
259 value(8) = 2.d0
260 value(9) = 3.d0
261 value(10) = 1.d0
262 value(11) = 1.d0
263 value(12) = 2.d0
264
265 rng_readmatrix = 0 ! Return value means OK
266
267end Function rng_readmatrix
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
subroutine checkdual(case, minmax)
Definition comdecl.f90:432
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_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
real *8 obj
Definition comdecl.f90:16
integer solcalls
Definition comdecl.f90:15
integer sstat
Definition comdecl.f90:18
subroutine finalize
Definition comdecl.f90:79
integer, parameter minimize
Definition comdecl.f90:31
integer stacalls
Definition comdecl.f90:14
subroutine flog(msg, code)
Definition comdecl.f90:62
logical do_allocate
Definition comdecl.f90:27
integer, parameter maximize
Definition comdecl.f90:31
integer mstat
Definition comdecl.f90:17
subroutine startup
Definition comdecl.f90:41
integer function rng_readmatrix(lower, curr, upper, vsta, type, rhs, esta, colsta, rowno, value, nlflag, n, m, nz, usrmem)
Define information about the model.
Definition range01.f90:139
program range07
Main program. A simple setup and call of CONOPT.
Definition range07.f90:35