<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic If you want to do pseudo in Intel® Fortran Compiler</title>
    <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808586#M41523</link>
    <description>&lt;P&gt;If you want to do pseudo-boolean variable optimization and/or global optimization, you will have to look elsewhere for suitable algorithms. Consult Prof. Mittelmann's site at&amp;nbsp;http://plato.asu.edu/guide.html .&lt;/P&gt;</description>
    <pubDate>Thu, 13 Nov 2014 10:38:26 GMT</pubDate>
    <dc:creator>mecej4</dc:creator>
    <dc:date>2014-11-13T10:38:26Z</dc:date>
    <item>
      <title>use NNLPF or NNLPG in fortran IMSL</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808570#M41507</link>
      <description>In NNLPF, the constrained nonlinear optimization problem is cast into the manner of "SELECT CASE ". CASE (0) corresponds to the objective function evaluation, while CASE (1:ME) for equality constraints and CASE(ME+1:M) for unequality contraints. &lt;DIV&gt;&lt;SPAN style="font-family: Verdana, Arial, Helvetica, sans-serif;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;If ME/M is a small number, say less than 5, we can easily write the constraints one by one in the same way as the documentation examples (Ch 8 Optimization of the IMSL documentation). However, What if ME/M is considerably large as 1000, are there any better ways to write these constraints? For example, is it possible to write the constraints via matrix? Thanks in advance.&lt;/DIV&gt;&lt;/DIV&gt;</description>
      <pubDate>Tue, 12 Jun 2012 03:56:57 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808570#M41507</guid>
      <dc:creator>Abac1</dc:creator>
      <dc:date>2012-06-12T03:56:57Z</dc:date>
    </item>
    <item>
      <title>use NNLPF or NNLPG in fortran IMSL</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808571#M41508</link>
      <description>IMSL cannot and does not define what is and what is not legal Fortran. The Fortran standard does, and the compiler claiming standard conformance implements that definition.&lt;BR /&gt;&lt;BR /&gt;The CASE-selector-block construct in Fortran allows the selector to be an initialization expression or even something such as&lt;BR /&gt;&lt;BR /&gt; CASE (1, 2, 7, 10:17, 23)&lt;BR /&gt;&lt;BR /&gt;You are not even required to use a SELECT construct. You can use a matrix, use binary search, or whatever you please, as long as your code does what IMSL wants it to.</description>
      <pubDate>Tue, 12 Jun 2012 04:25:55 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808571#M41508</guid>
      <dc:creator>mecej4</dc:creator>
      <dc:date>2012-06-12T04:25:55Z</dc:date>
    </item>
    <item>
      <title>use NNLPF or NNLPG in fortran IMSL</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808572#M41509</link>
      <description>Hi mecej4:Thank you for the ideas. &lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;I tried to put my concerns into an example here. The example is adapted from example 2.8.1, pp.15-17 of Floudas's book "A Collection of Test Problems for Constrained Global Optimization Algorithms". You may find it from google book as well. (&lt;A href="http://books.google.com.sg/books?id=zRIfcNQ0V04C&amp;amp;pg=PA5&amp;amp;lpg=PA5&amp;amp;dq=a+collection+of+ch2+Quadratic+Programming+test+problems&amp;amp;source=bl&amp;amp;ots=1Hh-VYhFGj&amp;amp;sig=cU0J89l9e_NnG11ZnDqZavyMgyo&amp;amp;hl=en&amp;amp;sa=X&amp;amp;ei=LxLYT8iFFsTZrQe9ueDmDw&amp;amp;ved=0CEQQ6AEwAA#v=onepage&amp;amp;q=a%20collection%20of%20ch2%20Quadratic%20Programming%20test%20problems&amp;amp;f=false"&gt;http://books.google.com.sg/books?id=zRIfcNQ0V04C&amp;amp;pg=PA5&amp;amp;lpg=PA5&amp;amp;dq=a+collection+of+ch2+Quadratic+Programming+test+problems&amp;amp;source=bl&amp;amp;ots=1Hh-VYhFGj&amp;amp;sig=cU0J89l9e_NnG11ZnDqZavyMgyo&amp;amp;hl=en&amp;amp;sa=X&amp;amp;ei=LxLYT8iFFsTZrQe9ueDmDw&amp;amp;ved=0CEQQ6AEwAA#v=onepage&amp;amp;q=a%20collection%20of%20ch2%20Quadratic%20Programming%20test%20problems&amp;amp;f=false&lt;/A&gt;)&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;I put them into the attached files called "NonOptEx1". There are a pdf file (http://software.intel.com/file/44390) and Fortran90 source file (http://software.intel.com/file/44391) inside. I have two problems with this example:&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;1. I cannot get the indicated solution&lt;/DIV&gt;&lt;DIV&gt;2. If possible, a better way coding it in Fortran should be: [min f(x)=AX^2+BX, subjected to CX=D].&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;In the attached source code, the problem is programmed straightforward and not good enough, especially the way of handling the constraints. I am looking for simple ways to formulate the constraints in a matrix form. Could you help to look into my attached code to make it more concise? Thanks a lot.&lt;/DIV&gt;</description>
      <pubDate>Wed, 13 Jun 2012 04:15:58 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808572#M41509</guid>
      <dc:creator>Abac1</dc:creator>
      <dc:date>2012-06-13T04:15:58Z</dc:date>
    </item>
    <item>
      <title>i am a new learner about IMSL</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808573#M41510</link>
      <description>&lt;P&gt;i am a new learner about IMSL and i also have a similar question here.&lt;/P&gt;

&lt;P&gt;No.1 i write my FCN subroutine as following:&lt;/P&gt;

&lt;PRE class="brush:fortran;"&gt;SUBROUTINE FCN1 (X, IACT, RESULT, IERR)
INTEGER IACT
REAL(KIND(1E0)) X(*), RESULT
LOGICAL IERR
!
SELECT CASE (IACT)
CASE(0)
RESULT = (X(1)-2.0E0)**2 + (X(2)-1.0E0)**2
CASE(1)
RESULT = (X(1)-1)**2*(X(1))**2
!CASE(2)
!RESULT = -(X(1)**2)/4.0E0 - X(2)**2 + 1.0E0
END SELECT
RETURN
END &lt;/PRE&gt;

&lt;P&gt;and i call the NNLPF in my main program like this:&lt;/P&gt;

&lt;PRE class="brush:fortran;"&gt;&amp;nbsp;&amp;nbsp; EXTERNAL FCN1
&amp;nbsp;&amp;nbsp; INTEGER::M, ME
&amp;nbsp;&amp;nbsp; REAL(KIND(1E0)) FVALUE, X(5), XGUESS(5), XLB(5), XUB(5)
&amp;nbsp;&amp;nbsp;&amp;nbsp; M=1
&amp;nbsp;&amp;nbsp;&amp;nbsp; ME=1
&amp;nbsp;&amp;nbsp;&amp;nbsp; XLB = -HUGE(X(1))
&amp;nbsp;&amp;nbsp;&amp;nbsp; XUB = HUGE(X(1))
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; CALL NNLPF (FCN1, M, ME, IBTYPE, XLB, XUB, X,IPRINT=1)
&amp;nbsp;&amp;nbsp;&amp;nbsp; !DO i =1,size(X)
&amp;nbsp;&amp;nbsp;&amp;nbsp; !&amp;nbsp;&amp;nbsp;&amp;nbsp; write(*,'(F4.0)')X(i)
&amp;nbsp;&amp;nbsp;&amp;nbsp; !END DO
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; CALL WRRRN ('The solution is', X)&lt;/PRE&gt;

&lt;P&gt;as you see,my object function is "min f=(x1-2)^2+(x2-1)^2" and i only have one equality&amp;nbsp; constraint:(x1-1)^2*x1^2=0; the optimal solution i think is x1=1.0,x2=1.0,and the minimun f=1.0.&lt;/P&gt;

&lt;P&gt;but the indicated result is x1=0.0,x2=1.0,min f =4.0,as show in the attachments.&lt;/P&gt;

&lt;P&gt;i don't know why?&lt;/P&gt;

&lt;P&gt;No.2 if i don't know the number of equality constraints and uneqaulity constraints, and even the size of variable X, or some other linear constraints bounds ,when i write my FCN subroutine. it just decided by&amp;nbsp; input files read from the main program .then how can&amp;nbsp; write my FCN subroutine? in other words, how can i pass the optimization dimension and the constraints bounds parameter to my FCN?&lt;/P&gt;

