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