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
142End Program range07
143!
144! ============================================================================
145! Define information about the model:
146!
147
148!> Define information about the model
149!!
150!! @include{doc} readMatrix_params.dox
151Integer Function rng_readmatrix( lower, curr, upper, vsta, type, rhs, esta, &
152 colsta, rowno, value, nlflag, n, m, nz, &
153 usrmem )
154#ifdef dec_directives_win32
155!DEC$ ATTRIBUTES STDCALL, REFERENCE, NOMIXED_STR_LEN_ARG :: Rng_ReadMatrix
156#endif
157 implicit none
158 integer, intent (in) :: n ! number of variables
159 integer, intent (in) :: m ! number of constraints
160 integer, intent (in) :: nz ! number of nonzeros
161 real*8, intent (in out), dimension(n) :: lower ! vector of lower bounds
162 real*8, intent (in out), dimension(n) :: curr ! vector of initial values
163 real*8, intent (in out), dimension(n) :: upper ! vector of upper bounds
164 integer, intent (in out), dimension(n) :: vsta ! vector of initial variable status
165 ! (not defined here)
166 integer, intent (out), dimension(m) :: type ! vector of equation types
167 integer, intent (in out), dimension(m) :: esta ! vector of initial equation status
168 ! (not defined here)
169 real*8, intent (in out), dimension(m) :: rhs ! vector of right hand sides
170 integer, intent (in out), dimension(n+1) :: colsta ! vector with start of column indices
171 integer, intent (out), dimension(nz) :: rowno ! vector of row numbers
172 integer, intent (in out), dimension(nz) :: nlflag ! vector of nonlinearity flags
173 real*8, intent (in out), dimension(nz) :: value ! vector of matrix values
174 real*8 usrmem(*) ! optional user memory
175!
176! Information about Variables:
177! Default: Lower = -Inf, Curr = 0, and Upper = +inf.
178! Default: the status information in Vsta is not used.
179!
180 lower(1) = 0.0d0
181 lower(2) = 0.0d0
182 lower(3) = 0.0d0
183 lower(4) = 0.0d0
184 upper(4) = 1.0d0
185!
186! Information about Constraints:
187! Default: Rhs = 0
188! Default: the status information in Esta and the function
189! value in FV are not used.
190! Default: Type: There is no default.
191! 0 = Equality,
192! 1 = Greater than or equal,
193! 2 = Less than or equal,
194! 3 = Non binding.
195!
196 type(1) = 2
197 type(2) = 2; rhs(2) = 4.5d0
198 type(3) = 1; rhs(3) = 0.5d0
199 type(4) = 2; rhs(4) = 2.0d0
200 type(5) = 1; rhs(5) = 2.2d0
201!
202! Information about the Jacobian. CONOPT expects a columnwise
203! representation in Rowno, Value, Nlflag and Colsta.
204!
205! Colsta = Start of column indices (No Defaults):
206! Rowno = Row indices
207! Value = Value of derivative (by default only linear
208! derivatives are used)
209! Nlflag = 0 for linear and 1 for nonlinear derivative
210! (not needed for completely linear models)
211!
212! Indices
213! x(1) x(2) x(3) x(4)
214! 1: 1 3
215! 2: 2 5 9
216! 3: 4 6 10
217! 4: 7 11
218! 5: 8 12
219!
220 colsta(1) = 1
221 colsta(2) = 3
222 colsta(3) = 5
223 colsta(4) = 9
224 colsta(5) = 13
225 rowno(1) = 1
226 rowno(2) = 2
227 rowno(3) = 1
228 rowno(4) = 3
229 rowno(5) = 2
230 rowno(6) = 3
231 rowno(7) = 4
232 rowno(8) = 5
233 rowno(9) = 2
234 rowno(10) = 3
235 rowno(11) = 4
236 rowno(12) = 5
237!
238! Nonlinearity Structure: Model is linear and nlfalg is not needed
239!
240! Value (Linear only)
241! x(1) x(2) x(3) x(4)
242! 1: +1 +1
243! 2: +1 +3 +3
244! 3: +1 +1
245! 4: +1 +1
246! 5: +2 +2
247!
248 value(1) = 1.d0
249 value(2) = 1.d0
250 value(3) = 1.d0
251 value(4) = 1.d0
252 value(5) = 3.d0
253 value(6) = 1.d0
254 value(7) = 1.d0
255 value(8) = 2.d0
256 value(9) = 3.d0
257 value(10) = 1.d0
258 value(11) = 1.d0
259 value(12) = 2.d0
260
261 rng_readmatrix = 0 ! Return value means OK
262
263end Function rng_readmatrix
integer function std_solution(xval, xmar, xbas, xsta, yval, ymar, ybas, ysta, n, m, usrmem)
Definition comdecl.f90:132
integer function std_status(modsta, solsta, iter, objval, usrmem)
Definition comdecl.f90:88
subroutine checkdual(case, minmax)
Definition comdecl.f90:394
integer function std_message(smsg, dmsg, nmsg, llen, usrmem, msgv)
Definition comdecl.f90:205
integer function std_errmsg(rowno, colno, posno, msglen, usrmem, msg)
Definition comdecl.f90:248
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
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:135
program range07
Main program. A simple setup and call of CONOPT.
Definition range07.f90:35