&lt;P&gt;thanks a lot!&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sat, 01 Nov 2014 01:08:17 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808573#M41510</guid>
      <dc:creator>huang_l_</dc:creator>
      <dc:date>2014-11-01T01:08:17Z</dc:date>
    </item>
    <item>
      <title>The majority of nonlinear</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808574#M41511</link>
      <description>&lt;P&gt;The majority of nonlinear constrained optimization solvers are &lt;STRONG&gt;local&lt;/STRONG&gt; optimizers. Their success often depends on your giving them good starting values and well-behaved functions in the objective and constraint functions. In your case, you seem to seek a &lt;STRONG&gt;global &lt;/STRONG&gt;optimum, yet you gave no starting guess for X(1:2). The IMSL manual states "&lt;SPAN style="color: rgb(0, 0, 0); font-family: 'Times New Roman', serif; font-size: 14.5454540252686px; line-height: normal; text-indent: -25px;"&gt;A good initial starting point is very problem specific and should be provided by the calling program whenever possible.&amp;nbsp; See optional argument&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color: rgb(0, 0, 0); font-size: 9pt; line-height: normal; text-indent: -25px; font-family: 'Courier New';"&gt;XGUESS&lt;/SPAN&gt;&lt;SPAN style="color: rgb(0, 0, 0); font-family: 'Times New Roman', serif; font-size: 9pt; line-height: normal; text-indent: -25px;"&gt;.&lt;/SPAN&gt;". You can also help move the optimizer towards the region of the more desirable solution by specifying additional constraints. For example, try x&lt;SUB&gt;1&lt;/SUB&gt; &amp;gt;= 0.001.&lt;/P&gt;

&lt;P&gt;What was the reason for specifying the constraint as [(x&lt;SUB&gt;1&amp;nbsp;&lt;/SUB&gt;- 1) x&lt;SUB&gt;2&lt;/SUB&gt;]&lt;SUP&gt;2&lt;/SUP&gt; = 0 instead of simply&amp;nbsp;&lt;SPAN style="font-size: 14.3999996185303px; line-height: 17.5607986450195px;"&gt;(x&lt;/SPAN&gt;&lt;SUB&gt;1&amp;nbsp;&lt;/SUB&gt;&lt;SPAN style="font-size: 14.3999996185303px; line-height: 17.5607986450195px;"&gt;- 1) x&lt;/SPAN&gt;&lt;SUB&gt;2&lt;/SUB&gt;&lt;SPAN style="font-size: 14.3999996185303px; line-height: 17.5607986450195px;"&gt;&amp;nbsp;= 0 ?&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 03 Nov 2014 15:18:00 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808574#M41511</guid>
      <dc:creator>mecej4</dc:creator>
      <dc:date>2014-11-03T15:18:00Z</dc:date>
    </item>
    <item>
      <title>Quote:mecej4 wrote:</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808575#M41512</link>
      <description>&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;mecej4 wrote:&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;The majority of nonlinear constrained optimization solvers are &lt;STRONG&gt;local&lt;/STRONG&gt; optimizers. Their success often depends on your giving them good starting values and well-behaved functions in the objective and constraint functions. In your case, you seem to seek a &lt;STRONG&gt;global &lt;/STRONG&gt;optimum, yet you gave no starting guess for X(1:2). The IMSL manual states "A good initial starting point is very problem specific and should be provided by the calling program whenever possible.&amp;nbsp; See optional argument&amp;nbsp;&amp;nbsp;XGUESS.". You can also help move the optimizer towards the region of the more desirable solution by specifying additional constraints. For example, try x&lt;SUB&gt;1&lt;/SUB&gt; &amp;gt;= 0.001.&lt;/P&gt;

&lt;P&gt;What was the reason for specifying the constraint as [(x&lt;SUB&gt;1&amp;nbsp;&lt;/SUB&gt;- 1) x&lt;SUB&gt;2&lt;/SUB&gt;]&lt;SUP&gt;2&lt;/SUP&gt; = 0 instead of simply&amp;nbsp;[(x&lt;SUB&gt;1&amp;nbsp;&lt;/SUB&gt;- 1) x&lt;SUB&gt;2&lt;/SUB&gt;] = 0 ?&lt;/P&gt;

&lt;P&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;okay, your answer is very helpful! but what about the question NO.2&lt;/P&gt;

&lt;P&gt;"if i don't know the number of equality constraints and uneqaulity constraints, and even the size of variable X, or some other linear constraints bounds ,when i write my FCN subroutine. it just decided by input files read from the main program .then how can write my FCN subroutine? in other words, how can i pass the optimization dimension and the constraints bounds parameter to my FCN?"&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;thanks very much!&lt;/P&gt;</description>
      <pubDate>Tue, 04 Nov 2014 12:50:56 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808575#M41512</guid>
      <dc:creator>huang_l_</dc:creator>
      <dc:date>2014-11-04T12:50:56Z</dc:date>
    </item>
    <item>
      <title>In situations where the</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808576#M41513</link>
      <description>&lt;P&gt;In situations where the argument list (specified by IMSL for the user function FCN) is not adequate, you can supplement it by using module variables (or, in the old days, using COMMON blocks). Be aware, however, that hiding information from the optimization routine can often cause failure to obtain a solution.&lt;/P&gt;

&lt;P&gt;Here is an example, which I constructed by extending the example given in the IMSL manual for NNLPF.&lt;/P&gt;

&lt;PRE class="brush:fortran;"&gt;    MODULE sharedvars
       IMPLICIT NONE
       INTEGER :: n, m = 2, me = 1, ibtype = 0
    END

    PROGRAM xnnlpf
       USE nnlpf_int
       USE wrrrn_int
       USE sharedvars

       IMPLICIT NONE
!
       REAL fvalue
       REAL, ALLOCATABLE :: x(:), xguess(:), xlb(:), xub(:)
       INTEGER i
       EXTERNAL fcn
!
       READ (*, *) n
       ALLOCATE (x(n), xguess(n), xlb(n), xub(n))
       xlb = -100
       xub = 100
       DO i = 1, n
          xguess(i) = 0.1*i
       END DO
!
       CALL nnlpf(fcn, m, me, ibtype, xlb, xub, x)
!
       CALL wrrrn('The solution is', x)
       DEALLOCATE (x, xguess, xlb, xub)
    END

    SUBROUTINE fcn(x, iact, result, ierr)
       USE sharedvars
       IMPLICIT NONE
       INTEGER iact, i
       REAL (kind(1E0)) x(n), &amp;amp; ! N is taken from SHAREDVARS        
          result
       LOGICAL ierr
!
       SELECT CASE (iact)
       CASE (0)
          result = 0
          DO i = 1, n
             result = result + (x(i)+i-3)**2
          END DO
       CASE (1)
          result = x(1) - 2.0E0*x(2) + 1.0E0
       CASE (2)
          result = -(x(1)**2)/4.0E0 - x(2)**2 + 1.0E0
       END SELECT
       RETURN
    END
&lt;/PRE&gt;

&lt;P&gt;Compile and run it for various values on n, such as n = 2, n=3, n=4, etc.&lt;/P&gt;</description>
      <pubDate>Tue, 04 Nov 2014 16:15:13 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808576#M41513</guid>
      <dc:creator>mecej4</dc:creator>
      <dc:date>2014-11-04T16:15:13Z</dc:date>
    </item>
    <item>
      <title>If you contain the FCN</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808577#M41514</link>
      <description>&lt;P&gt;If you contain the FCN routine inside your program it gives scope to program variables inside FCN and also provides an explicit interface to FNC so that its argument declarations can be checked against the requirements. Now we dont need the EXTERNAL statement. Note that you did not declare or set IBTYPE.&lt;/P&gt;

&lt;PRE class="brush:fortran;"&gt;PROGRAM TEST
   use NNLPF_INT
   INTEGER IBTYPE, M, ME
   REAL(KIND(1E0)) FVALUE, X(5), XGUESS(5), XLB(5), XUB(5)
   M=1
   ME=1
   XLB = -HUGE(X(1))
   XUB = HUGE(X(1))
	     
   CALL NNLPF (FCN1, M, ME, IBTYPE, XLB, XUB, X,IPRINT=1)
   !DO i =1,size(X)
   !    write(*,'(F4.0)')X(i)
   !END DO
	     
   CALL WRRRN ('The solution is', X)
CONTAINS
   SUBROUTINE FCN1(X, IACT, RESULT, IERR)
      INTEGER, intent(in) :: IACT
      REAL(KIND(1E0)), INTENT(IN) :: X(*)
      REAL(KIND(1E0)), INTENT(OUT) :: RESULT
      LOGICAL, INTENT(OUT) :: IERR
      
      WRITE(*), XLB ! Check we can see variables in scope of our container
      SELECT CASE (IACT)
      CASE(0)
         RESULT = (X(1)-2.0E0)**2 + (X(2)-1.0E0)**2
      CASE(1)
         RESULT = (X(1)-1)**2*(X(1))**2
      !CASE(2)
      !RESULT = -(X(1)**2)/4.0E0 - X(2)**2 + 1.0E0
      END SELECT
   END SUBROUTINE
END PROGRAM
&lt;/PRE&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 05 Nov 2014 07:59:00 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808577#M41514</guid>
      <dc:creator>Andrew_Smith</dc:creator>
      <dc:date>2014-11-05T07:59:00Z</dc:date>
    </item>
    <item>
      <title>Quote:Note that you did not</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808578#M41515</link>
      <description>&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;SPAN style="font-size: 12.8000001907349px; line-height: 14.3999996185303px;"&gt;Note that you did not declare or set IBTYPE&lt;/SPAN&gt;&lt;/BLOCKQUOTE&gt; It is declared and initialized to zero in the module. &lt;P&gt;&lt;/P&gt;

&lt;P&gt;&lt;SPAN style="font-size: 12.8000001907349px; line-height: 14.3999996185303px;"&gt;And that is the problem with overuse of modules -- one tends to forget all the stuff put into the module, and it is ever so convenient to say "USE ...." when we no longer remember all the things that are now available. Thank goodness for "USE mymod, only: fork" and "USE mymod, except=&amp;gt;kitchen_sink".&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 05 Nov 2014 12:43:00 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808578#M41515</guid>
      <dc:creator>mecej4</dc:creator>
      <dc:date>2014-11-05T12:43:00Z</dc:date>
    </item>
    <item>
      <title>Quote:mecej4 wrote:</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808579#M41516</link>
      <description>&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;mecej4 wrote:&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;In situations where the argument list (specified by IMSL for the user function FCN) is not adequate, you can supplement it by using module variables (or, in the old days, using COMMON blocks). Be aware, however, that hiding information from the optimization routine can often cause failure to obtain a solution.&lt;/P&gt;

&lt;P&gt;Here is an example, which I constructed by extending the example given in the IMSL manual for NNLPF.&lt;/P&gt;

&lt;PRE class="brush:fortran;"&gt;    MODULE sharedvars
       IMPLICIT NONE
       INTEGER :: n, m = 2, me = 1, ibtype = 0
    END

    PROGRAM xnnlpf
       USE nnlpf_int
       USE wrrrn_int
       USE sharedvars

       IMPLICIT NONE
!
       REAL fvalue
       REAL, ALLOCATABLE :: x(:), xguess(:), xlb(:), xub(:)
       INTEGER i
       EXTERNAL fcn
!
       READ (*, *) n
       ALLOCATE (x(n), xguess(n), xlb(n), xub(n))
       xlb = -100
       xub = 100
       DO i = 1, n
          xguess(i) = 0.1*i
       END DO
!
       CALL nnlpf(fcn, m, me, ibtype, xlb, xub, x)
!
       CALL wrrrn('The solution is', x)
       DEALLOCATE (x, xguess, xlb, xub)
    END

    SUBROUTINE fcn(x, iact, result, ierr)
       USE sharedvars
       IMPLICIT NONE
       INTEGER iact, i
       REAL (kind(1E0)) x(n), &amp;amp; ! N is taken from SHAREDVARS        
          result
       LOGICAL ierr
!
       SELECT CASE (iact)
       CASE (0)
          result = 0
          DO i = 1, n
             result = result + (x(i)+i-3)**2
          END DO
       CASE (1)
          result = x(1) - 2.0E0*x(2) + 1.0E0
       CASE (2)
          result = -(x(1)**2)/4.0E0 - x(2)**2 + 1.0E0
       END SELECT
       RETURN
    END
&lt;/PRE&gt;

&lt;P&gt;Compile and run it for various values on n, such as n = 2, n=3, n=4, e&lt;/P&gt;

&lt;PRE class="brush:fortran;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/PRE&gt;

&lt;P&gt;tc.&lt;/P&gt;

&lt;P&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;okay,I have passed the optimization parameter to my FCN as you do . but i have another question here: if i have hundreds of constraints ,for example,500 equalities constraints and 500 unequalities ,with more than 5000 variables,how can i write the FCN? i don't think the "SELECT CASE" structure is a feasible way to do this. so i try the program using the "IF -ELSEIF -END IF" statements like below:&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;PRE class="brush:fortran;"&gt;!&amp;nbsp; shuc.f90 
!
!&amp;nbsp; FUNCTIONS:
!&amp;nbsp; shuc - Entry point of console application.
!

!****************************************************************************
!
!&amp;nbsp; PROGRAM: shuc
!
!&amp;nbsp; PURPOSE:&amp;nbsp; Entry point for the console application.
!
!****************************************************************************
MODULE my_data_type!自定义数据类型，包括机组数据，负荷数据
&amp;nbsp; TYPE:: unit_data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CHARACTER (len=8) :: unit_name
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CHARACTER (len=4) :: unit_zone
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REAL :: zone_trans_pmax
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REAL::unit_pmax,unit_pmin
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CHARACTER (len=1) :: unit_type
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE(unit_data),POINTER::next_unit_data
&amp;nbsp; END TYPE&amp;nbsp; 
&amp;nbsp; TYPE:: load_data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CHARACTER (len=4) :: load_zone
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REAL :: peak_load,valley_load,zone_trans_pmax

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE(load_data),POINTER::next_load_data
&amp;nbsp; END TYPE&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; TYPE:: variable


&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REAL::x

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE(variable),POINTER::next_variable
&amp;nbsp; END TYPE&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; CONTAINS
&amp;nbsp; SUBROUTINE unit_data_add(pos,head,unit_name,unit_zone,zone_trans_pmax,unit_pmax, unit_pmin,unit_type,unit_data_num)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER::unit_data_num
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CHARACTER (len=8) :: unit_name
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CHARACTER (len=4) :: unit_zone
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REAL ::zone_trans_pmax
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REAL::unit_pmax,unit_pmin
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CHARACTER (len=1) :: unit_type
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE(unit_data),POINTER::temp,pos,head
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ALLOCATE(temp)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp%unit_name=unit_name
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp%unit_zone=unit_zone
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp%zone_trans_pmax=zone_trans_pmax
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp%unit_pmax=unit_pmax
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp%unit_pmin=unit_pmin
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp%unit_type=unit_type
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULLIFY(temp%next_unit_data)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (.NOT.ASSOCIATED(POS))THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ALLOCATE(pos)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos%unit_name=unit_name
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos%unit_zone=unit_zone
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos%zone_trans_pmax=zone_trans_pmax
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos%unit_pmax=unit_pmax
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos%unit_pmin=unit_pmin
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos%unit_type=unit_type
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; head=&amp;gt;pos
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULLIFY(pos%next_unit_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos%next_unit_data=&amp;gt;temp
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos=&amp;gt;temp
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF( unit_data_num==1) THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; head%next_unit_data=&amp;gt;pos
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULLIFY(pos%next_unit_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
!&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DEALLOCATE( temp)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unit_data_num=unit_data_num+1

&amp;nbsp; END&amp;nbsp; SUBROUTINE unit_data_add
&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; SUBROUTINE load_data_add(pos,head,load_zone,peak_load,valley_load,zone_trans_pmax,load_data_num)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER::load_data_num

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CHARACTER (len=4) :: load_zone
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REAL ::zone_trans_pmax
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REAL::peak_load,valley_load

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE(load_data),POINTER::temp,pos,head
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ALLOCATE(temp)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp%load_zone=load_zone
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp%peak_load=peak_load
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp%zone_trans_pmax=zone_trans_pmax
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp%valley_load=valley_load

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULLIFY(temp%next_load_data)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (.NOT.ASSOCIATED(POS))THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ALLOCATE(pos)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos%load_zone=load_zone
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos%peak_load=peak_load
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos%zone_trans_pmax=zone_trans_pmax
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos%valley_load=valley_load

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; head=&amp;gt;pos
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULLIFY(pos%next_load_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos%next_load_data=&amp;gt;temp
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos=&amp;gt;temp
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF( load_data_num==1) THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; head%next_load_data=&amp;gt;pos
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULLIFY(pos%next_load_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
!&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DEALLOCATE( temp)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; load_data_num=load_data_num+1

&amp;nbsp; END&amp;nbsp; SUBROUTINE load_data_add
&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBROUTINE variable_add(pos,head,variable_num)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER::variable_num
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 


&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE(variable),POINTER::temp,pos,head
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ALLOCATE(temp)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp%x=1.

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULLIFY(temp%next_variable)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (.NOT.ASSOCIATED(POS))THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ALLOCATE(pos)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos%x=1.

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; head=&amp;gt;pos
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULLIFY(pos%next_variable)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos%next_variable=&amp;gt;temp
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos=&amp;gt;temp
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF( variable_num==1) THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; head%next_variable=&amp;gt;pos
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULLIFY(pos%next_variable)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
!&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DEALLOCATE( temp)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; variable_num=variable_num+1

&amp;nbsp; END&amp;nbsp; SUBROUTINE variable_add
&amp;nbsp; 
&amp;nbsp; 

&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; 
&amp;nbsp; 
END MODULE
&amp;nbsp; 

MODULE&amp;nbsp; read_data
USE my_data_type
CONTAINS
SUBROUTINE read_optimization_para(peak_dc,valley_dc,peak_ac,valley_ac,head_unit,unit_data_num,head_load,load_data_num)
&amp;nbsp;&amp;nbsp;&amp;nbsp; CHARACTER (len=8) :: unit_name
&amp;nbsp;&amp;nbsp;&amp;nbsp; CHARACTER (len=4) :: unit_zone
&amp;nbsp;&amp;nbsp;&amp;nbsp; REAL :: zone_trans_pmax
&amp;nbsp;&amp;nbsp;&amp;nbsp; REAL::unit_pmax,unit_pmin
&amp;nbsp;&amp;nbsp;&amp;nbsp; CHARACTER (len=1) :: unit_type
&amp;nbsp;&amp;nbsp;&amp;nbsp; REAL::peak_dc,valley_dc,peak_ac,valley_ac
&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER::i,j
&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER::unit_data_num
&amp;nbsp;&amp;nbsp;&amp;nbsp; CHARACTER(len=1000)::data_str
&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE(unit_data),POINTER::head_unit,tail_unit,ptr_unit
&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE(unit_data)::current_unit
&amp;nbsp;&amp;nbsp;&amp;nbsp; LOGICAL::DATA_READING=.FALSE.
&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER::result_string_scan=0
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER::load_data_num
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; CHARACTER (len=4) :: load_zone
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; REAL::peak_load,valley_load,peak_total_load,valley_total_load
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE(load_data),POINTER::head_load,tail_load,ptr_load
&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER::size_of_variable
&amp;nbsp;&amp;nbsp;&amp;nbsp; NULLIFY(tail_load)
&amp;nbsp;&amp;nbsp;&amp;nbsp; NULLIFY(head_load)
&amp;nbsp;&amp;nbsp;&amp;nbsp; NULLIFY(head_unit)
&amp;nbsp;&amp;nbsp;&amp;nbsp; NULLIFY(tail_unit)
&amp;nbsp;&amp;nbsp;&amp;nbsp; !NULLIFY(head_variable)
&amp;nbsp;&amp;nbsp;&amp;nbsp; !NULLIFY(tail_variable)
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; OPEN(UNIT=20,FILE='上海机组小开机.txt',ACTION='READ')
&amp;nbsp;&amp;nbsp;&amp;nbsp; load_data_num=0
&amp;nbsp;&amp;nbsp;&amp;nbsp; unit_data_num=0
&amp;nbsp;&amp;nbsp;&amp;nbsp; DO !读入机组数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; READ(20,'(A)') data_str
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result_string_scan=INDEX(data_str,'end_of_unit_data')
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (result_string_scan/=0)THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DATA_READING=.FALSE.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXIT
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF(data_str(1:1)=='.')THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CYCLE
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (DATA_READING==.TRUE.)THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; READ(data_str,*)unit_name,unit_zone,zone_trans_pmax,unit_pmax,unit_pmin,unit_type
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CALL unit_data_add(tail_unit,head_unit,unit_name,unit_zone,zone_trans_pmax,unit_pmax, unit_pmin,unit_type,unit_data_num)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result_string_scan=INDEX(data_str,'begin_unit_data')
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (result_string_scan/=0)THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DATA_READING=.TRUE.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !result_string_scan=INDEX(data_str,'end_of_unit_data')
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !IF (result_string_scan/=0)THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !&amp;nbsp;&amp;nbsp;&amp;nbsp; DATA_READING=.FALSE.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !&amp;nbsp;&amp;nbsp;&amp;nbsp; EXIT
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; END DO
&amp;nbsp;&amp;nbsp;&amp;nbsp; peak_total_load=0
&amp;nbsp;&amp;nbsp;&amp;nbsp; DO !读入分区负荷数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; READ(20,'(A)') data_str
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result_string_scan=INDEX(data_str,'end_of_load_data')
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (result_string_scan/=0)THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DATA_READING=.FALSE.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXIT
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF(data_str(1:1)=='.')THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CYCLE
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (DATA_READING==.TRUE.)THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; READ(data_str,*)load_zone,peak_load,valley_load,zone_trans_pmax
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CALL load_data_add(tail_load,head_load,load_zone,peak_load,valley_load,zone_trans_pmax,load_data_num)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; peak_total_load=peak_total_load+peak_load
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result_string_scan=INDEX(data_str,'begin_load_data')
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (result_string_scan/=0)THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DATA_READING=.TRUE.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !result_string_scan=INDEX(data_str,'end_of_load_data')
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !IF (result_string_scan/=0)THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !&amp;nbsp;&amp;nbsp;&amp;nbsp; DATA_READING=.FALSE.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !&amp;nbsp;&amp;nbsp;&amp;nbsp; EXIT
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; END DO
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; DO !读入高峰低谷区外来电数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; READ(20,'(A)') data_str
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result_string_scan=INDEX(data_str,'end_of_power_injection_data')
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (result_string_scan/=0)THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DATA_READING=.FALSE.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXIT
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF(data_str(1:1)=='.')THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CYCLE
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (DATA_READING==.TRUE.)THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; READ(data_str,*)peak_dc,valley_dc,peak_ac,valley_ac
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result_string_scan=INDEX(data_str,'begin_power_injection_data')
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (result_string_scan/=0)THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DATA_READING=.TRUE.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !result_string_scan=INDEX(data_str,'end_of_load_data')
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !IF (result_string_scan/=0)THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !&amp;nbsp;&amp;nbsp;&amp;nbsp; DATA_READING=.FALSE.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !&amp;nbsp;&amp;nbsp;&amp;nbsp; EXIT
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; END DO
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; CLOSE(20)
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
END SUBROUTINE read_optimization_para
END MODULE
&amp;nbsp;&amp;nbsp;&amp;nbsp; 

&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; program shuc
&amp;nbsp;&amp;nbsp;&amp;nbsp; include 'link_fnl_shared.h'&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; include 'link_fnl_static.h' 
&amp;nbsp;&amp;nbsp;&amp;nbsp; use lin_eig_self_int
&amp;nbsp;&amp;nbsp;&amp;nbsp; use lin_sol_svd_int
&amp;nbsp;&amp;nbsp;&amp;nbsp; USE WRRRN_INT
&amp;nbsp;&amp;nbsp;&amp;nbsp; USE NNLPF_INT
&amp;nbsp;&amp;nbsp;&amp;nbsp; USE my_data_type
&amp;nbsp;&amp;nbsp;&amp;nbsp; USE READ_DATA

&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; IMPLICIT NONE
&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER::IBTYPE=0
&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER::M, ME
&amp;nbsp;&amp;nbsp;&amp;nbsp; CHARACTER (len=8) :: unit_name
&amp;nbsp;&amp;nbsp;&amp;nbsp; CHARACTER (len=4) :: unit_zone
&amp;nbsp;&amp;nbsp;&amp;nbsp; !REAL :: zone_trans_pmax
&amp;nbsp;&amp;nbsp;&amp;nbsp; !REAL::unit_pmax,unit_pmin
&amp;nbsp;&amp;nbsp;&amp;nbsp; !CHARACTER (len=1) :: unit_type
&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER::variable_num=0
&amp;nbsp;&amp;nbsp;&amp;nbsp; REAL::k=1
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; REAL::peak_dc,valley_dc,peak_ac,valley_ac!高峰低谷时段区外直流、交流来电
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER,PARAMETER::N=4
&amp;nbsp;&amp;nbsp;&amp;nbsp; !REAL::A(N,N)
&amp;nbsp;&amp;nbsp;&amp;nbsp; !REAL::D(N)
&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER::i,j
&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER::unit_data_num
&amp;nbsp;&amp;nbsp;&amp;nbsp; !CHARACTER(len=1000)::data_str
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE(unit_data),POINTER::head_unit,ptr_unit
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; !TYPE(unit_data)::current_unit
&amp;nbsp;&amp;nbsp;&amp;nbsp; !LOGICAL::DATA_READING=.FALSE.
&amp;nbsp;&amp;nbsp;&amp;nbsp; !INTEGER::result_string_scan=0
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER::load_data_num
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; !CHARACTER (len=4) :: load_zone
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; !REAL::peak_load,valley_load,peak_total_load,valley_total_load
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE(load_data),POINTER::head_load,ptr_load
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; !TYPE(variable),POINTER::head_variable,tail_variable
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER::size_of_variable
&amp;nbsp;&amp;nbsp;&amp;nbsp; REAL(KIND(1E0)) FVALUE, X(300), XGUESS(300), XLB(300), XUB(300)
&amp;nbsp;&amp;nbsp;&amp;nbsp; EXTERNAL FCN
&amp;nbsp;&amp;nbsp;&amp;nbsp; NULLIFY(ptr_load)
&amp;nbsp;&amp;nbsp;&amp;nbsp; NULLIFY(ptr_unit)

&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; CALL read_optimization_para(peak_dc,valley_dc,peak_ac,valley_ac,head_unit,unit_data_num,head_load,load_data_num)

&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; !ME=2!等式约束两个，分别为整数约束和高峰电力平衡约束
&amp;nbsp;&amp;nbsp;&amp;nbsp; !M=2*load_data_num+ME!总约束为：分区数*2（高峰、低谷分区主变不过载）+ME
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; !!定义变量列表
&amp;nbsp;&amp;nbsp;&amp;nbsp; !DO i =1,3*unit_data_num
&amp;nbsp;&amp;nbsp;&amp;nbsp; !&amp;nbsp;&amp;nbsp; CALL variable_add(tail_variable,head_variable,variable_num)
&amp;nbsp;&amp;nbsp;&amp;nbsp; !END DO
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; !size_of_variable=3*unit_data_num
&amp;nbsp;&amp;nbsp;&amp;nbsp; !
&amp;nbsp;&amp;nbsp;&amp;nbsp; M=2
&amp;nbsp;&amp;nbsp;&amp;nbsp; ME=1
&amp;nbsp;&amp;nbsp;&amp;nbsp; ptr_unit=&amp;gt;head_unit
&amp;nbsp;&amp;nbsp;&amp;nbsp; DO i=1,unit_data_num
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XLB(i)=ptr_unit%unit_pmin
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XUB(i)=ptr_unit%unit_pmax
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ptr_unit=&amp;gt;ptr_unit%next_unit_data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XGUESS(i)=1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XGUESS(i+unit_data_num)=XUB(i)!迭代初始方式为高峰、低谷全开机满发
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XGUESS(i+2*unit_data_num)=XUB(i)
&amp;nbsp;&amp;nbsp;&amp;nbsp; END DO
&amp;nbsp;&amp;nbsp;&amp;nbsp; NULLIFY(ptr_unit)
&amp;nbsp;&amp;nbsp;&amp;nbsp; !XLB = -HUGE(X(1))
&amp;nbsp;&amp;nbsp;&amp;nbsp; !XUB = HUGE(X(1))
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; CALL NNLPF (FCN, M, ME, IBTYPE, XLB, XUB, X,IPRINT=1)
&amp;nbsp;&amp;nbsp;&amp;nbsp; !DO i =1,size(X)
&amp;nbsp;&amp;nbsp;&amp;nbsp; !&amp;nbsp;&amp;nbsp;&amp;nbsp; write(*,'(F4.0)')X(i)
&amp;nbsp;&amp;nbsp;&amp;nbsp; !END DO
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; CALL WRRRN ('The solution is', X)
&amp;nbsp;&amp;nbsp;&amp;nbsp; pause

&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;



&amp;nbsp;&amp;nbsp;&amp;nbsp; end program shuc
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
SUBROUTINE FCN (X, IACT, RESULT, IERR)
USE READ_DATA
USE my_data_type
INTEGER IACT
REAL(KIND(1E0)) X(*), RESULT
LOGICAL IERR



INTEGER::variable_num

REAL::peak_dc,valley_dc,peak_ac,valley_ac!高峰低谷时段区外直流、交流来电
INTEGER::i,j
INTEGER::unit_data_num=0

&amp;nbsp;&amp;nbsp;&amp;nbsp; 
TYPE(unit_data),POINTER::head_unit,ptr_unit
&amp;nbsp;&amp;nbsp;&amp;nbsp; 


&amp;nbsp;&amp;nbsp;&amp;nbsp; 
INTEGER::load_data_num=0



REAL::peak_total_load,valley_total_load
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
TYPE(load_data),POINTER::head_load,ptr_load
&amp;nbsp;&amp;nbsp;&amp;nbsp; 

TYPE(variable),POINTER::head_variable
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
NULLIFY(ptr_load)
NULLIFY(ptr_unit)
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
CALL read_optimization_para(peak_dc,valley_dc,peak_ac,valley_ac,head_unit,unit_data_num,head_load,load_data_num)
peak_total_load=0
valley_total_load=0
ptr_load=&amp;gt;head_load
DO i =1,load_data_num
&amp;nbsp;&amp;nbsp;&amp;nbsp; peak_total_load=peak_total_load+ptr_load%peak_load
&amp;nbsp;&amp;nbsp;&amp;nbsp; valley_total_load=valley_total_load+ptr_load%valley_load
&amp;nbsp;&amp;nbsp;&amp;nbsp; ptr_load=&amp;gt;ptr_load%next_load_data
END DO
&amp;nbsp;&amp;nbsp;&amp;nbsp; 



variable_num=3*unit_data_num
WRITE(*,*) peak_total_load,peak_ac,peak_dc


IF(IACT==0)THEN!目标函数，低谷本地调峰缺口最小
&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT=0
&amp;nbsp;&amp;nbsp;&amp;nbsp; DO i=1,unit_data_num
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT =RESULT+ X(i)*X(i+unit_data_num*2)
&amp;nbsp;&amp;nbsp;&amp;nbsp; END DO
&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT=RESULT-valley_total_load-valley_ac-valley_dc
ELSEIF(IACT==1)THEN!高峰电力平衡约束
&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT=0
&amp;nbsp;&amp;nbsp;&amp;nbsp; DO i=1,unit_data_num
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT =RESULT+ X(i)*X(i+unit_data_num)
&amp;nbsp;&amp;nbsp;&amp;nbsp; END DO
&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT=RESULT-peak_total_load-peak_ac-peak_dc
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
ELSEIF(IACT==2)THEN!机组开机状态0-1约束
&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT=0
&amp;nbsp;&amp;nbsp;&amp;nbsp; DO i=1,unit_data_num
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT=RESULT+X(i)**2*(1-X(i))**2
&amp;nbsp;&amp;nbsp;&amp;nbsp; END DO
ELSEIF(IACT&amp;lt;=3+load_data_num)THEN !高峰主变过载约束
&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (IACT==3)THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ptr_load=&amp;gt;head_load
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT=ptr_load%zone_trans_pmax-ptr_load%peak_load
&amp;nbsp;&amp;nbsp;&amp;nbsp; ptr_unit=&amp;gt;head_unit
&amp;nbsp;&amp;nbsp;&amp;nbsp; DO i =1,unit_data_num
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (ptr_unit%unit_zone==ptr_load%load_zone)THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT=RESULT+X(i+unit_data_num)*X(i)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ptr_unit=&amp;gt;ptr_unit%next_unit_data
&amp;nbsp;&amp;nbsp;&amp;nbsp; END DO
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; ptr_load=&amp;gt;ptr_load%next_load_data
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
ELSEIF(IACT&amp;lt;=3+2*load_data_num)THEN !低谷主变过载约束

&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (IACT==3)THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ptr_load=&amp;gt;head_load
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT=ptr_load%zone_trans_pmax-ptr_load%valley_load
&amp;nbsp;&amp;nbsp;&amp;nbsp; ptr_unit=&amp;gt;head_unit
&amp;nbsp;&amp;nbsp;&amp;nbsp; DO i =1,unit_data_num
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (ptr_unit%unit_zone==ptr_load%load_zone)THEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT=RESULT+X(i+2*unit_data_num)*X(i)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ptr_unit=&amp;gt;ptr_unit%next_unit_data
&amp;nbsp;&amp;nbsp;&amp;nbsp; END DO
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; ptr_load=&amp;gt;ptr_load%next_load_data
END IF


RETURN
END&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
i don't know if it will work,and there are so many "can't find or open PDB files" when linking ,and the .exe just exit without any results,shown in the following picture.

could you help me again?  thanks very much!!
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;span class="lia-inline-image-display-wrapper" image-alt="my_outputs_windows.jpg"&gt;&lt;img src="https://community.intel.com/t5/image/serverpage/image-id/6882i7968372FDCBCE48F/image-size/large?v=v2&amp;amp;px=999&amp;amp;whitelist-exif-data=Orientation%2CResolution%2COriginalDefaultFinalSize%2CCopyright" role="button" title="my_outputs_windows.jpg" alt="my_outputs_windows.jpg" /&gt;&lt;/span&gt;&lt;/PRE&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 06 Nov 2014 23:39:23 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808579#M41516</guid>
      <dc:creator>huang_l_</dc:creator>
      <dc:date>2014-11-06T23:39:23Z</dc:date>
    </item>
    <item>
      <title>Ignore the "can't find or</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808580#M41517</link>
      <description>&lt;P&gt;Ignore the "can't find or open PDB file" messages when you start debugging (not linking). They are not important. I also suggest that if you want to include longer sources, please attach them as .f90 files rather than inserting into the post.&lt;/P&gt;</description>
      <pubDate>Fri, 07 Nov 2014 00:01:41 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808580#M41517</guid>
      <dc:creator>Steven_L_Intel1</dc:creator>
      <dc:date>2014-11-07T00:01:41Z</dc:date>
    </item>
    <item>
      <title>Your code compiles and links</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808581#M41518</link>
      <description>&lt;P&gt;Your code compiles and links with no errors, but to run it the data file is needed.&lt;/P&gt;

&lt;P&gt;Whether you use SELECT constructs or not is up to you. If you can group your constraints into, say, three blocks, with all the constraints in each block being of similar form, you could do something similar to&lt;/P&gt;

&lt;P&gt;&amp;nbsp; &amp;nbsp;if (iact.gt.0.and.iact.le.500) then&lt;/P&gt;

&lt;P&gt;......&lt;/P&gt;

&lt;P&gt;else if(iact .lt. 1000) then&lt;/P&gt;

&lt;P&gt;&amp;nbsp; &amp;nbsp;result = x(iact) - x(iact+400)&lt;/P&gt;

&lt;P&gt;else&lt;/P&gt;

&lt;P&gt;.....&lt;/P&gt;

&lt;P&gt;endif&lt;/P&gt;</description>
      <pubDate>Fri, 07 Nov 2014 01:48:42 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808581#M41518</guid>
      <dc:creator>mecej4</dc:creator>
      <dc:date>2014-11-07T01:48:42Z</dc:date>
    </item>
    <item>
      <title>Quote:mecej4 wrote:</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808582#M41519</link>
      <description>&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;mecej4 wrote:&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;Your code compiles and links with no errors, but to run it the data file is needed.&lt;/P&gt;

&lt;P&gt;Whether you use SELECT constructs or not is up to you. If you can group your constraints into, say, three blocks, with all the constraints in each block being of similar form, you could do something similar to&lt;/P&gt;

&lt;P&gt;&amp;nbsp; &amp;nbsp;if (iact.gt.0.and.iact.le.500) then&lt;/P&gt;

&lt;P&gt;......&lt;/P&gt;

&lt;P&gt;else if(iact .lt. 1000) then&lt;/P&gt;

&lt;P&gt;&amp;nbsp; &amp;nbsp;result = x(iact) - x(iact+400)&lt;/P&gt;

&lt;P&gt;else&lt;/P&gt;

&lt;P&gt;.....&lt;/P&gt;

&lt;P&gt;endif&lt;/P&gt;

&lt;P&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;i have uploaded my .f90 files and the .txt input files needed to run the program in the attachments.&lt;/P&gt;

&lt;P&gt;but it can't get any result in the output&amp;nbsp; cmd window.&lt;/P&gt;

&lt;P&gt;i also try the "CALL NNLPF (FCN, M, ME, IBTYPE, XLB, XUB, X,XGUESS,IPRINT=1)" , where i offered my XGUESS as an initial guess of the solution, which i think is helpful to get the right answer,but i get an err as following:&lt;/P&gt;

&lt;P&gt;error #6285: There is no matching specific subroutine for this generic subroutine call.&amp;nbsp;&amp;nbsp; [NNLPF]&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;can you help me? thanks a lot!&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 12 Nov 2014 14:00:47 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808582#M41519</guid>
      <dc:creator>huang_l_</dc:creator>
      <dc:date>2014-11-12T14:00:47Z</dc:date>
    </item>
    <item>
      <title>There are several errors in</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808583#M41520</link>
      <description>&lt;P&gt;There are several errors in your program. You have declared several arrays that should be of size N (= the number of variables in the optimization problem) with dimension (300). The IMSL optimization routine obtains N from the size of the array passed to it, so it thinks that N = 300, whereas you want N = 21.&lt;/P&gt;

&lt;P&gt;The input bounds must satisfy xlb &amp;lt; xub. You have several variables for which the bounds given satisfy xlb = xub. Do you want those elements of x() to be fixed at the bound values? If so, reformulate the problem by separating variable variables and fixed "variables".&lt;/P&gt;

&lt;P&gt;To pass an optional argument in Fortran 90, you have to follow certain rules. To pass XGUESS, you need to write ",XGUESS=XGUESS", using the keyword name.&lt;/P&gt;

&lt;P&gt;You should not use the == or .EQ. operators to compare logical expressions. Use .EQV. instead.&lt;/P&gt;

&lt;P&gt;Your FCN subroutine is rather long and complicated. Have you checked whether all the components of the objective and constraints are calculated correctly? If not, I suggest that you replace the call to NNLPF with several calls&amp;nbsp;&amp;nbsp;"&lt;STRONG&gt;CALL FCN(xguess,Iact,fvalue,ierr)&lt;/STRONG&gt;" with different values of &lt;STRONG&gt;Iact&lt;/STRONG&gt;, remove all references to IMSL, and run with runtime checks turned on for uninitialized variables, array bound errors and so forth. I have a suspicion that your linked list of pointers is such that some uninitialized pointers are being dereferenced.&lt;/P&gt;

&lt;P&gt;The routine also calls "read_optimization_para" at its beginning, which means that the data file gets read and data structures get initialized hundreds of times. Is this really necessary?&lt;/P&gt;</description>
      <pubDate>Wed, 12 Nov 2014 14:57:00 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808583#M41520</guid>
      <dc:creator>mecej4</dc:creator>
      <dc:date>2014-11-12T14:57:00Z</dc:date>
    </item>
    <item>
      <title>Quote:mecej4 wrote:</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808584#M41521</link>
      <description>&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;mecej4 wrote:&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;There are several errors in your program. You have declared several arrays that should be of size N (= the number of variables in the optimization problem) with dimension (300). The IMSL optimization routine obtains N from the size of the array passed to it, so it thinks that N = 300, whereas you want N = 21.&lt;/P&gt;

&lt;P&gt;The input bounds must satisfy xlb &amp;lt; xub. You have several variables for which the bounds given satisfy xlb = xub. Do you want those elements of x() to be fixed at the bound values? If so, reformulate the problem by separating variable variables and fixed "variables".&lt;/P&gt;

&lt;P&gt;To pass an optional argument in Fortran 90, you have to follow certain rules. To pass XGUESS, you need to write ",XGUESS=XGUESS", using the keyword name.&lt;/P&gt;

&lt;P&gt;You should not use the == or .EQ. operators to compare logical expressions. Use .EQV. instead.&lt;/P&gt;

&lt;P&gt;Your FCN subroutine is rather long and complicated. Have you checked whether all the components of the objective and constraints are calculated correctly? If not, I suggest that you replace the call to NNLPF with several calls&amp;nbsp;&amp;nbsp;"&lt;STRONG&gt;CALL FCN(xguess,Iact,fvalue,ierr)&lt;/STRONG&gt;" with different values of &lt;STRONG&gt;Iact&lt;/STRONG&gt;, remove all references to IMSL, and run with runtime checks turned on for uninitialized variables, array bound errors and so forth. I have a suspicion that your linked list of pointers is such that some uninitialized pointers are being dereferenced.&lt;/P&gt;

&lt;P&gt;The routine also calls "read_optimization_para" at its beginning, which means that the data file gets read and data structures get initialized hundreds of times. Is this really necessary?&lt;/P&gt;

&lt;P&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;i have modified my codes and it can run to an result now,even though the result is not what i think is correct. i guess the possible reason is that the NNLPF routine is not desighed to find global solution.&lt;/P&gt;

&lt;P&gt;actually, in my equality contraints below:&lt;/P&gt;

&lt;PRE class="brush:fortran;"&gt;ELSEIF(IACT==2)THEN!the 0-1constraints
&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT=0
&amp;nbsp;&amp;nbsp;&amp;nbsp; DO i=1,unit_data_num
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT=RESULT+X(i)**2*(1-X(i))**2*9999
&amp;nbsp;&amp;nbsp;&amp;nbsp; END DO&lt;/PRE&gt;

&lt;P&gt;i just want my X(1,len(X)/3)={0,1}, that is binaray numbers. but i can't find the routine that can solve optimization problem containing binaray&amp;nbsp; variables in the help document. so can you tell me which routine to use to solve this problem?&lt;/P&gt;

&lt;P&gt;thanks very much!&lt;/P&gt;</description>
      <pubDate>Thu, 13 Nov 2014 06:27:43 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808584#M41521</guid>
      <dc:creator>huang_l_</dc:creator>
      <dc:date>2014-11-13T06:27:43Z</dc:date>
    </item>
    <item>
      <title>supplimentary comments: my</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808585#M41522</link>
      <description>&lt;P&gt;supplimentary comments: my equality and unequlity constraints consists of X&lt;SUB&gt;i&lt;/SUB&gt;*X&lt;SUB&gt;i+unit_num &lt;/SUB&gt;items,where X&lt;SUB&gt;&lt;FONT size="2"&gt;i&lt;/FONT&gt;&lt;/SUB&gt;&lt;FONT size="2"&gt;&amp;nbsp; (i&amp;gt;=1 and i&amp;lt;=unit_num )are binary variables(0-1) and &lt;/FONT&gt;X&lt;SUB&gt;&lt;FONT size="2"&gt;i+unit_num &lt;/FONT&gt;&lt;/SUB&gt;items(&lt;SUB&gt;&lt;FONT size="2"&gt;unit_num&lt;/FONT&gt;&lt;/SUB&gt;&amp;nbsp; is a constant) are real numbers. jusu like the&amp;nbsp;following constraints :&lt;/P&gt;

&lt;P&gt;&amp;nbsp;X&lt;SUB&gt;&lt;FONT size="2"&gt;1&lt;/FONT&gt;&lt;/SUB&gt;*X&lt;SUB&gt;1&lt;FONT size="2"&gt;+unit_num +&lt;/FONT&gt;&lt;/SUB&gt;&amp;nbsp;X&lt;SUB&gt;&lt;FONT size="2"&gt;2&lt;/FONT&gt;&lt;/SUB&gt;*X&lt;SUB&gt;&lt;FONT size="2"&gt;2+unit_num &lt;/FONT&gt;&lt;/SUB&gt;&lt;FONT size="2"&gt;+.....+&lt;/FONT&gt;&amp;nbsp;X&lt;SUB&gt;&lt;FONT size="2"&gt;unit_num &lt;/FONT&gt;&lt;/SUB&gt;*X&lt;SUB&gt;&lt;FONT size="2"&gt;unit_num +unit_num &lt;/FONT&gt;&lt;/SUB&gt;&lt;FONT size="2"&gt;=constant&lt;SUB&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SUB&gt;&lt;/FONT&gt;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;X&lt;SUB&gt;&lt;FONT size="2"&gt;1&lt;/FONT&gt;&lt;/SUB&gt;*X&lt;SUB&gt;&lt;FONT size="2"&gt;1+unit_num +&lt;/FONT&gt;&lt;/SUB&gt; X&lt;SUB&gt;&lt;FONT size="2"&gt;2&lt;/FONT&gt;&lt;/SUB&gt;*X&lt;SUB&gt;&lt;FONT size="2"&gt;2+unit_num &lt;/FONT&gt;&lt;/SUB&gt;&lt;FONT size="2"&gt;&amp;gt;=constant&lt;SUB&gt;2&lt;/SUB&gt;&lt;/FONT&gt;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;X&lt;SUB&gt;&lt;FONT size="2"&gt;3&lt;/FONT&gt;&lt;/SUB&gt;*X&lt;SUB&gt;&lt;FONT size="2"&gt;3+unit_num +&lt;/FONT&gt;&lt;/SUB&gt; X&lt;SUB&gt;&lt;FONT size="2"&gt;4&lt;/FONT&gt;&lt;/SUB&gt;*X&lt;SUB&gt;&lt;FONT size="2"&gt;4+unit_num +&lt;/FONT&gt;&lt;/SUB&gt;X&lt;SUB&gt;&lt;FONT size="2"&gt;5&lt;/FONT&gt;&lt;/SUB&gt;*X&lt;SUB&gt;&lt;FONT size="2"&gt;5+unit_num &lt;/FONT&gt;&lt;/SUB&gt;&lt;FONT size="2"&gt;&amp;gt;=&lt;/FONT&gt;&lt;FONT size="2"&gt;&amp;gt;=constant&lt;SUB&gt;3&lt;/SUB&gt;&lt;/FONT&gt;&lt;/P&gt;

&lt;P&gt;X&lt;SUB&gt;&lt;FONT size="2"&gt;6&lt;/FONT&gt;&lt;/SUB&gt;*X&lt;SUB&gt;&lt;FONT size="2"&gt;6+unit_num +&lt;/FONT&gt;&lt;/SUB&gt; X&lt;SUB&gt;&lt;FONT size="2"&gt;7&lt;/FONT&gt;&lt;/SUB&gt;*X&lt;SUB&gt;&lt;FONT size="2"&gt;7+unit_num +&lt;/FONT&gt;&lt;/SUB&gt;X&lt;SUB&gt;&lt;FONT size="2"&gt;8&lt;/FONT&gt;&lt;/SUB&gt;*X&lt;SUB&gt;&lt;FONT size="2"&gt;8+unit_num &lt;/FONT&gt;&lt;/SUB&gt;&lt;FONT size="2"&gt;+&lt;/FONT&gt;X&lt;SUB&gt;&lt;FONT size="2"&gt;9&lt;/FONT&gt;&lt;/SUB&gt;*X&lt;SUB&gt;9&lt;FONT size="2"&gt;+unit_num &lt;/FONT&gt;&lt;/SUB&gt;&lt;FONT size="2"&gt;+&lt;/FONT&gt;X&lt;SUB&gt;&lt;FONT size="2"&gt;10&lt;/FONT&gt;&lt;/SUB&gt;*X&lt;SUB&gt;&lt;FONT size="2"&gt;10+unit_num &lt;/FONT&gt;&lt;/SUB&gt;&lt;FONT size="2"&gt;&amp;gt;=constant&lt;SUB&gt;4&lt;/SUB&gt;&lt;/FONT&gt;&lt;/P&gt;

&lt;P&gt;&lt;FONT size="2"&gt;&lt;SUB&gt;.........&lt;/SUB&gt;&lt;/FONT&gt;&lt;/P&gt;

&lt;P&gt;&lt;FONT size="2"&gt;is there any routine to solve this problem in the IMSL package?&lt;/FONT&gt;&lt;/P&gt;

&lt;P&gt;&lt;FONT size="2"&gt;thanks!&lt;/FONT&gt;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 13 Nov 2014 09:24:57 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808585#M41522</guid>
      <dc:creator>huang_l_</dc:creator>
      <dc:date>2014-11-13T09:24:57Z</dc:date>
    </item>
    <item>
      <title>If you want to do pseudo</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808586#M41523</link>
      <description>&lt;P&gt;If you want to do pseudo-boolean variable optimization and/or global optimization, you will have to look elsewhere for suitable algorithms. Consult Prof. Mittelmann's site at&amp;nbsp;http://plato.asu.edu/guide.html .&lt;/P&gt;</description>
      <pubDate>Thu, 13 Nov 2014 10:38:26 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808586#M41523</guid>
      <dc:creator>mecej4</dc:creator>
      <dc:date>2014-11-13T10:38:26Z</dc:date>
    </item>
    <item>
      <title>Quote:mecej4 wrote:</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808587#M41524</link>
      <description>&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;mecej4 wrote:&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;If you want to do pseudo-boolean variable optimization and/or global optimization, you will have to look elsewhere for suitable algorithms. Consult Prof. Mittelmann's site at&amp;nbsp;&lt;A href="http://plato.asu.edu/guide.html"&gt;http://plato.asu.edu/guide.html&lt;/A&gt; .&lt;/P&gt;

&lt;P&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;thanks very much!&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 13 Nov 2014 13:30:58 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808587#M41524</guid>
      <dc:creator>huang_l_</dc:creator>
      <dc:date>2014-11-13T13:30:58Z</dc:date>
    </item>
    <item>
      <title>Quote:huang l. wrote:</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808588#M41525</link>
      <description>&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;huang l. wrote:&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;&lt;STRONG class="quote-header"&gt;Quote:&lt;/STRONG&gt;&lt;/P&gt;

&lt;BLOCKQUOTE class="quote-msg quote-nest-1 odd"&gt;
	&lt;DIV class="quote-author"&gt;&lt;EM class="placeholder"&gt;mecej4&lt;/EM&gt; wrote:&lt;/DIV&gt;

	&lt;P&gt;&amp;nbsp;&lt;/P&gt;

	&lt;P&gt;There are several errors in your program. You have declared several arrays that should be of size N (= the number of variables in the optimization problem) with dimension (300). The IMSL optimization routine obtains N from the size of the array passed to it, so it thinks that N = 300, whereas you want N = 21.&lt;/P&gt;

	&lt;P&gt;The input bounds must satisfy xlb &amp;lt; xub. You have several variables for which the bounds given satisfy xlb = xub. Do you want those elements of x() to be fixed at the bound values? If so, reformulate the problem by separating variable variables and fixed "variables".&lt;/P&gt;

	&lt;P&gt;To pass an optional argument in Fortran 90, you have to follow certain rules. To pass XGUESS, you need to write ",XGUESS=XGUESS", using the keyword name.&lt;/P&gt;

	&lt;P&gt;You should not use the == or .EQ. operators to compare logical expressions. Use .EQV. instead.&lt;/P&gt;

	&lt;P&gt;Your FCN subroutine is rather long and complicated. Have you checked whether all the components of the objective and constraints are calculated correctly? If not, I suggest that you replace the call to NNLPF with several calls&amp;nbsp;&amp;nbsp;"&lt;STRONG&gt;CALL FCN(xguess,Iact,fvalue,ierr)&lt;/STRONG&gt;" with different values of &lt;STRONG&gt;Iact&lt;/STRONG&gt;, remove all references to IMSL, and run with runtime checks turned on for uninitialized variables, array bound errors and so forth. I have a suspicion that your linked list of pointers is such that some uninitialized pointers are being dereferenced.&lt;/P&gt;

	&lt;P&gt;The routine also calls "read_optimization_para" at its beginning, which means that the data file gets read and data structures get initialized hundreds of times. Is this really necessary?&lt;/P&gt;

	&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;i have modified my codes and it can run to an result now,even though the result is not what i think is correct. i guess the possible reason is that the NNLPF routine is not desighed to find global solution.&lt;/P&gt;

&lt;P&gt;actually, in my equality contraints below:&lt;/P&gt;

&lt;PRE class="brush:fortran;"&gt;ELSEIF(IACT==2)THEN!the 0-1constraints
&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT=0
&amp;nbsp;&amp;nbsp;&amp;nbsp; DO i=1,unit_data_num
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT=RESULT+X(i)**2*(1-X(i))**2*9999
&amp;nbsp;&amp;nbsp;&amp;nbsp; END DO&lt;/PRE&gt;

&lt;P&gt;i just want my X(1,len(X)/3)={0,1}, that is binaray numbers. but i can't find the routine that can solve optimization problem containing binaray&amp;nbsp; variables in the help document. so can you tell me which routine to use to solve this problem?&lt;/P&gt;

&lt;P&gt;thanks very much!&lt;/P&gt;

&lt;P&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;i have another question here that why the indicated result after iteration doesn't meet the 1st equality constraints as shown below?&lt;/P&gt;

&lt;PRE class="brush:fortran;"&gt;ELSEIF(IACT==1)THEN!高峰电力平衡约束
&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT=0
&amp;nbsp;&amp;nbsp;&amp;nbsp; DO i=1,unit_data_num
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local_p_peak =local_p_peak+ X(i)*X(i+unit_data_num)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT =RESULT+ X(i)*X(i+unit_data_num)
&amp;nbsp;&amp;nbsp;&amp;nbsp; END DO
&amp;nbsp;&amp;nbsp;&amp;nbsp; RESULT=RESULT-peak_total_load+peak_ac+peak_dc

thank you again!&lt;/PRE&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sun, 16 Nov 2014 13:43:00 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808588#M41525</guid>
      <dc:creator>huang_l_</dc:creator>
      <dc:date>2014-11-16T13:43:00Z</dc:date>
    </item>
    <item>
      <title>Quote:why the indicated</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808589#M41526</link>
      <description>&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;SPAN style="font-size: 17.7777786254883px; line-height: 20px;"&gt;why the indicated result after iteration doesn't meet the 1st equality constraints as shown below&lt;/SPAN&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;&lt;SPAN style="font-size: 17.7777786254883px; line-height: 20px;"&gt;The IMSL routine gave up on the calculation and returned without any iterations. In fact, it did not even evaluate the object function once before giving up. See this part of the output:&lt;/SPAN&gt;&lt;/P&gt;

&lt;P&gt;TERMINATION REASON:&lt;BR /&gt;
	STEPSIZESELECTION: NO ACCEPTABLE STEPSIZE IN [SIGSM,SIGLA]&lt;BR /&gt;
	EVALUATIONS OF F &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;BR /&gt;
	EVALUATIONS OF GRAD F &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;BR /&gt;
	EVALUATIONS OF CONSTRAINTS &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;16535&lt;BR /&gt;
	EVALUATIONS OF GRADS OF CONSTRAINTS &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;/P&gt;

&lt;P&gt;I would not be brave enough to try such a large problem without having good starting data. You have set the bounds as (-1,2) for many variables, and the starting value as 1. Are these reasonable? Can you do better? I am not going to be of much help in this part because I have no knowledge of the application area. Do the variables have units (metres, pascals, volts, etc.)?&lt;/P&gt;</description>
      <pubDate>Sun, 16 Nov 2014 21:10:14 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/use-NNLPF-or-NNLPG-in-fortran-IMSL/m-p/808589#M41526</guid>
      <dc:creator>mecej4</dc:creator>
      <dc:date>2014-11-16T21:10:14Z</dc:date>
    </item>
  </channel>
</rss>

