diff --git a/.github/build_real.sh b/.github/build_real.sh index 0482dcc3..27404ea3 100755 --- a/.github/build_real.sh +++ b/.github/build_real.sh @@ -14,4 +14,4 @@ touch ~/.config/pip/constraints.txt pip install .[optview,testing] -v # move pip constraints file back -mv ~/.config/pip/constraints.txt.bkup ~/.config/pip/constraints.txt \ No newline at end of file +mv ~/.config/pip/constraints.txt.bkup ~/.config/pip/constraints.txt diff --git a/.github/workflows/linux-build.yml b/.github/workflows/linux-build.yml index ba4f70a6..b1822820 100644 --- a/.github/workflows/linux-build.yml +++ b/.github/workflows/linux-build.yml @@ -18,7 +18,7 @@ jobs: versions: [{python: "3.10", numpy: "1.22"}, {python: "3.11", numpy: "1.25"}, {python: "3.12", numpy: "2.1"}] steps: - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v5 with: python-version: ${{ matrix.versions.python }} - name: Install runtime numpy ${{ matrix.versions.numpy }} diff --git a/.gitignore b/.gitignore index 079a5034..5eb691a8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,8 @@ syntax: glob + +# Ignore ruff and pre-commit config files +.pre-commit-config.yaml + build doc/_build *.pyc diff --git a/.zenodo.json b/.zenodo.json index 3d302559..0b6773d0 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -16,4 +16,4 @@ "name": "Joaquim R. R. A. Martins" } ] -} \ No newline at end of file +} diff --git a/doc/_static/pyOptSparse_logo.svg b/doc/_static/pyOptSparse_logo.svg index 8785599b..98fffeee 100644 --- a/doc/_static/pyOptSparse_logo.svg +++ b/doc/_static/pyOptSparse_logo.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/doc/changes.rst b/doc/changes.rst index df441b89..b85309b7 100644 --- a/doc/changes.rst +++ b/doc/changes.rst @@ -15,8 +15,8 @@ The following list summarizes some of the changes/improvements made to pyOpt to * User specification of design variable scaling * User specification of constraint scaling * Design variable returns in dictionary format only -* Specification of linear constraints, dense or sparse -* Sparse non-linear Jacobians +* Specification of linear constraints, dense or sparse +* Sparse non-linear Jacobians * New history file format. Uses SQLite dictionaries. * Fixed hot start bug where first call to user functions is a gradient. It is now guaranteed, that the first call is to the function evaluation, not the gradient. * Various bug fixes in SNOPT diff --git a/doc/guide.rst b/doc/guide.rst index 5140e7c6..0b22f0f4 100644 --- a/doc/guide.rst +++ b/doc/guide.rst @@ -210,7 +210,7 @@ Linear constraints in pyOptSparse are defined exclusively by ``jac``, ``lower``, For linear constraint :math:`g_L \leq Ax + b \leq g_U`, the constraint definition would look like: .. code-block:: python - + optProb.addConGroup("con", num_cons, linear=True, wrt=["xvars"], jac={"xvars": A}, lower=gL - b, upper=gU - b) Users should not provide the linear constraint values (i.e., :math:`g = Ax + b`) in a user-defined objective/constraint function. @@ -310,4 +310,4 @@ See the optimizer-specific documentation page for more details. Postprocessing ++++++++++++++ -The result of the optimization is returned in a :class:`pyoptsparse.pyOpt_solution.Solution` object. \ No newline at end of file +The result of the optimization is returned in a :class:`pyoptsparse.pyOpt_solution.Solution` object. diff --git a/doc/index.rst b/doc/index.rst index 6edc934a..47c4ed5e 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -12,7 +12,7 @@ Some key features of pyOptSparse include: pyOptSparse is a fork of `pyOpt `_. -However, it is not backwards compatible with pyOpt and thus optimization scripts will need to be modified to use pyOptSparse. +However, it is not backwards compatible with pyOpt and thus optimization scripts will need to be modified to use pyOptSparse. Getting Started =============== diff --git a/doc/install.rst b/doc/install.rst index 6d425399..836d9a3f 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -93,7 +93,7 @@ To install pyOptSparse including those dependencies, run pip install .[optview] -If you encounter a ``no module named tkinter`` error when trying to run optview, you may need to `install tkinter on your system `__. +If you encounter a ``no module named tkinter`` error when trying to run optview, you may need to `install tkinter on your system `__. Testing ------- diff --git a/doc/optimizers/CONMIN.rst b/doc/optimizers/CONMIN.rst index b8e334b2..63c1dbd6 100644 --- a/doc/optimizers/CONMIN.rst +++ b/doc/optimizers/CONMIN.rst @@ -16,4 +16,3 @@ API .. autoclass:: CONMIN :members: __call__ - diff --git a/doc/optimizers/IPOPT.rst b/doc/optimizers/IPOPT.rst index e68aec04..e317ac7a 100644 --- a/doc/optimizers/IPOPT.rst +++ b/doc/optimizers/IPOPT.rst @@ -34,4 +34,3 @@ API .. autoclass:: IPOPT :members: __call__ - diff --git a/doc/optimizers/NLPQLP.rst b/doc/optimizers/NLPQLP.rst index 9a15b2b1..d6f65028 100644 --- a/doc/optimizers/NLPQLP.rst +++ b/doc/optimizers/NLPQLP.rst @@ -32,4 +32,3 @@ API .. autoclass:: NLPQLP :members: __call__ - diff --git a/doc/optimizers/NSGA2.rst b/doc/optimizers/NSGA2.rst index 56b3d2a7..2e324a89 100644 --- a/doc/optimizers/NSGA2.rst +++ b/doc/optimizers/NSGA2.rst @@ -26,4 +26,3 @@ API .. autoclass:: NSGA2 :members: __call__ - diff --git a/doc/optimizers/PSQP.rst b/doc/optimizers/PSQP.rst index 526b068c..b6a0a9f2 100644 --- a/doc/optimizers/PSQP.rst +++ b/doc/optimizers/PSQP.rst @@ -22,4 +22,3 @@ API .. autoclass:: PSQP :members: __call__ - diff --git a/doc/optimizers/SLSQP.rst b/doc/optimizers/SLSQP.rst index 68494d8b..246d9c9c 100644 --- a/doc/optimizers/SLSQP.rst +++ b/doc/optimizers/SLSQP.rst @@ -27,4 +27,3 @@ API .. autoclass:: SLSQP :members: __call__ - diff --git a/doc/optimizers/SLSQP_options.yaml b/doc/optimizers/SLSQP_options.yaml index 1027287e..75a777eb 100644 --- a/doc/optimizers/SLSQP_options.yaml +++ b/doc/optimizers/SLSQP_options.yaml @@ -1,10 +1,10 @@ -ACC: +ACC: desc: Convergence Accurancy -MAXIT: +MAXIT: desc: Maximum Iterations -IPRINT: +IPRINT: desc: Output Level (<0 - None, 0 - Screen, 1 - File) -IOUT: +IOUT: desc: Output Unit Number -IFILE: +IFILE: desc: Output File Name diff --git a/doc/optimizers/SNOPT.rst b/doc/optimizers/SNOPT.rst index beeb42ec..c48aa536 100644 --- a/doc/optimizers/SNOPT.rst +++ b/doc/optimizers/SNOPT.rst @@ -16,7 +16,7 @@ Installation Building from source ******************** -SNOPT is available for purchase `here +SNOPT is available for purchase `here `_. Upon purchase, you should receive a zip file. Within the zip file, there is a folder called ``src``. To use SNOPT with pyoptsparse, paste all files from ``src`` except snopth.f into ``pyoptsparse/pySNOPT/source``. From v2.0 onwards, only SNOPT v7.7.x is officially supported. @@ -65,4 +65,3 @@ API .. autoclass:: SNOPT :members: __call__ - diff --git a/doc/postprocessing.rst b/doc/postprocessing.rst index c85a109a..ffb1de86 100644 --- a/doc/postprocessing.rst +++ b/doc/postprocessing.rst @@ -26,7 +26,7 @@ Requirements \-axisartist (OptView) numpy (OptView) -For installation instructions, see :ref:`install_optview`. +For installation instructions, see :ref:`install_optview`. Although not necessary for most usage, the ``dill`` package is needed if you wish to save an editable version of the graph produced in ``OptView``. ``dill`` can be installed via ``pip`` in a terminal using diff --git a/doc/pyoptsparse.bib b/doc/pyoptsparse.bib index b467d87b..499c92c9 100644 --- a/doc/pyoptsparse.bib +++ b/doc/pyoptsparse.bib @@ -608,4 +608,4 @@ @article{Lyu2015b volume = {53}, year = {2015}, keywords = {MACH} -} \ No newline at end of file +} diff --git a/doc/quickstart.rst b/doc/quickstart.rst index 29f6b4a0..118fc95a 100644 --- a/doc/quickstart.rst +++ b/doc/quickstart.rst @@ -27,15 +27,15 @@ For the TP37, the objective function is a simple analytic function: Notes: -* The ``xdict`` variable is a dictionary whose keys are the names from each - :meth:`~pyoptsparse.pyOpt_optimization.Optimization.addVar` and +* The ``xdict`` variable is a dictionary whose keys are the names from each + :meth:`~pyoptsparse.pyOpt_optimization.Optimization.addVar` and :meth:`~pyoptsparse.pyOpt_optimization.Optimization.addVarGroup` call. The line .. code-block:: python x = xdict["xvars"] - retrieves an array of length 3 which are all the variables for this optimization. + retrieves an array of length 3 which are all the variables for this optimization. * The line @@ -62,7 +62,7 @@ Now the optimization problem can be initialized: :end-before: # rst begin addVar This creates an instance of the optimization class with a name and a reference to the objective function. -To complete the setup of the optimization problem, the design variables and constraints need to be defined. +To complete the setup of the optimization problem, the design variables and constraints need to be defined. Design variables and constraints can be added either one-by-one or as a group. Adding variables by group is generally recommended for related variables: @@ -84,7 +84,7 @@ It is recommended that related constraints are added by group where possible: :end-before: # rst begin addObj This call adds two variables with name ``con``. -There is no lower bound for the variables and the upper bound is 0.0. +There is no lower bound for the variables and the upper bound is 0.0. We must also assign the the key value for the objective using the :meth:`~pyoptsparse.pyOpt_optimization.Optimization.addObj` call: @@ -112,9 +112,9 @@ which produces the following table:: Variables (c - continuous, i - integer, d - discrete) Index Name Type Lower Bound Value Upper Bound Status - 0 xvars_0 c 0.000000E+00 1.000000E+01 4.200000E+01 - 1 xvars_1 c 0.000000E+00 1.000000E+01 4.200000E+01 - 2 xvars_2 c 0.000000E+00 1.000000E+01 4.200000E+01 + 0 xvars_0 c 0.000000E+00 1.000000E+01 4.200000E+01 + 1 xvars_1 c 0.000000E+00 1.000000E+01 4.200000E+01 + 2 xvars_2 c 0.000000E+00 1.000000E+01 4.200000E+01 Constraints (i - inequality, e - equality) Index Name Type Lower Value Upper Status Lagrange Multiplier (N/A) @@ -152,7 +152,7 @@ which produces the following output:: ================================================================================ Objective Function: objfunc - Solution: + Solution: -------------------------------------------------------------------------------- Total Time: 0.0062 User Objective Time : 0.0001 @@ -169,9 +169,9 @@ which produces the following output:: Variables (c - continuous, i - integer, d - discrete) Index Name Type Lower Bound Value Upper Bound Status - 0 xvars_0 c 0.000000E+00 2.399997E+01 4.200000E+01 - 1 xvars_1 c 0.000000E+00 1.200001E+01 4.200000E+01 - 2 xvars_2 c 0.000000E+00 1.200000E+01 4.200000E+01 + 0 xvars_0 c 0.000000E+00 2.399997E+01 4.200000E+01 + 1 xvars_1 c 0.000000E+00 1.200001E+01 4.200000E+01 + 2 xvars_2 c 0.000000E+00 1.200000E+01 4.200000E+01 Constraints (i - inequality, e - equality) Index Name Type Lower Value Upper Status Lagrange Multiplier (N/A) diff --git a/doc/requirements.txt b/doc/requirements.txt index 324d3ea5..cabb14f0 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -1,2 +1,2 @@ sphinx_mdolab_theme>=1.2 -sphinx-codeautolink \ No newline at end of file +sphinx-codeautolink diff --git a/meson.build b/meson.build index 1524e924..a2219cd3 100644 --- a/meson.build +++ b/meson.build @@ -42,4 +42,4 @@ else endif py3_dep = py3_target.dependency() -subdir('pyoptsparse') \ No newline at end of file +subdir('pyoptsparse') diff --git a/meson_options.txt b/meson_options.txt index e41d6cc3..a768c27b 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -6,4 +6,4 @@ option('python_target', type: 'string', value: '', to be built for is different than the Python installation that is used to run Meson. For example, Meson may be installed on the user's system which is run using the system Python installation, but the user may want build PyOptSparse for a Python installation in a virtual environment. Leave as an empty string to build for Python installation running - Meson.''') \ No newline at end of file + Meson.''') diff --git a/paper/paper.md b/paper/paper.md index a6eda955..a2731b10 100644 --- a/paper/paper.md +++ b/paper/paper.md @@ -49,7 +49,7 @@ At time of writing, the latest released version of pyOptSparse is v2.2.0. pyOptSparse provides built-in support for several popular proprietary and open-source optimizers. Each optimizer usually has its own way to specify the problem: It might require different constraint ordering, have different ways of specifying equality constraints, or use a sparse matrix format to represent the constraint Jacobian. -pyOptSparse provides a common Python interface for the various optimizers that hides these differences from the user. +pyOptSparse provides a common Python interface for the various optimizers that hides these differences from the user. By isolating the optimization problem definition from the optimizer, the user can easily switch between different optimizers applied to the same optimization problem. The optimizer can be switched by editing a single line of code. diff --git a/pyoptsparse/postprocessing/assets/base-styles.css b/pyoptsparse/postprocessing/assets/base-styles.css index feb92cab..18af5b1f 100644 --- a/pyoptsparse/postprocessing/assets/base-styles.css +++ b/pyoptsparse/postprocessing/assets/base-styles.css @@ -390,4 +390,4 @@ there. @media (min-width: 1000px) {} /* Larger than Desktop HD */ -@media (min-width: 1200px) {} \ No newline at end of file +@media (min-width: 1200px) {} diff --git a/pyoptsparse/postprocessing/assets/custom-styles.css b/pyoptsparse/postprocessing/assets/custom-styles.css index 2a552058..84db49b1 100644 --- a/pyoptsparse/postprocessing/assets/custom-styles.css +++ b/pyoptsparse/postprocessing/assets/custom-styles.css @@ -12,4 +12,4 @@ .plot-container { height: 90vh; width: 100vh; -} \ No newline at end of file +} diff --git a/pyoptsparse/postprocessing/meson.build b/pyoptsparse/postprocessing/meson.build index 837a8257..22e7114e 100644 --- a/pyoptsparse/postprocessing/meson.build +++ b/pyoptsparse/postprocessing/meson.build @@ -24,4 +24,4 @@ py3_target.install_sources( asset_sources, pure: true, subdir: 'pyoptsparse/postprocessing/assets' -) \ No newline at end of file +) diff --git a/pyoptsparse/pyALPSO/LICENSE b/pyoptsparse/pyALPSO/LICENSE index f87e922f..b9198e68 100644 --- a/pyoptsparse/pyALPSO/LICENSE +++ b/pyoptsparse/pyALPSO/LICENSE @@ -2,7 +2,7 @@ ALPSO - Augmented Lagrangian Particle Swarm Optimizer Copyright (c) 2011, Dr. Ruben E. Perez (Ruben.Perez@rmc.ca) and Peter W. Jansen (Peter.Jansen@rmc.ca) -ALPSO is free software: you can redistribute it and/or modify it +ALPSO is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. @@ -15,19 +15,19 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . -Non-free versions of ALPSO are available under terms different -from those of the General Public License. For more information -related to such a license, future developments and/or technical -support, contact Dr. Ruben E. Perez (Ruben.Perez@rmc.ca) or +Non-free versions of ALPSO are available under terms different +from those of the General Public License. For more information +related to such a license, future developments and/or technical +support, contact Dr. Ruben E. Perez (Ruben.Perez@rmc.ca) or Peter W. Jansen (Peter.Jansen@rmc.ca). -In addition, we kindly ask you to acknowledge the code authors in -any program, application or publication in which you use it. For +In addition, we kindly ask you to acknowledge the code authors in +any program, application or publication in which you use it. For published works that use ALPSO we suggest referencing: -P. Jansen and R. Perez, "Constrained Structural Design Optimization -via a Parallel Augmented Lagrangian Particle Swarm Optimization -Approach", International Journal of Computers and Structures, +P. Jansen and R. Perez, "Constrained Structural Design Optimization +via a Parallel Augmented Lagrangian Particle Swarm Optimization +Approach", International Journal of Computers and Structures, Vol. 89, No. 13-14, pp. 1352–1366, 2011. ---------------------------------------------------------------------- diff --git a/pyoptsparse/pyALPSO/meson.build b/pyoptsparse/pyALPSO/meson.build index b49fafe2..3a967556 100644 --- a/pyoptsparse/pyALPSO/meson.build +++ b/pyoptsparse/pyALPSO/meson.build @@ -10,4 +10,4 @@ py3_target.install_sources( python_sources, pure: true, subdir: 'pyoptsparse/pyALPSO' -) \ No newline at end of file +) diff --git a/pyoptsparse/pyALPSO/pyALPSO.py b/pyoptsparse/pyALPSO/pyALPSO.py index 25af1761..482c94d4 100644 --- a/pyoptsparse/pyALPSO/pyALPSO.py +++ b/pyoptsparse/pyALPSO/pyALPSO.py @@ -211,8 +211,8 @@ def _on_setOption(self, name, value): from . import alpso_ext self.alpso = alpso_ext - except ImportError: - raise ImportError("pyALPSO: ALPSO EXT shared library failed to import.") + except ImportError as e: + raise ImportError("pyALPSO: ALPSO EXT shared library failed to import.") from e def _communicateSolution(self, sol): if sol is not None: diff --git a/pyoptsparse/pyCONMIN/LICENSE b/pyoptsparse/pyCONMIN/LICENSE index d7f6886b..80a73843 100644 --- a/pyoptsparse/pyCONMIN/LICENSE +++ b/pyoptsparse/pyCONMIN/LICENSE @@ -14,7 +14,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ---------------------------------------------------------------------- diff --git a/pyoptsparse/pyCONMIN/source/README b/pyoptsparse/pyCONMIN/source/README index cbdad0c4..194952ce 100644 --- a/pyoptsparse/pyCONMIN/source/README +++ b/pyoptsparse/pyCONMIN/source/README @@ -1,4 +1,4 @@ -This directory contains the Fortran 77 source for CONMIN -modified for pyOpt interfacing by Dr. Ruben E. Perez, -plus two helper files called openunit.f and closeunit.f +This directory contains the Fortran 77 source for CONMIN +modified for pyOpt interfacing by Dr. Ruben E. Perez, +plus two helper files called openunit.f and closeunit.f to manipulate Fortran units from Python. diff --git a/pyoptsparse/pyCONMIN/source/cnmn00.f b/pyoptsparse/pyCONMIN/source/cnmn00.f index b20377f3..7dc9cc8c 100644 --- a/pyoptsparse/pyCONMIN/source/cnmn00.f +++ b/pyoptsparse/pyCONMIN/source/cnmn00.f @@ -3,9 +3,9 @@ SUBROUTINE CNMN00 (X,VLB,VUB,G,SCAL,DF,A,S,G1,G2,B,C,ISC,IC,MS1,N1 IMPLICIT DOUBLE PRECISION(A-H,O-Z) COMMON /CNMN1/ DELFUN,DABFUN,FDCH,FDCHM,CT,CTMIN,CTL,CTLMIN,ALPHAX 1,ABOBJ1,THETA,OBJ,NDV,NCON,NSIDE,IPRINT,NFDG,NSCAL,LINOBJ,ITMAX,IT - 2RM,ICNDIR,IGOTO,NAC,INFO,INFOG,ITER,NFEASCT - COMMON /OUTPUT/ IOUT -C + 2RM,ICNDIR,IGOTO,NAC,INFO,INFOG,ITER,NFEASCT + COMMON /OUTPUT/ IOUT +C C NFEASCT ADDED TO COMMON BLOCK BY KCYOUNG ON 4/14/92 TO ALLOW MORE C THAN 10 ITERATION ATTEMPTS. NFEASCT BECOMES AN INPUT VALUE C @@ -17,23 +17,23 @@ SUBROUTINE CNMN00 (X,VLB,VUB,G,SCAL,DF,A,S,G1,G2,B,C,ISC,IC,MS1,N1 2LP,FFF,A1,A2,A3,A4,F1,F2,F3,F4,CV1,CV2,CV3,CV4,APP,ALPCA,ALPFES,AL 3PLN,ALPMIN,ALPNC,ALPSAV,ALPSID,ALPTOT,RSPACE,IDM1,IDM2,IDM3,JDIR,I 4OBJ,KOBJ,KCOUNT,NCAL(2),NFEAS,MSCAL,NCOBJ,NVC,KOUNT,ICOUNT,IGOOD1, - 5IGOOD2,IGOOD3,IGOOD4,IBEST,III,NLNC,JGOTO,ISPACE(2) + 5IGOOD2,IGOOD3,IGOOD4,IBEST,III,NLNC,JGOTO,ISPACE(2) C ROUTINE TO SOLVE CONSTRAINED OR UNCONSTRAINED FUNCTION -C MINIMIZATION. -C BY G. N. VANDERPLAATS APRIL, 1972. +C MINIMIZATION. +C BY G. N. VANDERPLAATS APRIL, 1972. C * * * * * * * * * * * JUNE, 1979 VERSION * * * * * * * * * * * C NASA-AMES RESEARCH CENTER, MOFFETT FIELD, CALIF. -C REFERENCE; CONMIN - A FORTRAN PROGRAM FOR CONSTRAINED FUNCTION -C MINIMIZATION: USER'S MANUAL, BY G. N. VANDERPLAATS, -C NASA TM X-62,282, AUGUST, 1973. -C STORAGE REQUIREMENTS: -C PROGRAM - 7000 DECIMAL WORDS (CDC COMPUTER) -C ARRAYS - APPROX. 2*(NDV**2)+26*NDV+4*NCON, -C WHERE N3 = NDV+2. -C RE-SCALE VARIABLES IF REQUIRED. +C REFERENCE; CONMIN - A FORTRAN PROGRAM FOR CONSTRAINED FUNCTION +C MINIMIZATION: USER'S MANUAL, BY G. N. VANDERPLAATS, +C NASA TM X-62,282, AUGUST, 1973. +C STORAGE REQUIREMENTS: +C PROGRAM - 7000 DECIMAL WORDS (CDC COMPUTER) +C ARRAYS - APPROX. 2*(NDV**2)+26*NDV+4*NCON, +C WHERE N3 = NDV+2. +C RE-SCALE VARIABLES IF REQUIRED. IF (NSCAL.EQ.0.OR.IGOTO.EQ.0) GO TO 20 - DO 10 I=1,NDV -10 X(I)=C(I) + DO 10 I=1,NDV +10 X(I)=C(I) 20 CONTINUE C CONSTANTS. NDV1=NDV+1 @@ -42,158 +42,158 @@ SUBROUTINE CNMN00 (X,VLB,VUB,G,SCAL,DF,A,S,G1,G2,B,C,ISC,IC,MS1,N1 C ------------------------------------------------------------------ C CHECK FOR UNBOUNDED SOLUTION C ------------------------------------------------------------------ -C STOP IF OBJ IS LESS THAN -1.0E+20 - IF (OBJ.GT.-1.0E+20) GO TO 30 - WRITE (IOUT,980) - GO TO 810 +C STOP IF OBJ IS LESS THAN -1.0E+20 + IF (OBJ.GT.-1.0E+20) GO TO 30 + WRITE (IOUT,980) + GO TO 810 30 CONTINUE - GO TO (160,390,380,670,690),IGOTO + GO TO (160,390,380,670,690),IGOTO C ------------------------------------------------------------------ C SAVE INPUT CONTROL PARAMETERS C ------------------------------------------------------------------ 40 CONTINUE - IF (IPRINT.GT.0) WRITE (IOUT,1220) + IF (IPRINT.GT.0) WRITE (IOUT,1220) IF (LINOBJ.EQ.0.OR.(NCON.GT.0.OR.NSIDE.GT.0)) GO TO 50 -C TOTALLY UNCONSTRAINED FUNCTION WITH LINEAR OBJECTIVE. +C TOTALLY UNCONSTRAINED FUNCTION WITH LINEAR OBJECTIVE. C SOLUTION IS UNBOUNDED. - WRITE (IOUT,970) LINOBJ,NCON,NSIDE + WRITE (IOUT,970) LINOBJ,NCON,NSIDE RETURN 50 CONTINUE - IDM1=ITRM + IDM1=ITRM IDM2=ITMAX - IDM3=ICNDIR + IDM3=ICNDIR DM1=DELFUN DM2=DABFUN DM3=CT - DM4=CTMIN - DM5=CTL + DM4=CTMIN + DM5=CTL DM6=CTLMIN - DM7=THETA - DM8=PHI + DM7=THETA + DM8=PHI DM9=FDCH DM10=FDCHM - DM11=ABOBJ1 - DM12=ALPHAX + DM11=ABOBJ1 + DM12=ALPHAX C ------------------------------------------------------------------ -C DEFAULTS +C DEFAULTS C ------------------------------------------------------------------ - IF (ITRM.LE.0) ITRM=3 + IF (ITRM.LE.0) ITRM=3 IF (ITMAX.LE.0) ITMAX=20 NDV1=NDV+1 IF (ICNDIR.EQ.0) ICNDIR=NDV1 IF (DELFUN.LE.0.) DELFUN=.0001 - CT=-ABS(CT) + CT=-ABS(CT) IF (CT.GE.0.) CT=-.1 CTMIN=ABS(CTMIN) - IF (CTMIN.LE.0.) CTMIN=.004 - CTL=-ABS(CTL) + IF (CTMIN.LE.0.) CTMIN=.004 + CTL=-ABS(CTL) IF (CTL.GE.0.) CTL=-0.01 CTLMIN=ABS(CTLMIN) - IF (CTLMIN.LE.0.) CTLMIN=.001 - IF (THETA.LE.0.) THETA=1. - IF (ABOBJ1.LE.0.) ABOBJ1=.1 - IF (ALPHAX.LE.0.) ALPHAX=.1 + IF (CTLMIN.LE.0.) CTLMIN=.001 + IF (THETA.LE.0.) THETA=1. + IF (ABOBJ1.LE.0.) ABOBJ1=.1 + IF (ALPHAX.LE.0.) ALPHAX=.1 IF (FDCH.LE.0.) FDCH=.01 IF (FDCHM.LE.0.) FDCHM=.01 C ------------------------------------------------------------------ C INITIALIZE INTERNAL PARAMETERS C ------------------------------------------------------------------ - INFOG=0 + INFOG=0 ITER=0 JDIR=0 IOBJ=0 KOBJ=0 NDV2=NDV+2 KCOUNT=0 - NCAL(1)=0 - NCAL(2)=0 - NAC=0 - NFEAS=0 - MSCAL=NSCAL + NCAL(1)=0 + NCAL(2)=0 + NAC=0 + NFEAS=0 + MSCAL=NSCAL CT1=ITRM CT1=1./CT1 DCT=(CTMIN/ABS(CT))**CT1 - DCTL=(CTLMIN/ABS(CTL))**CT1 + DCTL=(CTLMIN/ABS(CTL))**CT1 PHI=5. ABOBJ=ABOBJ1 - NCOBJ=0 - CTAM=ABS(CTMIN) + NCOBJ=0 + CTAM=ABS(CTMIN) CTBM=ABS(CTLMIN) -C CALCULATE NUMBER OF LINEAR CONSTRAINTS, NLNC. +C CALCULATE NUMBER OF LINEAR CONSTRAINTS, NLNC. NLNC=0 - IF (NCON.EQ.0) GO TO 70 + IF (NCON.EQ.0) GO TO 70 DO 60 I=1,NCON IF (ISC(I).GT.0) NLNC=NLNC+1 60 CONTINUE 70 CONTINUE C ------------------------------------------------------------------ -C CHECK TO BE SURE THAT SIDE CONSTRAINTS ARE SATISFIED +C CHECK TO BE SURE THAT SIDE CONSTRAINTS ARE SATISFIED C ------------------------------------------------------------------ - IF (NSIDE.EQ.0) GO TO 110 + IF (NSIDE.EQ.0) GO TO 110 DO 100 I=1,NDV IF (VLB(I).LE.VUB(I)) GO TO 80 - XX=.5*(VLB(I)+VUB(I)) - X(I)=XX - VLB(I)=XX - VUB(I)=XX + XX=.5*(VLB(I)+VUB(I)) + X(I)=XX + VLB(I)=XX + VUB(I)=XX WRITE (IOUT,1120) I 80 CONTINUE XX=X(I)-VLB(I) IF (XX.GE.0.) GO TO 90 -C LOWER BOUND VIOLATED. +C LOWER BOUND VIOLATED. WRITE (IOUT,1130) X(I),VLB(I),I - X(I)=VLB(I) - GO TO 100 + X(I)=VLB(I) + GO TO 100 90 CONTINUE XX=VUB(I)-X(I) - IF (XX.GE.0.) GO TO 100 + IF (XX.GE.0.) GO TO 100 WRITE (IOUT,1140) X(I),VUB(I),I - X(I)=VUB(I) + X(I)=VUB(I) 100 CONTINUE 110 CONTINUE C ------------------------------------------------------------------ C INITIALIZE SCALING VECTOR, SCAL C ------------------------------------------------------------------ - IF (NSCAL.EQ.0) GO TO 150 - IF (NSCAL.LT.0) GO TO 130 + IF (NSCAL.EQ.0) GO TO 150 + IF (NSCAL.LT.0) GO TO 130 DO 120 I=1,NDV 120 SCAL(I)=1. - GO TO 150 + GO TO 150 130 CONTINUE DO 140 I=1,NDV - SI=ABS(SCAL(I)) + SI=ABS(SCAL(I)) IF (SI.LT.1.0E-20) SI=1.0E-5 SCAL(I)=SI SI=1./SI X(I)=X(I)*SI - IF (NSIDE.EQ.0) GO TO 140 + IF (NSIDE.EQ.0) GO TO 140 VLB(I)=VLB(I)*SI VUB(I)=VUB(I)*SI 140 CONTINUE 150 CONTINUE C ------------------------------------------------------------------ -C ***** CALCULATE INITIAL FUNCTION AND CONSTRAINT VALUES ***** +C ***** CALCULATE INITIAL FUNCTION AND CONSTRAINT VALUES ***** C ------------------------------------------------------------------ INFO=1 - NCAL(1)=1 - IGOTO=1 - GO TO 950 + NCAL(1)=1 + IGOTO=1 + GO TO 950 160 CONTINUE OBJ1=OBJ IF (DABFUN.LE.0.) DABFUN=.001*ABS(OBJ) - IF (DABFUN.LT.1.0E-10) DABFUN=1.0E-10 + IF (DABFUN.LT.1.0E-10) DABFUN=1.0E-10 IF (IPRINT.LE.0) GO TO 270 C ------------------------------------------------------------------ -C PRINT INITIAL DESIGN INFORMATION +C PRINT INITIAL DESIGN INFORMATION C ------------------------------------------------------------------ IF (IPRINT.LE.1) GO TO 230 IF (NSIDE.EQ.0.AND.NCON.EQ.0) WRITE (IOUT,1290) - IF (NSIDE.NE.0.OR.NCON.GT.0) WRITE (IOUT,1230) + IF (NSIDE.NE.0.OR.NCON.GT.0) WRITE (IOUT,1230) WRITE (IOUT,1240) IPRINT,NDV,ITMAX,NCON,NSIDE,ICNDIR,NSCAL,NFDG - 1,LINOBJ,ITRM,N1,N2,N3,N4,N5 + 1,LINOBJ,ITRM,N1,N2,N3,N4,N5 WRITE (IOUT,1260) CT,CTMIN,CTL,CTLMIN,THETA,PHI,DELFUN,DABFUN - WRITE (IOUT,1250) FDCH,FDCHM,ALPHAX,ABOBJ1 - IF (NSIDE.EQ.0) GO TO 190 + WRITE (IOUT,1250) FDCH,FDCHM,ALPHAX,ABOBJ1 + IF (NSIDE.EQ.0) GO TO 190 WRITE (IOUT,1270) DO 170 I=1,NDV,6 M1=MIN0(NDV,I+5) @@ -203,7 +203,7 @@ SUBROUTINE CNMN00 (X,VLB,VUB,G,SCAL,DF,A,S,G1,G2,B,C,ISC,IC,MS1,N1 M1=MIN0(NDV,I+5) 180 WRITE (IOUT,1010) I,(VUB(J),J=I,M1) 190 CONTINUE - IF (NSCAL.GE.0) GO TO 200 + IF (NSCAL.GE.0) GO TO 200 WRITE (IOUT,1300) WRITE (IOUT,1460) (SCAL(I),I=1,NDV) 200 CONTINUE @@ -213,73 +213,73 @@ SUBROUTINE CNMN00 (X,VLB,VUB,G,SCAL,DF,A,S,G1,G2,B,C,ISC,IC,MS1,N1 DO 210 I=1,NCON,15 M1=MIN0(NCON,I+14) 210 WRITE (IOUT,1030) I,(ISC(J),J=I,M1) - GO TO 230 + GO TO 230 220 IF (NLNC.EQ.NCON) WRITE (IOUT,1040) - IF (NLNC.EQ.0) WRITE (IOUT,1050) + IF (NLNC.EQ.0) WRITE (IOUT,1050) 230 CONTINUE WRITE (IOUT,1440) OBJ WRITE (IOUT,1450) DO 240 I=1,NDV - X1=1. + X1=1. IF (NSCAL.NE.0) X1=SCAL(I) -240 G1(I)=X(I)*X1 +240 G1(I)=X(I)*X1 DO 250 I=1,NDV,6 M1=MIN0(NDV,I+5) -250 WRITE (IOUT,1010) I,(G1(J),J=I,M1) +250 WRITE (IOUT,1010) I,(G1(J),J=I,M1) IF (NCON.EQ.0) GO TO 270 WRITE (IOUT,1470) - DO 260 I=1,NCON,6 - M1=MIN0(NCON,I+5) + DO 260 I=1,NCON,6 + M1=MIN0(NCON,I+5) 260 WRITE (IOUT,1010) I,(G(J),J=I,M1) 270 CONTINUE - IF (IPRINT.GT.1) WRITE (IOUT,1360) + IF (IPRINT.GT.1) WRITE (IOUT,1360) C ------------------------------------------------------------------ C ******************** BEGIN MINIMIZATION ************************ C ------------------------------------------------------------------ 280 CONTINUE - ITER=ITER+1 - IF (ABOBJ1.LT..0001) ABOBJ1=.0001 - IF (ABOBJ1.GT..2) ABOBJ1=.2 - IF (ALPHAX.GT.1.) ALPHAX=1. - IF (ALPHAX.LT..001) ALPHAX=.001 -C -C THE FOLLOWING TWO LINES OF CODE WERE COMMENTED OUT ON 3/5/81 -C -C NFEAS=NFEAS+1 + ITER=ITER+1 + IF (ABOBJ1.LT..0001) ABOBJ1=.0001 + IF (ABOBJ1.GT..2) ABOBJ1=.2 + IF (ALPHAX.GT.1.) ALPHAX=1. + IF (ALPHAX.LT..001) ALPHAX=.001 +C +C THE FOLLOWING TWO LINES OF CODE WERE COMMENTED OUT ON 3/5/81 +C +C NFEAS=NFEAS+1 C IF (NFEAS.GT.10) GO TO 810 IF (IPRINT.GT.2) WRITE (IOUT,1310) ITER IF (IPRINT.GT.3.AND.NCON.GT.0) WRITE (IOUT,1320) CT,CTL,PHI - CTA=ABS(CT) - IF (NCOBJ.EQ.0) GO TO 340 + CTA=ABS(CT) + IF (NCOBJ.EQ.0) GO TO 340 C ------------------------------------------------------------------ C NO MOVE ON LAST ITERATION. DELETE CONSTRAINTS THAT ARE NO C LONGER ACTIVE. C ------------------------------------------------------------------ NNAC=NAC - DO 290 I=1,NNAC + DO 290 I=1,NNAC IF (IC(I).GT.NCON) NAC=NAC-1 290 CONTINUE - IF (NAC.LE.0) GO TO 420 + IF (NAC.LE.0) GO TO 420 NNAC=NAC - DO 330 I=1,NNAC -300 NIC=IC(I) + DO 330 I=1,NNAC +300 NIC=IC(I) CT1=CT IF (ISC(NIC).GT.0) CT1=CTL IF (G(NIC).GT.CT1) GO TO 330 - NAC=NAC-1 - IF (I.GT.NAC) GO TO 420 + NAC=NAC-1 + IF (I.GT.NAC) GO TO 420 DO 320 K=I,NAC II=K+1 - DO 310 J=1,NDV2 + DO 310 J=1,NDV2 310 A(J,K)=A(J,II) 320 IC(K)=IC(II) - GO TO 300 + GO TO 300 330 CONTINUE - GO TO 420 + GO TO 420 340 CONTINUE - IF (MSCAL.LT.NSCAL.OR.NSCAL.EQ.0) GO TO 360 + IF (MSCAL.LT.NSCAL.OR.NSCAL.EQ.0) GO TO 360 IF (NSCAL.LT.0.AND.KCOUNT.LT.ICNDIR) GO TO 360 - MSCAL=0 + MSCAL=0 KCOUNT=0 C ------------------------------------------------------------------ C SCALE VARIABLES @@ -293,7 +293,7 @@ SUBROUTINE CNMN00 (X,VLB,VUB,G,SCAL,DF,A,S,G1,G2,B,C,ISC,IC,MS1,N1 SCAL(I)=SI SI=1./SI X(I)=XI*SI - IF (NSIDE.EQ.0) GO TO 350 + IF (NSIDE.EQ.0) GO TO 350 VLB(I)=SIB*SI*VLB(I) VUB(I)=SIB*SI*VUB(I) 350 CONTINUE @@ -301,23 +301,23 @@ SUBROUTINE CNMN00 (X,VLB,VUB,G,SCAL,DF,A,S,G1,G2,B,C,ISC,IC,MS1,N1 WRITE (IOUT,1330) WRITE (IOUT,1460) (SCAL(I),I=1,NDV) 360 CONTINUE - MSCAL=MSCAL+1 - NAC=0 + MSCAL=MSCAL+1 + NAC=0 C ------------------------------------------------------------------ -C OBTAIN GRADIENTS OF OBJECTIVE AND ACTIVE CONSTRAINTS +C OBTAIN GRADIENTS OF OBJECTIVE AND ACTIVE CONSTRAINTS C ------------------------------------------------------------------ INFO=2 - NCAL(2)=NCAL(2)+1 + NCAL(2)=NCAL(2)+1 IF (NFDG.NE.1) GO TO 370 - IGOTO=2 - GO TO 950 + IGOTO=2 + GO TO 950 370 CONTINUE - JGOTO=0 + JGOTO=0 380 CONTINUE CALL CNMN01 (JGOTO,X,DF,G,ISC,IC,A,G1,VLB,VUB,SCAL,C,NCAL,DX,DX1 - 1,FI,XI,III,N1,N2,N3,N4) - IGOTO=3 - IF (JGOTO.GT.0) GO TO 950 + 1,FI,XI,III,N1,N2,N3,N4) + IGOTO=3 + IF (JGOTO.GT.0) GO TO 950 390 CONTINUE INFO=1 IF (NAC.GE.N3) GO TO 810 @@ -325,118 +325,118 @@ SUBROUTINE CNMN00 (X,VLB,VUB,G,SCAL,DF,A,S,G1,G2,B,C,ISC,IC,MS1,N1 C ------------------------------------------------------------------ C SCALE GRADIENTS C ------------------------------------------------------------------ -C SCALE GRADIENT OF OBJECTIVE FUNCTION. +C SCALE GRADIENT OF OBJECTIVE FUNCTION. DO 400 I=1,NDV -400 DF(I)=DF(I)*SCAL(I) +400 DF(I)=DF(I)*SCAL(I) IF (NFDG.EQ.2.OR.NAC.EQ.0) GO TO 420 C SCALE GRADIENTS OF ACTIVE CONSTRAINTS. DO 410 J=1,NDV - SCJ=SCAL(J) + SCJ=SCAL(J) DO 410 I=1,NAC -410 A(J,I)=A(J,I)*SCJ +410 A(J,I)=A(J,I)*SCJ 420 CONTINUE - IF (IPRINT.LT.3.OR.NCON.EQ.0) GO TO 470 + IF (IPRINT.LT.3.OR.NCON.EQ.0) GO TO 470 C ------------------------------------------------------------------ -C PRINT +C PRINT C ------------------------------------------------------------------ -C PRINT ACTIVE AND VIOLATED CONSTRAINT NUMBERS. +C PRINT ACTIVE AND VIOLATED CONSTRAINT NUMBERS. M1=0 - M2=N3 - IF (NAC.EQ.0) GO TO 450 + M2=N3 + IF (NAC.EQ.0) GO TO 450 DO 440 I=1,NAC - J=IC(I) + J=IC(I) IF (J.GT.NCON) GO TO 440 - GI=G(J) - C1=CTAM + GI=G(J) + C1=CTAM IF (ISC(J).GT.0) C1=CTBM GI=GI-C1 - IF (GI.GT.0.) GO TO 430 + IF (GI.GT.0.) GO TO 430 C ACTIVE CONSTRAINT. - M1=M1+1 - MS1(M1)=J - GO TO 440 -430 M2=M2+1 + M1=M1+1 + MS1(M1)=J + GO TO 440 +430 M2=M2+1 C VIOLATED CONSTRAINT. - MS1(M2)=J + MS1(M2)=J 440 CONTINUE 450 M3=M2-N3 - WRITE (IOUT,1060) M1 + WRITE (IOUT,1060) M1 IF (M1.EQ.0) GO TO 460 WRITE (IOUT,1070) WRITE (IOUT,1480) (MS1(I),I=1,M1) -460 WRITE (IOUT,1080) M3 +460 WRITE (IOUT,1080) M3 IF (M3.EQ.0) GO TO 470 WRITE (IOUT,1070) - M3=N3+1 - WRITE (IOUT,1480) (MS1(I),I=M3,M2) + M3=N3+1 + WRITE (IOUT,1480) (MS1(I),I=M3,M2) 470 CONTINUE C ------------------------------------------------------------------ -C CALCULATE GRADIENTS OF ACTIVE SIDE CONSTRAINTS +C CALCULATE GRADIENTS OF ACTIVE SIDE CONSTRAINTS C ------------------------------------------------------------------ - IF (NSIDE.EQ.0) GO TO 530 - MCN1=NCON + IF (NSIDE.EQ.0) GO TO 530 + MCN1=NCON M1=0 DO 510 I=1,NDV C LOWER BOUND. - XI=X(I) + XI=X(I) XID=VLB(I) X12=ABS(XID) - IF (X12.LT.1.) X12=1. - GI=(XID-XI)/X12 + IF (X12.LT.1.) X12=1. + GI=(XID-XI)/X12 IF (GI.LT.-1.0E-6) GO TO 490 - M1=M1+1 + M1=M1+1 MS1(M1)=-I - NAC=NAC+1 + NAC=NAC+1 IF (NAC.GE.N3) GO TO 810 - MCN1=MCN1+1 + MCN1=MCN1+1 DO 480 J=1,NDV -480 A(J,NAC)=0. +480 A(J,NAC)=0. A(I,NAC)=-1. IC(NAC)=MCN1 G(MCN1)=GI - ISC(MCN1)=1 + ISC(MCN1)=1 C UPPER BOUND. 490 XID=VUB(I) X12=ABS(XID) - IF (X12.LT.1.) X12=1. - GI=(XI-XID)/X12 + IF (X12.LT.1.) X12=1. + GI=(XI-XID)/X12 IF (GI.LT.-1.0E-6) GO TO 510 - M1=M1+1 - MS1(M1)=I - NAC=NAC+1 + M1=M1+1 + MS1(M1)=I + NAC=NAC+1 IF (NAC.GE.N3) GO TO 810 - MCN1=MCN1+1 + MCN1=MCN1+1 DO 500 J=1,NDV -500 A(J,NAC)=0. - A(I,NAC)=1. +500 A(J,NAC)=0. + A(I,NAC)=1. IC(NAC)=MCN1 G(MCN1)=GI - ISC(MCN1)=1 + ISC(MCN1)=1 510 CONTINUE C ------------------------------------------------------------------ C PRINT C ------------------------------------------------------------------ -C PRINT ACTIVE SIDE CONSTRAINT NUMBERS. +C PRINT ACTIVE SIDE CONSTRAINT NUMBERS. IF (IPRINT.LT.3) GO TO 530 - WRITE (IOUT,1090) M1 + WRITE (IOUT,1090) M1 IF (M1.EQ.0) GO TO 530 WRITE (IOUT,1100) - WRITE(6,1480) (MS1(J),J=1,M1) + WRITE(6,1480) (MS1(J),J=1,M1) 530 CONTINUE -C PRINT GRADIENTS OF ACTIVE AND VIOLATED CONSTRAINTS. +C PRINT GRADIENTS OF ACTIVE AND VIOLATED CONSTRAINTS. IF (IPRINT.LT.4) GO TO 570 WRITE (IOUT,1340) DO 540 I=1,NDV,6 M1=MIN0(NDV,I+5) -540 WRITE (IOUT,1010) I,(DF(J),J=I,M1) - IF (NAC.EQ.0) GO TO 570 +540 WRITE (IOUT,1010) I,(DF(J),J=I,M1) + IF (NAC.EQ.0) GO TO 570 WRITE (IOUT,1350) DO 560 I=1,NAC M1=IC(I) M2=M1-NCON M3=0 - IF (M2.GT.0) M3=IABS(MS1(M2)) - IF (M2.LE.0) WRITE (IOUT,990) M1 + IF (M2.GT.0) M3=IABS(MS1(M2)) + IF (M2.LE.0) WRITE (IOUT,990) M1 IF (M2.GT.0) WRITE (IOUT,1000) M3 DO 550 K=1,NDV,6 M1=MIN0(NDV,K+5) @@ -446,107 +446,107 @@ SUBROUTINE CNMN00 (X,VLB,VUB,G,SCAL,DF,A,S,G1,G2,B,C,ISC,IC,MS1,N1 C ------------------------------------------------------------------ C ****************** DETERMINE SEARCH DIRECTION ******************* C ------------------------------------------------------------------ - ALP=1.0E+20 - IF (NAC.GT.0) GO TO 580 + ALP=1.0E+20 + IF (NAC.GT.0) GO TO 580 C ------------------------------------------------------------------ -C UNCONSTRAINED FUNCTION +C UNCONSTRAINED FUNCTION C ------------------------------------------------------------------ C FIND DIRECTION OF STEEPEST DESCENT OR CONJUGATE DIRECTION. -C -C S. N. 575 ADDED ON 2/25/81 -C - 575 NVC=0 - NFEAS=0 - KCOUNT=KCOUNT+1 -C IF KCOUNT.GT.ICNDIR RESTART CONJUGATE DIRECTION ALGORITHM. - IF (KCOUNT.GT.ICNDIR.OR.IOBJ.EQ.2) KCOUNT=1 - IF (KCOUNT.EQ.1) JDIR=0 -C IF JDIR = 0 FIND DIRECTION OF STEEPEST DESCENT. - CALL CNMN02 (JDIR,SLOPE,DFTDF1,DF,S,N1) - GO TO 630 +C +C S. N. 575 ADDED ON 2/25/81 +C + 575 NVC=0 + NFEAS=0 + KCOUNT=KCOUNT+1 +C IF KCOUNT.GT.ICNDIR RESTART CONJUGATE DIRECTION ALGORITHM. + IF (KCOUNT.GT.ICNDIR.OR.IOBJ.EQ.2) KCOUNT=1 + IF (KCOUNT.EQ.1) JDIR=0 +C IF JDIR = 0 FIND DIRECTION OF STEEPEST DESCENT. + CALL CNMN02 (JDIR,SLOPE,DFTDF1,DF,S,N1) + GO TO 630 580 CONTINUE C ------------------------------------------------------------------ -C CONSTRAINED FUNCTION +C CONSTRAINED FUNCTION C ------------------------------------------------------------------ -C FIND USABLE-FEASIBLE DIRECTION. +C FIND USABLE-FEASIBLE DIRECTION. KCOUNT=0 JDIR=0 - PHI=10.*PHI - IF (PHI.GT.1000.) PHI=1000. -C -C THE FOLLOWING LINE OF CODE WAS COMMENTED OUT ON 3/5/81 -C + PHI=10.*PHI + IF (PHI.GT.1000.) PHI=1000. +C +C THE FOLLOWING LINE OF CODE WAS COMMENTED OUT ON 3/5/81 +C C IF (NFEAS.EQ.1) PHI=5. -C CALCULATE DIRECTION, S. +C CALCULATE DIRECTION, S. CALL CNMN05 (G,DF,A,S,B,C,SLOPE,PHI,ISC,IC,MS1,NVC,N1,N2,N3,N4,N5) -C +C C THE FOLLOWING LINE WAS ADDED ON 2/25/81 -C +C IF(NAC.EQ.0) GO TO 575 -C +C C THE FOLLOWING FIVE LINES WERE COMMENTED OUT ON 3/5/81 C REASON : THEY WERE NOT IN G. VANDERPLAATS LISTING -C -C IF THIS DESIGN IS FEASIBLE AND LAST ITERATION WAS INFEASIBLE, -C SET ABOBJ1=.05 (5 PERCENT). -C IF (NVC.EQ.0.AND.NFEAS.GT.1) ABOBJ1=.05 -C IF (NVC.EQ.0) NFEAS=0 +C +C IF THIS DESIGN IS FEASIBLE AND LAST ITERATION WAS INFEASIBLE, +C SET ABOBJ1=.05 (5 PERCENT). +C IF (NVC.EQ.0.AND.NFEAS.GT.1) ABOBJ1=.05 +C IF (NVC.EQ.0) NFEAS=0 IF (IPRINT.LT.3) GO TO 600 WRITE (IOUT,1370) DO 590 I=1,NAC,6 M1=MIN0(NAC,I+5) -590 WRITE (IOUT,1010) I,(A(NDV1,J),J=I,M1) +590 WRITE (IOUT,1010) I,(A(NDV1,J),J=I,M1) WRITE (IOUT,1210) S(NDV1) 600 CONTINUE C ------------------------------------------------------------------ C ****************** ONE-DIMENSIONAL SEARCH ************************ C ------------------------------------------------------------------ - IF (S(NDV1).LT.1.0E-6.AND.NVC.EQ.0) GO TO 710 + IF (S(NDV1).LT.1.0E-6.AND.NVC.EQ.0) GO TO 710 C ------------------------------------------------------------------ C FIND ALPHA TO OBTAIN A FEASIBLE DESIGN C ------------------------------------------------------------------ - IF (NVC.EQ.0) GO TO 630 - ALP=-1. + IF (NVC.EQ.0) GO TO 630 + ALP=-1. DO 620 I=1,NAC - NCI=IC(I) - C1=G(NCI) + NCI=IC(I) + C1=G(NCI) CTC=CTAM - IF (ISC(NCI).GT.0) CTC=CTBM + IF (ISC(NCI).GT.0) CTC=CTBM IF (C1.LE.CTC) GO TO 620 - ALP1=0. + ALP1=0. DO 610 J=1,NDV -610 ALP1=ALP1+S(J)*A(J,I) - ALP1=ALP1*A(NDV2,I) - IF (ABS(ALP1).LT.1.0E-20) GO TO 620 - ALP1=-C1/ALP1 - IF (ALP1.GT.ALP) ALP=ALP1 +610 ALP1=ALP1+S(J)*A(J,I) + ALP1=ALP1*A(NDV2,I) + IF (ABS(ALP1).LT.1.0E-20) GO TO 620 + ALP1=-C1/ALP1 + IF (ALP1.GT.ALP) ALP=ALP1 620 CONTINUE 630 CONTINUE C ------------------------------------------------------------------ C LIMIT CHANCE TO ABOBJ1*OBJ C ------------------------------------------------------------------ ALP1=1.0E+20 - SI=ABS(OBJ) - IF (SI.LT..01) SI=.01 - IF (ABS(SLOPE).GT.1.0E-20) ALP1=ABOBJ1*SI/SLOPE + SI=ABS(OBJ) + IF (SI.LT..01) SI=.01 + IF (ABS(SLOPE).GT.1.0E-20) ALP1=ABOBJ1*SI/SLOPE ALP1=ABS(ALP1) - IF (NVC.GT.0) ALP1=10.*ALP1 - IF (ALP1.LT.ALP) ALP=ALP1 + IF (NVC.GT.0) ALP1=10.*ALP1 + IF (ALP1.LT.ALP) ALP=ALP1 C ------------------------------------------------------------------ C LIMIT CHANGE IN VARIABLE TO ALPHAX C ------------------------------------------------------------------ - ALP11=1.0E+20 + ALP11=1.0E+20 DO 640 I=1,NDV SI=ABS(S(I)) XI=ABS(X(I)) - IF (SI.LT.1.0E-10.OR.XI.LT.0.1) GO TO 640 - ALP1=ALPHAX*XI/SI - IF (ALP1.LT.ALP11) ALP11=ALP1 + IF (SI.LT.1.0E-10.OR.XI.LT.0.1) GO TO 640 + ALP1=ALPHAX*XI/SI + IF (ALP1.LT.ALP11) ALP11=ALP1 640 CONTINUE - IF (NVC.GT.0) ALP11=10.*ALP11 - IF (ALP11.LT.ALP) ALP=ALP11 - IF (ALP.GT.1.0E+20) ALP=1.0E+20 - IF (ALP.LE.1.0E-20) ALP=1.0E-20 + IF (NVC.GT.0) ALP11=10.*ALP11 + IF (ALP11.LT.ALP) ALP=ALP11 + IF (ALP.GT.1.0E+20) ALP=1.0E+20 + IF (ALP.LE.1.0E-20) ALP=1.0E-20 IF (IPRINT.LT.3) GO TO 660 WRITE (IOUT,1380) DO 650 I=1,NDV,6 @@ -558,27 +558,27 @@ SUBROUTINE CNMN00 (X,VLB,VUB,G,SCAL,DF,A,S,G1,G2,B,C,ISC,IC,MS1,N1 C ------------------------------------------------------------------ C DO ONE-DIMENSIONAL SEARCH FOR UNCONSTRAINED FUNCTION C ------------------------------------------------------------------ - JGOTO=0 + JGOTO=0 670 CONTINUE CALL CNMN03 (X,S,SLOPE,ALP,FFF,A1,A2,A3,A4,F1,F2,F3,F4,APP,N1 - 1,NCAL,KOUNT,JGOTO) - IGOTO=4 - IF (JGOTO.GT.0) GO TO 950 + 1,NCAL,KOUNT,JGOTO) + IGOTO=4 + IF (JGOTO.GT.0) GO TO 950 JDIR=1 -C PROCEED TO CONVERGENCE CHECK. - GO TO 700 +C PROCEED TO CONVERGENCE CHECK. + GO TO 700 C ------------------------------------------------------------------ -C SOLVE ONE-DIMENSIONAL SEARCH PROBLEM FOR CONSTRAINED FUNCTION +C SOLVE ONE-DIMENSIONAL SEARCH PROBLEM FOR CONSTRAINED FUNCTION C ------------------------------------------------------------------ 680 CONTINUE - JGOTO=0 + JGOTO=0 690 CONTINUE CALL CNMN06 (X,VLB,VUB,G,SCAL,DF,S,G1,G2,CTAM,CTBM,SLOPE,ALP,A2,A3 1,A4,F1,F2,F3,CV1,CV2,CV3,CV4,ALPCA,ALPFES,ALPLN,ALPMIN,ALPNC,ALPSA 2V,ALPSID,ALPTOT,ISC,N1,N2,NCAL,NVC,ICOUNT,IGOOD1,IGOOD2,IGOOD3,IGO - 3OD4,IBEST,III,NLNC,JGOTO) - IGOTO=5 - IF (JGOTO.GT.0) GO TO 950 + 3OD4,IBEST,III,NLNC,JGOTO) + IGOTO=5 + IF (JGOTO.GT.0) GO TO 950 IF (NAC.EQ.0) JDIR=1 C ------------------------------------------------------------------ C ******************* UPDATE ALPHAX ************************** @@ -586,84 +586,84 @@ SUBROUTINE CNMN00 (X,VLB,VUB,G,SCAL,DF,A,S,G1,G2,B,C,ISC,IC,MS1,N1 700 CONTINUE 710 CONTINUE IF (ALP.GT.1.0E+19) ALP=0. -C UPDATE ALPHAX TO BE AVERAGE OF MAXIMUM CHANGE IN X(I) -C AND ALHPAX. +C UPDATE ALPHAX TO BE AVERAGE OF MAXIMUM CHANGE IN X(I) +C AND ALHPAX. ALP11=0. DO 720 I=1,NDV SI=ABS(S(I)) XI=ABS(X(I)) IF (XI.LT.1.0E-10) GO TO 720 ALP1=ALP*SI/XI - IF (ALP1.GT.ALP11) ALP11=ALP1 + IF (ALP1.GT.ALP11) ALP11=ALP1 720 CONTINUE - ALP11=.5*(ALP11+ALPHAX) - ALP12=5.*ALPHAX - IF (ALP11.GT.ALP12) ALP11=ALP12 + ALP11=.5*(ALP11+ALPHAX) + ALP12=5.*ALPHAX + IF (ALP11.GT.ALP12) ALP11=ALP12 ALPHAX=ALP11 - NCOBJ=NCOBJ+1 -C ABSOLUTE CHANGE IN OBJECTIVE. - OBJD=OBJ1-OBJ + NCOBJ=NCOBJ+1 +C ABSOLUTE CHANGE IN OBJECTIVE. + OBJD=OBJ1-OBJ OBJB=ABS(OBJD) IF (OBJB.LT.1.0E-10) OBJB=0. - IF (NAC.EQ.0.OR.OBJB.GT.0.) NCOBJ=0 - IF (NCOBJ.GT.1) NCOBJ=0 + IF (NAC.EQ.0.OR.OBJB.GT.0.) NCOBJ=0 + IF (NCOBJ.GT.1) NCOBJ=0 C ------------------------------------------------------------------ C PRINT C ------------------------------------------------------------------ -C PRINT MOVE PARAMETER, NEW X-VECTOR AND CONSTRAINTS. +C PRINT MOVE PARAMETER, NEW X-VECTOR AND CONSTRAINTS. IF (IPRINT.LT.3) GO TO 730 WRITE (IOUT,1390) ALP 730 IF (IPRINT.LT.2) GO TO 800 - IF (OBJB.GT.0.) GO TO 740 + IF (OBJB.GT.0.) GO TO 740 IF (IPRINT.EQ.2) WRITE (IOUT,1400) ITER,OBJ - IF (IPRINT.GT.2) WRITE (IOUT,1410) OBJ - GO TO 760 + IF (IPRINT.GT.2) WRITE (IOUT,1410) OBJ + GO TO 760 740 IF (IPRINT.EQ.2) GO TO 750 WRITE (IOUT,1420) OBJ - GO TO 760 -750 WRITE (IOUT,1430) ITER,OBJ + GO TO 760 +750 WRITE (IOUT,1430) ITER,OBJ 760 WRITE (IOUT,1450) DO 770 I=1,NDV FF1=1. - IF (NSCAL.NE.0) FF1=SCAL(I) + IF (NSCAL.NE.0) FF1=SCAL(I) 770 G1(I)=FF1*X(I) DO 780 I=1,NDV,6 M1=MIN0(NDV,I+5) -780 WRITE (IOUT,1010) I,(G1(J),J=I,M1) +780 WRITE (IOUT,1010) I,(G1(J),J=I,M1) IF (NCON.EQ.0) GO TO 800 WRITE (IOUT,1470) - DO 790 I=1,NCON,6 - M1=MIN0(NCON,I+5) + DO 790 I=1,NCON,6 + M1=MIN0(NCON,I+5) 790 WRITE (IOUT,1010) I,(G(J),J=I,M1) 800 CONTINUE -C -C THE FOLLOWING CODE WAS ADDED ON 3/5/81 -C +C +C THE FOLLOWING CODE WAS ADDED ON 3/5/81 +C C IT HAD NOT BEEN REPORTED AS A FIX TO MAOB -C BUT WAS SENT TO JEFF STROUD A YEAR AGO +C BUT WAS SENT TO JEFF STROUD A YEAR AGO C SEE OTHER COMMENTS IN CONMIN SUBROUTINE FOR DELETIONS OF CODE -C ON 3/5/81 PERTAINING TO THIS FIX -C -C -C CHECK FEASIBILITY -C +C ON 3/5/81 PERTAINING TO THIS FIX +C +C +C CHECK FEASIBILITY +C IF(NCON.LE.0) GO TO 808 NFEASCT=10 - DO 804 I=1,NCON - C1=CTAM - IF(ISC(I).GT.0) C1=CTBM + DO 804 I=1,NCON + C1=CTAM + IF(ISC(I).GT.0) C1=CTBM IF(G(I).LE.C1) GO TO 804 - NFEAS=NFEAS+1 - GO TO 806 + NFEAS=NFEAS+1 + GO TO 806 804 CONTINUE - IF(NFEAS.GT.0) ABOBJ1=.05 - NFEAS=0 + IF(NFEAS.GT.0) ABOBJ1=.05 + NFEAS=0 PHI=5. - 806 IF(NFEAS.GE.NFEASCT) GO TO 810 + 806 IF(NFEAS.GE.NFEASCT) GO TO 810 808 CONTINUE -C +C C END OF INSERTED FIX -C +C C ------------------------------------------------------------------ C CHECK CONVERGENCE C ------------------------------------------------------------------ @@ -673,44 +673,44 @@ SUBROUTINE CNMN00 (X,VLB,VUB,G,SCAL,DF,A,S,G1,G2,B,C,ISC,IC,MS1,N1 C ABSOLUTE CHANGE IN OBJECTIVE C ------------------------------------------------------------------ OBJB=ABS(OBJD) - KOBJ=KOBJ+1 + KOBJ=KOBJ+1 IF (OBJB.GE.DABFUN.OR.NFEAS.GT.0) KOBJ=0 C ------------------------------------------------------------------ C RELATIVE CHANGE IN OBJECTIVE C ------------------------------------------------------------------ - IF (ABS(OBJ1).GT.1.0E-10) OBJD=OBJD/ABS(OBJ1) + IF (ABS(OBJ1).GT.1.0E-10) OBJD=OBJD/ABS(OBJ1) ABOBJ1=.5*(ABS(ABOBJ)+ABS(OBJD)) - ABOBJ=ABS(OBJD) - IOBJ=IOBJ+1 + ABOBJ=ABS(OBJD) + IOBJ=IOBJ+1 IF (NVC.GT.0.OR.OBJD.GE.DELFUN) IOBJ=0 - IF (IOBJ.GE.ITRM.OR.KOBJ.GE.ITRM) GO TO 810 + IF (IOBJ.GE.ITRM.OR.KOBJ.GE.ITRM) GO TO 810 OBJ1=OBJ C ------------------------------------------------------------------ C REDUCE CT IF OBJECTIVE FUNCTION IS CHANGING SLOWLY C ------------------------------------------------------------------ IF (IOBJ.LT.1.OR.NAC.EQ.0) GO TO 280 - CT=DCT*CT + CT=DCT*CT CTL=CTL*DCTL - IF (ABS(CT).LT.CTMIN) CT=-CTMIN - IF (ABS(CTL).LT.CTLMIN) CTL=-CTLMIN - GO TO 280 + IF (ABS(CT).LT.CTMIN) CT=-CTMIN + IF (ABS(CTL).LT.CTLMIN) CTL=-CTLMIN + GO TO 280 810 CONTINUE - IF (NAC.GE.N3) WRITE (IOUT,1490) + IF (NAC.GE.N3) WRITE (IOUT,1490) C ------------------------------------------------------------------ C **************** FINAL FUNCTION INFORMATION ******************** C ------------------------------------------------------------------ - IF (NSCAL.EQ.0) GO TO 830 + IF (NSCAL.EQ.0) GO TO 830 C UN-SCALE THE DESIGN VARIABLES. DO 820 I=1,NDV XI=SCAL(I) - IF (NSIDE.EQ.0) GO TO 820 + IF (NSIDE.EQ.0) GO TO 820 VLB(I)=XI*VLB(I) VUB(I)=XI*VUB(I) 820 X(I)=XI*X(I) C ------------------------------------------------------------------ -C PRINT FINAL RESULTS +C PRINT FINAL RESULTS C ------------------------------------------------------------------ -830 IF (IPRINT.EQ.0.OR.NAC.GE.N3) GO TO 940 +830 IF (IPRINT.EQ.0.OR.NAC.GE.N3) GO TO 940 WRITE (IOUT,1500) WRITE (IOUT,1420) OBJ WRITE (IOUT,1450) @@ -719,124 +719,124 @@ SUBROUTINE CNMN00 (X,VLB,VUB,G,SCAL,DF,A,S,G1,G2,B,C,ISC,IC,MS1,N1 840 WRITE (IOUT,1010) I,(X(J),J=I,M1) IF (NCON.EQ.0) GO TO 900 WRITE (IOUT,1470) - DO 850 I=1,NCON,6 - M1=MIN0(NCON,I+5) + DO 850 I=1,NCON,6 + M1=MIN0(NCON,I+5) 850 WRITE (IOUT,1010) I,(G(J),J=I,M1) -C DETERMINE WHICH CONSTRAINTS ARE ACTIVE AND PRINT. - NAC=0 - NVC=0 - DO 870 I=1,NCON +C DETERMINE WHICH CONSTRAINTS ARE ACTIVE AND PRINT. + NAC=0 + NVC=0 + DO 870 I=1,NCON CTA=CTAM - IF (ISC(I).GT.0) CTA=CTBM - GI=G(I) + IF (ISC(I).GT.0) CTA=CTBM + GI=G(I) IF (GI.GT.CTA) GO TO 860 - IF (GI.LT.CT.AND.ISC(I).EQ.0) GO TO 870 + IF (GI.LT.CT.AND.ISC(I).EQ.0) GO TO 870 IF (GI.LT.CTL.AND.ISC(I).GT.0) GO TO 870 - NAC=NAC+1 - IC(NAC)=I - GO TO 870 -860 NVC=NVC+1 + NAC=NAC+1 + IC(NAC)=I + GO TO 870 +860 NVC=NVC+1 MS1(NVC)=I 870 CONTINUE WRITE (IOUT,1060) NAC - IF (NAC.EQ.0) GO TO 880 + IF (NAC.EQ.0) GO TO 880 WRITE (IOUT,1070) WRITE (IOUT,1480) (IC(J),J=1,NAC) 880 WRITE (IOUT,1080) NVC - IF (NVC.EQ.0) GO TO 890 + IF (NVC.EQ.0) GO TO 890 WRITE (IOUT,1070) - WRITE (IOUT,1480) (MS1(J),J=1,NVC) + WRITE (IOUT,1480) (MS1(J),J=1,NVC) 890 CONTINUE 900 CONTINUE - IF (NSIDE.EQ.0) GO TO 930 + IF (NSIDE.EQ.0) GO TO 930 C DETERMINE WHICH SIDE CONSTRAINTS ARE ACTIVE AND PRINT. - NAC=0 + NAC=0 DO 920 I=1,NDV - XI=X(I) + XI=X(I) XID=VLB(I) X12=ABS(XID) - IF (X12.LT.1.) X12=1. - GI=(XID-XI)/X12 + IF (X12.LT.1.) X12=1. + GI=(XID-XI)/X12 IF (GI.LT.-1.0E-6) GO TO 910 - NAC=NAC+1 - MS1(NAC)=-I + NAC=NAC+1 + MS1(NAC)=-I 910 XID=VUB(I) X12=ABS(XID) - IF (X12.LT.1.) X12=1. - GI=(XI-XID)/X12 + IF (X12.LT.1.) X12=1. + GI=(XI-XID)/X12 IF (GI.LT.-1.0E-6) GO TO 920 - NAC=NAC+1 + NAC=NAC+1 MS1(NAC)=I 920 CONTINUE WRITE (IOUT,1090) NAC - IF (NAC.EQ.0) GO TO 930 + IF (NAC.EQ.0) GO TO 930 WRITE (IOUT,1100) - WRITE (IOUT,1480) (MS1(J),J=1,NAC) + WRITE (IOUT,1480) (MS1(J),J=1,NAC) 930 CONTINUE WRITE (IOUT,1150) - IF (ITER.GE.ITMAX) WRITE (IOUT,1160) - IF (NFEAS.GE.NFEASCT) WRITE (IOUT,1170) - IF (IOBJ.GE.ITRM) WRITE (IOUT,1180) ITRM - IF (KOBJ.GE.ITRM) WRITE (IOUT,1190) ITRM - WRITE (IOUT,1200) ITER + IF (ITER.GE.ITMAX) WRITE (IOUT,1160) + IF (NFEAS.GE.NFEASCT) WRITE (IOUT,1170) + IF (IOBJ.GE.ITRM) WRITE (IOUT,1180) ITRM + IF (KOBJ.GE.ITRM) WRITE (IOUT,1190) ITRM + WRITE (IOUT,1200) ITER WRITE (IOUT,1510) NCAL(1) - IF (NCON.GT.0) WRITE (IOUT,1520) NCAL(1) - IF (NFDG.NE.0) WRITE (IOUT,1530) NCAL(2) - IF (NCON.GT.0.AND.NFDG.EQ.1) WRITE (IOUT,1540) NCAL(2) + IF (NCON.GT.0) WRITE (IOUT,1520) NCAL(1) + IF (NFDG.NE.0) WRITE (IOUT,1530) NCAL(2) + IF (NCON.GT.0.AND.NFDG.EQ.1) WRITE (IOUT,1540) NCAL(2) C ------------------------------------------------------------------ -C RE-SET BASIC PARAMETERS TO INPUT VALUES +C RE-SET BASIC PARAMETERS TO INPUT VALUES C ------------------------------------------------------------------ -940 ITRM=IDM1 +940 ITRM=IDM1 ITMAX=IDM2 - ICNDIR=IDM3 + ICNDIR=IDM3 DELFUN=DM1 DABFUN=DM2 CT=DM3 - CTMIN=DM4 - CTL=DM5 + CTMIN=DM4 + CTL=DM5 CTLMIN=DM6 - THETA=DM7 - PHI=DM8 + THETA=DM7 + PHI=DM8 FDCH=DM9 FDCHM=DM10 - ABOBJ1=DM11 - ALPHAX=DM12 - IGOTO=0 + ABOBJ1=DM11 + ALPHAX=DM12 + IGOTO=0 950 CONTINUE IF (NSCAL.EQ.0.OR.IGOTO.EQ.0) RETURN -C UN-SCALE VARIABLES. +C UN-SCALE VARIABLES. DO 960 I=1,NDV - C(I)=X(I) -960 X(I)=X(I)*SCAL(I) + C(I)=X(I) +960 X(I)=X(I)*SCAL(I) RETURN C ------------------------------------------------------------------ C FORMATS C ------------------------------------------------------------------ -C -C +C +C 970 FORMAT (///5X,72HA COMPLETELY UNCONSTRAINED FUNCTION WITH A LINEAR 1 OBJECTIVE IS SPECIFIED//10X,8HLINOBJ =,I5/10X,8HNCON =,I5/10X,8 2HNSIDE =,I5//5X,35HCONTROL RETURNED TO CALLING PROGRAM) 980 FORMAT (///5X,56HCONMIN HAS ACHIEVED A SOLUTION OF OBJ LESS THAN - - 11.0E+40/5X,32HSOLUTION APPEARS TO BE UNBOUNDED/5X,26HOPTIMIZATION + 11.0E+40/5X,32HSOLUTION APPEARS TO BE UNBOUNDED/5X,26HOPTIMIZATION 2IS TERMINATED) -990 FORMAT (5X,17HCONSTRAINT NUMBER,I5) -1000 FORMAT (5X,27HSIDE CONSTRAINT ON VARIABLE,I5) +990 FORMAT (5X,17HCONSTRAINT NUMBER,I5) +1000 FORMAT (5X,27HSIDE CONSTRAINT ON VARIABLE,I5) 1010 FORMAT (3X,I5,1H),2X,6E13.5) -1020 FORMAT (/5X,35HLINEAR CONSTRAINT IDENTIFIERS (ISC)/5X,36HNON-ZERO +1020 FORMAT (/5X,35HLINEAR CONSTRAINT IDENTIFIERS (ISC)/5X,36HNON-ZERO 1INDICATES LINEAR CONSTRAINT) 1030 FORMAT (3X,I5,1H),2X,15I5) 1040 FORMAT (/5X,26HALL CONSTRAINTS ARE LINEAR) 1050 FORMAT (/5X,30HALL CONSTRAINTS ARE NON-LINEAR) 1060 FORMAT (/5X,9HTHERE ARE,I5,19H ACTIVE CONSTRAINTS) -1070 FORMAT (5X,22HCONSTRAINT NUMBERS ARE) +1070 FORMAT (5X,22HCONSTRAINT NUMBERS ARE) 1080 FORMAT (/5X,9HTHERE ARE,I5,21H VIOLATED CONSTRAINTS) -1090 FORMAT (/5X,9HTHERE ARE,I5,24H ACTIVE SIDE CONSTRAINTS) +1090 FORMAT (/5X,9HTHERE ARE,I5,24H ACTIVE SIDE CONSTRAINTS) 1100 FORMAT (5X,43HDECISION VARIABLES AT LOWER OR UPPER BOUNDS,30H (MIN 1US INDICATES LOWER BOUND)) 1110 FORMAT (/5X,22HONE-DIMENSIONAL SEARCH/5X,15HINITIAL SLOPE =,E12.4, - 12X,16HPROPOSED ALPHA =,E12.4) -1120 FORMAT (///5X,35H* * CONMIN DETECTS VLB(I).GT.VUB(I)/5X,57HFIX IS + 12X,16HPROPOSED ALPHA =,E12.4) +1120 FORMAT (///5X,35H* * CONMIN DETECTS VLB(I).GT.VUB(I)/5X,57HFIX IS 1SET X(I)=VLB(I)=VUB(I) = .5*(VLB(I)+VUB(I) FOR I =,I5) 1130 FORMAT (///5X,41H* * CONMIN DETECTS INITIAL X(I).LT.VLB(I)/5X,6HX( 1I) =,E12.4,2X,8HVLB(I) =,E12.4/5X,35HX(I) IS SET EQUAL TO VLB(I) F @@ -844,20 +844,20 @@ 970 FORMAT (///5X,72HA COMPLETELY UNCONSTRAINED FUNCTION WITH A LINEAR 1140 FORMAT (///5X,41H* * CONMIN DETECTS INITIAL X(I).GT.VUB(I)/5X,6HX( 1I) =,E12.4,2X,8HVUB(I) =,E12.4/5X,35HX(I) IS SET EQUAL TO VUB(I) F 2OR I =,I5) -1150 FORMAT (/5X,21HTERMINATION CRITERION) -1160 FORMAT (10X,17HITER EQUALS ITMAX) -1170 FORMAT (10X,'NFEASCT CONSECUTIVE ITERATIONS FAILED TO PRODUCE A +1150 FORMAT (/5X,21HTERMINATION CRITERION) +1160 FORMAT (10X,17HITER EQUALS ITMAX) +1170 FORMAT (10X,'NFEASCT CONSECUTIVE ITERATIONS FAILED TO PRODUCE A 1FEASIBLE DESIGN') -1180 FORMAT (10X,43HABS(1-OBJ(I-1)/OBJ(I)) LESS THAN DELFUN FOR,I3,11H - 1ITERATIONS) -1190 FORMAT (10X,43HABS(OBJ(I)-OBJ(I-1)) LESS THAN DABFUN FOR,I3,11H - 1ITERATIONS) -1200 FORMAT (/5X,22HNUMBER OF ITERATIONS =,I5) +1180 FORMAT (10X,43HABS(1-OBJ(I-1)/OBJ(I)) LESS THAN DELFUN FOR,I3,11H + 1ITERATIONS) +1190 FORMAT (10X,43HABS(OBJ(I)-OBJ(I-1)) LESS THAN DABFUN FOR,I3,11H + 1ITERATIONS) +1200 FORMAT (/5X,22HNUMBER OF ITERATIONS =,I5) 1210 FORMAT (/5X,28HCONSTRAINT PARAMETER, BETA =,E14.5) -1220 FORMAT (1H1,////12X,27(2H* )/12X,1H*,51X,1H*/12X,1H*,20X,11HC O N - 1M I N,20X,1H*/12X,1H*,51X,1H*/12X,1H*,15X,21H FORTRAN PROGRAM FOR +1220 FORMAT (1H1,////12X,27(2H* )/12X,1H*,51X,1H*/12X,1H*,20X,11HC O N + 1M I N,20X,1H*/12X,1H*,51X,1H*/12X,1H*,15X,21H FORTRAN PROGRAM FOR 2,15X,1H*/12X,1H*,51X,1H*/12X,1H*,9X,33HCONSTRAINED FUNCTION MINIMI - 3ZATION,9X,1H*/12X,1H*,51X,1H*/12X,27(2H* )) + 3ZATION,9X,1H*/12X,1H*,51X,1H*/12X,27(2H* )) 1230 FORMAT (////5X,33HCONSTRAINED FUNCTION MINIMIZATION//5X,18HCONTROL 1 PARAMETERS) 1240 FORMAT (/5X,60HIPRINT NDV ITMAX NCON NSIDE ICNDIR NSC @@ -871,34 +871,34 @@ 1230 FORMAT (////5X,33HCONSTRAINED FUNCTION MINIMIZATION//5X,18HCONTROL 1280 FORMAT (/5X,40HUPPER BOUNDS ON DECISION VARIABLES (VUB)) 1290 FORMAT (////5X,35HUNCONSTRAINED FUNCTION MINIMIZATION//5X,18HCONTR 1OL PARAMETERS) -1300 FORMAT (/5X,21HSCALING VECTOR (SCAL)) +1300 FORMAT (/5X,21HSCALING VECTOR (SCAL)) 1310 FORMAT (////5X,22HBEGIN ITERATION NUMBER,I5) -1320 FORMAT (/5X,4HCT =,E14.5,5X,5HCTL =,E14.5,5X,5HPHI =,E14.5) -1330 FORMAT (/5X,25HNEW SCALING VECTOR (SCAL)) -1340 FORMAT (/5X,15HGRADIENT OF OBJ) +1320 FORMAT (/5X,4HCT =,E14.5,5X,5HCTL =,E14.5,5X,5HPHI =,E14.5) +1330 FORMAT (/5X,25HNEW SCALING VECTOR (SCAL)) +1340 FORMAT (/5X,15HGRADIENT OF OBJ) 1350 FORMAT (/5X,44HGRADIENTS OF ACTIVE AND VIOLATED CONSTRAINTS) 1360 FORMAT (1H ) -1370 FORMAT (/5X,37HPUSH-OFF FACTORS, (THETA(I), I=1,NAC)) -1380 FORMAT (/5X,27HSEARCH DIRECTION (S-VECTOR)) +1370 FORMAT (/5X,37HPUSH-OFF FACTORS, (THETA(I), I=1,NAC)) +1380 FORMAT (/5X,27HSEARCH DIRECTION (S-VECTOR)) 1390 FORMAT (/5X,18HCALCULATED ALPHA =,E14.5) 1400 FORMAT (////5X,6HITER =,I5,5X,5HOBJ =,E14.5,5X,16HNO CHANGE IN OBJ - 1) -1410 FORMAT (/5X,5HOBJ =,E15.6,5X,16HNO CHANGE ON OBJ) + 1) +1410 FORMAT (/5X,5HOBJ =,E15.6,5X,16HNO CHANGE ON OBJ) 1420 FORMAT (/5X,5HOBJ =,E15.6) 1430 FORMAT (////5X,6HITER =,I5,5X,5HOBJ =,E14.5) -1440 FORMAT (//5X,28HINITIAL FUNCTION INFORMATION//5X,5HOBJ =,E15.6) -1450 FORMAT (/5X,29HDECISION VARIABLES (X-VECTOR)) +1440 FORMAT (//5X,28HINITIAL FUNCTION INFORMATION//5X,5HOBJ =,E15.6) +1450 FORMAT (/5X,29HDECISION VARIABLES (X-VECTOR)) 1460 FORMAT (3X,7E13.4) 1470 FORMAT (/5X,28HCONSTRAINT VALUES (G-VECTOR)) 1480 FORMAT (5X,15I5) 1490 FORMAT (/5X,59HTHE NUMBER OF ACTIVE AND VIOLATED CONSTRAINTS EXCEE - 1DS N3-1./5X,66HDIMENSIONED SIZE OF MATRICES A AND B AND VECTOR IC + 1DS N3-1./5X,66HDIMENSIONED SIZE OF MATRICES A AND B AND VECTOR IC 2IS INSUFFICIENT/5X,61HOPTIMIZATION TERMINATED AND CONTROL RETURNED 3 TO MAIN PROGRAM.) -1500 FORMAT (1H1,////4X,30HFINAL OPTIMIZATION INFORMATION) -1510 FORMAT (/5X,32HOBJECTIVE FUNCTION WAS EVALUATED,8X,I5,2X,5HTIMES) +1500 FORMAT (1H1,////4X,30HFINAL OPTIMIZATION INFORMATION) +1510 FORMAT (/5X,32HOBJECTIVE FUNCTION WAS EVALUATED,8X,I5,2X,5HTIMES) 1520 FORMAT (/5X,35HCONSTRAINT FUNCTIONS WERE EVALUATED,I10,2X,5HTIMES) 1530 FORMAT (/5X,36HGRADIENT OF OBJECTIVE WAS CALCULATED,I9,2X,5HTIMES) 1540 FORMAT (/5X,40HGRADIENTS OF CONSTRAINTS WERE CALCULATED,I5,2X,5HTI 1MES) - END + END diff --git a/pyoptsparse/pyCONMIN/source/cnmn01.f b/pyoptsparse/pyCONMIN/source/cnmn01.f index 694c7359..389ba0d9 100644 --- a/pyoptsparse/pyCONMIN/source/cnmn01.f +++ b/pyoptsparse/pyCONMIN/source/cnmn01.f @@ -3,36 +3,36 @@ SUBROUTINE CNMN01 (JGOTO,X,DF,G,ISC,IC,A,G1,VLB,VUB,SCAL,C,NCAL,DX IMPLICIT DOUBLE PRECISION(A-H,O-Z) COMMON /CNMN1/ DELFUN,DABFUN,FDCH,FDCHM,CT,CTMIN,CTL,CTLMIN,ALPHAX 1,ABOBJ1,THETA,OBJ,NDV,NCON,NSIDE,IPRINT,NFDG,NSCAL,LINOBJ,ITMAX,IT - 2RM,ICNDIR,IGOTO,NAC,INFO,INFOG,ITER,NFEASCT + 2RM,ICNDIR,IGOTO,NAC,INFO,INFOG,ITER,NFEASCT DIMENSION X(N1), DF(N1), G(N2), ISC(N2), IC(N3), A(N1,N3), G1(N2), - 1 VLB(N1), VUB(N1), SCAL(N1), NCAL(2), C(N4) -C ROUTINE TO CALCULATE GRADIENT INFORMATION BY FINITE DIFFERENCE. -C BY G. N. VANDERPLAATS JUNE, 1972. -C NASA-AMES RESEARCH CENTER, MOFFETT FIELD, CALIF. + 1 VLB(N1), VUB(N1), SCAL(N1), NCAL(2), C(N4) +C ROUTINE TO CALCULATE GRADIENT INFORMATION BY FINITE DIFFERENCE. +C BY G. N. VANDERPLAATS JUNE, 1972. +C NASA-AMES RESEARCH CENTER, MOFFETT FIELD, CALIF. IF (JGOTO.EQ.1) GO TO 10 IF (JGOTO.EQ.2) GO TO 70 - INFOG=0 + INFOG=0 INF=INFO - NAC=0 - IF (LINOBJ.NE.0.AND.ITER.GT.1) GO TO 10 + NAC=0 + IF (LINOBJ.NE.0.AND.ITER.GT.1) GO TO 10 C ------------------------------------------------------------------ -C GRADIENT OF LINEAR OBJECTIVE +C GRADIENT OF LINEAR OBJECTIVE C ------------------------------------------------------------------ IF (NFDG.EQ.2) JGOTO=1 - IF (NFDG.EQ.2) RETURN + IF (NFDG.EQ.2) RETURN 10 CONTINUE - JGOTO=0 - IF (NFDG.EQ.2.AND.NCON.EQ.0) RETURN - IF (NCON.EQ.0) GO TO 40 + JGOTO=0 + IF (NFDG.EQ.2.AND.NCON.EQ.0) RETURN + IF (NCON.EQ.0) GO TO 40 C ------------------------------------------------------------------ C * * * DETERMINE WHICH CONSTRAINTS ARE ACTIVE OR VIOLATED * * * C ------------------------------------------------------------------ DO 20 I=1,NCON IF (G(I).LT.CT) GO TO 20 - IF (ISC(I).GT.0.AND.G(I).LT.CTL) GO TO 20 - NAC=NAC+1 - IF (NAC.GE.N3) RETURN - IC(NAC)=I + IF (ISC(I).GT.0.AND.G(I).LT.CTL) GO TO 20 + NAC=NAC+1 + IF (NAC.GE.N3) RETURN + IC(NAC)=I 20 CONTINUE IF (NFDG.EQ.2.AND.NAC.EQ.0) RETURN IF ((LINOBJ.GT.0.AND.ITER.GT.1).AND.NAC.EQ.0) RETURN @@ -42,54 +42,54 @@ SUBROUTINE CNMN01 (JGOTO,X,DF,G,ISC,IC,A,G1,VLB,VUB,SCAL,C,NCAL,DX DO 30 I=1,NCON 30 G1(I)=G(I) 40 CONTINUE - JGOTO=0 + JGOTO=0 IF (NAC.EQ.0.AND.NFDG.EQ.2) RETURN C ------------------------------------------------------------------ C CALCULATE GRADIENTS C ------------------------------------------------------------------ - INFOG=1 + INFOG=1 INFO=1 FI=OBJ - III=0 -50 III=III+1 - XI=X(III) + III=0 +50 III=III+1 + XI=X(III) DX=FDCH*XI DX=ABS(DX) - FDCH1=FDCHM - IF (NSCAL.NE.0) FDCH1=FDCHM/SCAL(III) - IF (DX.LT.FDCH1) DX=FDCH1 + FDCH1=FDCHM + IF (NSCAL.NE.0) FDCH1=FDCHM/SCAL(III) + IF (DX.LT.FDCH1) DX=FDCH1 X1=XI+DX IF (NSIDE.EQ.0) GO TO 60 IF (X1.GT.VUB(III)) DX=-DX -60 DX1=1./DX +60 DX1=1./DX X(III)=XI+DX - NCAL(1)=NCAL(1)+1 + NCAL(1)=NCAL(1)+1 C ------------------------------------------------------------------ -C FUNCTION EVALUATION +C FUNCTION EVALUATION C ------------------------------------------------------------------ - JGOTO=2 + JGOTO=2 RETURN 70 CONTINUE - X(III)=XI - IF (NFDG.EQ.0) DF(III)=DX1*(OBJ-FI) + X(III)=XI + IF (NFDG.EQ.0) DF(III)=DX1*(OBJ-FI) IF (NAC.EQ.0) GO TO 90 C ------------------------------------------------------------------ -C DETERMINE GRADIENT COMPONENTS OF ACTIVE CONSTRAINTS +C DETERMINE GRADIENT COMPONENTS OF ACTIVE CONSTRAINTS C ------------------------------------------------------------------ - DO 80 J=1,NAC + DO 80 J=1,NAC I1=IC(J) -80 A(III,J)=DX1*(G(I1)-G1(I1)) +80 A(III,J)=DX1*(G(I1)-G1(I1)) 90 CONTINUE IF (III.LT.NDV) GO TO 50 - INFOG=0 + INFOG=0 INFO=INF - JGOTO=0 + JGOTO=0 OBJ=FI - IF (NCON.EQ.0) RETURN + IF (NCON.EQ.0) RETURN C ------------------------------------------------------------------ C STORE CURRENT CONSTRAINT VALUES BACK IN G-VECTOR C ------------------------------------------------------------------ - DO 100 I=1,NCON + DO 100 I=1,NCON 100 G(I)=G1(I) RETURN - END \ No newline at end of file + END diff --git a/pyoptsparse/pyCONMIN/source/cnmn02.f b/pyoptsparse/pyCONMIN/source/cnmn02.f index 8dd1fab4..5d4b108d 100644 --- a/pyoptsparse/pyCONMIN/source/cnmn02.f +++ b/pyoptsparse/pyCONMIN/source/cnmn02.f @@ -2,61 +2,61 @@ SUBROUTINE CNMN02 (NCALC,SLOPE,DFTDF1,DF,S,N1) IMPLICIT DOUBLE PRECISION(A-H,O-Z) COMMON /CNMN1/ DELFUN,DABFUN,FDCH,FDCHM,CT,CTMIN,CTL,CTLMIN,ALPHAX 1,ABOBJ1,THETA,OBJ,NDV,NCON,NSIDE,IPRINT,NFDG,NSCAL,LINOBJ,ITMAX,IT - 2RM,ICNDIR,IGOTO,NAC,INFO,INFOG,ITER,NFEASCT - DIMENSION DF(N1), S(N1) + 2RM,ICNDIR,IGOTO,NAC,INFO,INFOG,ITER,NFEASCT + DIMENSION DF(N1), S(N1) C ROUTINE TO DETERMINE CONJUGATE DIRECTION VECTOR OR DIRECTION C OF STEEPEST DESCENT FOR UNCONSTRAINED FUNCTION MINIMIZATION. C BY G. N. VANDERPLAATS APRIL, 1972. C NASA-AMES RESEARCH CENTER, MOFFETT FIELD, CALIF. C NCALC = CALCULATION CONTROL. C NCALC = 0, S = STEEPEST DESCENT. -C NCALC = 1, S = CONJUGATE DIRECTION. +C NCALC = 1, S = CONJUGATE DIRECTION. C CONJUGATE DIRECTION IS FOUND BY FLETCHER-REEVES ALGORITHM. C ------------------------------------------------------------------ -C CALCULATE NORM OF GRADIENT VECTOR +C CALCULATE NORM OF GRADIENT VECTOR C ------------------------------------------------------------------ DFTDF=0. - DO 10 I=1,NDV - DFI=DF(I) -10 DFTDF=DFTDF+DFI*DFI + DO 10 I=1,NDV + DFI=DF(I) +10 DFTDF=DFTDF+DFI*DFI C ------------------------------------------------------------------ C ********** FIND DIRECTION S ********** C ------------------------------------------------------------------ IF (NCALC.NE.1) GO TO 30 - IF (DFTDF1.LT.1.0E-20) GO TO 30 + IF (DFTDF1.LT.1.0E-20) GO TO 30 C ------------------------------------------------------------------ C FIND FLETCHER-REEVES CONJUGATE DIRECTION C ------------------------------------------------------------------ - BETA=DFTDF/DFTDF1 + BETA=DFTDF/DFTDF1 SLOPE=0. - DO 20 I=1,NDV - DFI=DF(I) + DO 20 I=1,NDV + DFI=DF(I) SI=BETA*S(I)-DFI SLOPE=SLOPE+SI*DFI -20 S(I)=SI +20 S(I)=SI GO TO 50 30 CONTINUE - NCALC=0 + NCALC=0 C ------------------------------------------------------------------ C CALCULATE DIRECTION OF STEEPEST DESCENT C ------------------------------------------------------------------ - DO 40 I=1,NDV -40 S(I)=-DF(I) + DO 40 I=1,NDV +40 S(I)=-DF(I) SLOPE=-DFTDF 50 CONTINUE C ------------------------------------------------------------------ C NORMALIZE S TO MAX ABS VALUE OF UNITY C ------------------------------------------------------------------ - S1=0. - DO 60 I=1,NDV + S1=0. + DO 60 I=1,NDV S2=ABS(S(I)) - IF (S2.GT.S1) S1=S2 + IF (S2.GT.S1) S1=S2 60 CONTINUE - IF (S1.LT.1.0E-20) S1=1.0E-20 + IF (S1.LT.1.0E-20) S1=1.0E-20 S1=1./S1 - DFTDF1=DFTDF*S1 - DO 70 I=1,NDV + DFTDF1=DFTDF*S1 + DO 70 I=1,NDV 70 S(I)=S1*S(I) SLOPE=S1*SLOPE RETURN - END \ No newline at end of file + END diff --git a/pyoptsparse/pyCONMIN/source/cnmn03.f b/pyoptsparse/pyCONMIN/source/cnmn03.f index 9693a586..e79003d3 100644 --- a/pyoptsparse/pyCONMIN/source/cnmn03.f +++ b/pyoptsparse/pyCONMIN/source/cnmn03.f @@ -3,86 +3,86 @@ SUBROUTINE CNMN03 (X,S,SLOPE,ALP,FFF,A1,A2,A3,A4,F1,F2,F3,F4,APP,N IMPLICIT DOUBLE PRECISION(A-H,O-Z) COMMON /CNMN1/ DELFUN,DABFUN,FDCH,FDCHM,CT,CTMIN,CTL,CTLMIN,ALPHAX 1,ABOBJ1,THETA,OBJ,NDV,NCON,NSIDE,IPRINT,NFDG,NSCAL,LINOBJ,ITMAX,IT - 2RM,ICNDIR,IGOTO,NAC,INFO,INFOG,ITER,NFEASCT + 2RM,ICNDIR,IGOTO,NAC,INFO,INFOG,ITER,NFEASCT COMMON /OUTPUT/ IOUT - DIMENSION X(N1), S(N1), NCAL(2) + DIMENSION X(N1), S(N1), NCAL(2) C ROUTINE TO SOLVE ONE-DIMENSIONAL SEARCH IN UNCONSTRAINED -C MINIMIZATION USING 2-POINT QUADRATIC INTERPOLATION, 3-POINT +C MINIMIZATION USING 2-POINT QUADRATIC INTERPOLATION, 3-POINT C CUBIC INTERPOLATION AND 4-POINT CUBIC INTERPOLATION. C BY G. N. VANDERPLAATS APRIL, 1972. -C NASA-AMES RESEARCH CENTER, MOFFETT FIELD, CALIF. +C NASA-AMES RESEARCH CENTER, MOFFETT FIELD, CALIF. C ALP = PROPOSED MOVE PARAMETER. C SLOPE = INITIAL FUNCTION SLOPE = S-TRANSPOSE TIMES DF. -C SLOPE MUST BE NEGATIVE. -C OBJ = INITIAL FUNCTION VALUE. +C SLOPE MUST BE NEGATIVE. +C OBJ = INITIAL FUNCTION VALUE. ZRO=0. IF (JGOTO.EQ.0) GO TO 10 - GO TO (50,80,110,140,180,220,270),JGOTO + GO TO (50,80,110,140,180,220,270),JGOTO C ------------------------------------------------------------------ C INITIAL INFORMATION (ALPHA=0) C ------------------------------------------------------------------ -10 IF (SLOPE.LT.0.) GO TO 20 +10 IF (SLOPE.LT.0.) GO TO 20 ALP=0. RETURN 20 CONTINUE IF (IPRINT.GT.4) WRITE (IOUT,360) - FFF=OBJ + FFF=OBJ AP1=0. - A1=0. + A1=0. F1=OBJ A2=ALP - A3=0. - F3=0. - AP=A2 - KOUNT=0 + A3=0. + F3=0. + AP=A2 + KOUNT=0 C ------------------------------------------------------------------ -C MOVE A DISTANCE AP*S AND UPDATE FUNCTION VALUE +C MOVE A DISTANCE AP*S AND UPDATE FUNCTION VALUE C ------------------------------------------------------------------ 30 CONTINUE - KOUNT=KOUNT+1 - DO 40 I=1,NDV -40 X(I)=X(I)+AP*S(I) - IF (IPRINT.GT.4) WRITE (IOUT,370) AP - IF (IPRINT.GT.4) WRITE (IOUT,380) (X(I),I=1,NDV) - NCAL(1)=NCAL(1)+1 - JGOTO=1 + KOUNT=KOUNT+1 + DO 40 I=1,NDV +40 X(I)=X(I)+AP*S(I) + IF (IPRINT.GT.4) WRITE (IOUT,370) AP + IF (IPRINT.GT.4) WRITE (IOUT,380) (X(I),I=1,NDV) + NCAL(1)=NCAL(1)+1 + JGOTO=1 RETURN 50 CONTINUE F2=OBJ - IF (IPRINT.GT.4) WRITE (IOUT,390) F2 - IF (F2.LT.F1) GO TO 120 + IF (IPRINT.GT.4) WRITE (IOUT,390) F2 + IF (F2.LT.F1) GO TO 120 C ------------------------------------------------------------------ C CHECK FOR ILL-CONDITIONING C ------------------------------------------------------------------ IF (KOUNT.GT.5) GO TO 60 - FF=2.*ABS(F1) + FF=2.*ABS(F1) IF (F2.LT.FF) GO TO 90 - FF=5.*ABS(F1) + FF=5.*ABS(F1) IF (F2.LT.FF) GO TO 60 A2=.5*A2 AP=-A2 ALP=A2 GO TO 30 -60 F3=F2 - A3=A2 +60 F3=F2 + A3=A2 A2=.5*A2 C ------------------------------------------------------------------ -C UPDATE DESIGN VECTOR AND FUNCTION VALUE +C UPDATE DESIGN VECTOR AND FUNCTION VALUE C ------------------------------------------------------------------ - AP=A2-ALP + AP=A2-ALP ALP=A2 - DO 70 I=1,NDV -70 X(I)=X(I)+AP*S(I) - IF (IPRINT.GT.4) WRITE (IOUT,370) A2 - IF (IPRINT.GT.4) WRITE (IOUT,380) (X(I),I=1,NDV) - NCAL(1)=NCAL(1)+1 - JGOTO=2 + DO 70 I=1,NDV +70 X(I)=X(I)+AP*S(I) + IF (IPRINT.GT.4) WRITE (IOUT,370) A2 + IF (IPRINT.GT.4) WRITE (IOUT,380) (X(I),I=1,NDV) + NCAL(1)=NCAL(1)+1 + JGOTO=2 RETURN 80 CONTINUE F2=OBJ - IF (IPRINT.GT.4) WRITE (IOUT,390) F2 -C PROCEED TO CUBIC INTERPOLATION. - GO TO 160 + IF (IPRINT.GT.4) WRITE (IOUT,390) F2 +C PROCEED TO CUBIC INTERPOLATION. + GO TO 160 90 CONTINUE C ------------------------------------------------------------------ C ********** 2-POINT QUADRATIC INTERPOLATION ********** @@ -91,44 +91,44 @@ SUBROUTINE CNMN03 (X,S,SLOPE,ALP,FFF,A1,A2,A3,A4,F1,F2,F3,F4,APP,N II=1 CALL CNMN04 (II,APP,ZRO,A1,F1,SLOPE,A2,F2,ZRO,ZRO,ZRO,ZRO) IF (APP.LT.ZRO.OR.APP.GT.A2) GO TO 120 - F3=F2 - A3=A2 + F3=F2 + A3=A2 A2=APP JJ=0 C ------------------------------------------------------------------ C UPDATE DESIGN VECTOR AND FUNCTION VALUE C ------------------------------------------------------------------ - AP=A2-ALP + AP=A2-ALP ALP=A2 DO 100 I=1,NDV -100 X(I)=X(I)+AP*S(I) - IF (IPRINT.GT.4) WRITE (IOUT,370) A2 - IF (IPRINT.GT.4) WRITE (IOUT,380) (X(I),I=1,NDV) - NCAL(1)=NCAL(1)+1 - JGOTO=3 +100 X(I)=X(I)+AP*S(I) + IF (IPRINT.GT.4) WRITE (IOUT,370) A2 + IF (IPRINT.GT.4) WRITE (IOUT,380) (X(I),I=1,NDV) + NCAL(1)=NCAL(1)+1 + JGOTO=3 RETURN 110 CONTINUE F2=OBJ - IF (IPRINT.GT.4) WRITE (IOUT,390) F2 - GO TO 150 + IF (IPRINT.GT.4) WRITE (IOUT,390) F2 + GO TO 150 120 A3=2.*A2 C ------------------------------------------------------------------ C UPDATE DESIGN VECTOR AND FUNCTION VALUE C ------------------------------------------------------------------ - AP=A3-ALP + AP=A3-ALP ALP=A3 DO 130 I=1,NDV -130 X(I)=X(I)+AP*S(I) - IF (IPRINT.GT.4) WRITE (IOUT,370) A3 - IF (IPRINT.GT.4) WRITE (IOUT,380) (X(I),I=1,NDV) - NCAL(1)=NCAL(1)+1 - JGOTO=4 +130 X(I)=X(I)+AP*S(I) + IF (IPRINT.GT.4) WRITE (IOUT,370) A3 + IF (IPRINT.GT.4) WRITE (IOUT,380) (X(I),I=1,NDV) + NCAL(1)=NCAL(1)+1 + JGOTO=4 RETURN 140 CONTINUE F3=OBJ - IF (IPRINT.GT.4) WRITE (IOUT,390) F3 + IF (IPRINT.GT.4) WRITE (IOUT,390) F3 150 CONTINUE - IF (F3.LT.F2) GO TO 190 + IF (F3.LT.F2) GO TO 190 160 CONTINUE C ------------------------------------------------------------------ C ********** 3-POINT CUBIC INTERPOLATION ********** @@ -139,39 +139,39 @@ SUBROUTINE CNMN03 (X,S,SLOPE,ALP,FFF,A1,A2,A3,A4,F1,F2,F3,F4,APP,N C ------------------------------------------------------------------ C UPDATE DESIGN VECTOR AND FUNCTION VALUE. C ------------------------------------------------------------------ - AP1=APP + AP1=APP AP=APP-ALP - ALP=APP + ALP=APP DO 170 I=1,NDV -170 X(I)=X(I)+AP*S(I) +170 X(I)=X(I)+AP*S(I) IF (IPRINT.GT.4) WRITE (IOUT,370) ALP - IF (IPRINT.GT.4) WRITE (IOUT,380) (X(I),I=1,NDV) - NCAL(1)=NCAL(1)+1 - JGOTO=5 + IF (IPRINT.GT.4) WRITE (IOUT,380) (X(I),I=1,NDV) + NCAL(1)=NCAL(1)+1 + JGOTO=5 RETURN 180 CONTINUE IF (IPRINT.GT.4) WRITE (IOUT,390) OBJ C ------------------------------------------------------------------ -C CHECK CONVERGENCE +C CHECK CONVERGENCE C ------------------------------------------------------------------ AA=1.-APP/A2 - AB2=ABS(F2) + AB2=ABS(F2) AB3=ABS(OBJ) AB=AB2 - IF (AB3.GT.AB) AB=AB3 - IF (AB.LT.1.0E-15) AB=1.0E-15 - AB=(AB2-AB3)/AB - IF (ABS(AB).LT.1.0E-15.AND.ABS(AA).LT..001) GO TO 330 - A4=A3 - F4=F3 + IF (AB3.GT.AB) AB=AB3 + IF (AB.LT.1.0E-15) AB=1.0E-15 + AB=(AB2-AB3)/AB + IF (ABS(AB).LT.1.0E-15.AND.ABS(AA).LT..001) GO TO 330 + A4=A3 + F4=F3 A3=APP F3=OBJ - IF (A3.GT.A2) GO TO 230 - A3=A2 - F3=F2 + IF (A3.GT.A2) GO TO 230 + A3=A2 + F3=F2 A2=APP F2=OBJ - GO TO 230 + GO TO 230 190 CONTINUE C ------------------------------------------------------------------ C ********** 4-POINT CUBIC INTERPOLATION ********** @@ -179,97 +179,97 @@ SUBROUTINE CNMN03 (X,S,SLOPE,ALP,FFF,A1,A2,A3,A4,F1,F2,F3,F4,APP,N 200 CONTINUE A4=2.*A3 C UPDATE DESIGN VECTOR AND FUNCTION VALUE. - AP=A4-ALP + AP=A4-ALP ALP=A4 DO 210 I=1,NDV -210 X(I)=X(I)+AP*S(I) +210 X(I)=X(I)+AP*S(I) IF (IPRINT.GT.4) WRITE (IOUT,370) ALP - IF (IPRINT.GT.4) WRITE (IOUT,380) (X(I),I=1,NDV) - NCAL(1)=NCAL(1)+1 - JGOTO=6 + IF (IPRINT.GT.4) WRITE (IOUT,380) (X(I),I=1,NDV) + NCAL(1)=NCAL(1)+1 + JGOTO=6 RETURN 220 CONTINUE F4=OBJ - IF (IPRINT.GT.4) WRITE (IOUT,390) F4 - IF (F4.GT.F3) GO TO 230 - A1=A2 - F1=F2 - A2=A3 - F2=F3 - A3=A4 - F3=F4 - GO TO 200 + IF (IPRINT.GT.4) WRITE (IOUT,390) F4 + IF (F4.GT.F3) GO TO 230 + A1=A2 + F1=F2 + A2=A3 + F2=F3 + A3=A4 + F3=F4 + GO TO 200 230 CONTINUE II=4 - CALL CNMN04 (II,APP,A1,A1,F1,SLOPE,A2,F2,A3,F3,A4,F4) + CALL CNMN04 (II,APP,A1,A1,F1,SLOPE,A2,F2,A3,F3,A4,F4) IF (APP.GT.A1) GO TO 250 - AP=A1-ALP + AP=A1-ALP ALP=A1 OBJ=F1 DO 240 I=1,NDV -240 X(I)=X(I)+AP*S(I) - GO TO 280 +240 X(I)=X(I)+AP*S(I) + GO TO 280 250 CONTINUE C ------------------------------------------------------------------ -C UPDATE DESIGN VECTOR AND FUNCTION VALUE +C UPDATE DESIGN VECTOR AND FUNCTION VALUE C ------------------------------------------------------------------ AP=APP-ALP - ALP=APP + ALP=APP DO 260 I=1,NDV -260 X(I)=X(I)+AP*S(I) +260 X(I)=X(I)+AP*S(I) IF (IPRINT.GT.4) WRITE (IOUT,370) ALP - IF (IPRINT.GT.4) WRITE (IOUT,380) (X(I),I=1,NDV) - NCAL(1)=NCAL(1)+1 - JGOTO=7 + IF (IPRINT.GT.4) WRITE (IOUT,380) (X(I),I=1,NDV) + NCAL(1)=NCAL(1)+1 + JGOTO=7 RETURN 270 CONTINUE IF (IPRINT.GT.4) WRITE (IOUT,390) OBJ 280 CONTINUE C ------------------------------------------------------------------ -C CHECK FOR ILL-CONDITIONING +C CHECK FOR ILL-CONDITIONING C ------------------------------------------------------------------ - IF (OBJ.GT.F2.OR.OBJ.GT.F3) GO TO 290 + IF (OBJ.GT.F2.OR.OBJ.GT.F3) GO TO 290 IF (OBJ.LE.F1) GO TO 330 - AP=A1-ALP + AP=A1-ALP ALP=A1 OBJ=F1 - GO TO 310 + GO TO 310 290 CONTINUE - IF (F2.LT.F3) GO TO 300 + IF (F2.LT.F3) GO TO 300 OBJ=F3 - AP=A3-ALP + AP=A3-ALP ALP=A3 - GO TO 310 + GO TO 310 300 OBJ=F2 - AP=A2-ALP + AP=A2-ALP ALP=A2 310 CONTINUE C ------------------------------------------------------------------ C UPDATE DESIGN VECTOR C ------------------------------------------------------------------ DO 320 I=1,NDV -320 X(I)=X(I)+AP*S(I) +320 X(I)=X(I)+AP*S(I) 330 CONTINUE C ------------------------------------------------------------------ -C CHECK FOR MULTIPLE MINIMA +C CHECK FOR MULTIPLE MINIMA C ------------------------------------------------------------------ - IF (OBJ.LE.FFF) GO TO 350 + IF (OBJ.LE.FFF) GO TO 350 C INITIAL FUNCTION IS MINIMUM. DO 340 I=1,NDV 340 X(I)=X(I)-ALP*S(I) ALP=0. - OBJ=FFF + OBJ=FFF 350 CONTINUE - JGOTO=0 + JGOTO=0 RETURN C ------------------------------------------------------------------ -C FORMATS +C FORMATS C ------------------------------------------------------------------ -C -C +C +C 360 FORMAT (/////5X,60H* * * UNCONSTRAINED ONE-DIMENSIONAL SEARCH INFO 1RMATION * * *) 370 FORMAT (/5X,7HALPHA =,E14.5/5X,8HX-VECTOR) 380 FORMAT (5X,6E13.5) 390 FORMAT (/5X,5HOBJ =,E14.5) - END + END diff --git a/pyoptsparse/pyCONMIN/source/cnmn04.f b/pyoptsparse/pyCONMIN/source/cnmn04.f index 2635d11e..3b856696 100644 --- a/pyoptsparse/pyCONMIN/source/cnmn04.f +++ b/pyoptsparse/pyCONMIN/source/cnmn04.f @@ -1,121 +1,121 @@ SUBROUTINE CNMN04 (II,XBAR,EPS,X1,Y1,SLOPE,X2,Y2,X3,Y3,X4,Y4) IMPLICIT DOUBLE PRECISION(A-H,O-Z) C ROUTINE TO FIND FIRST XBAR.GE.EPS CORRESPONDING TO A MINIMUM -C OF A ONE-DIMENSIONAL REAL FUNCTION BY POLYNOMIEL INTERPOLATION. -C BY G. N. VANDERPLAATS APRIL, 1972. -C NASA-AMES RESEARCH CENTER, MOFFETT FIELD, CALIF. -C -C II = CALCULATION CONTROL. +C OF A ONE-DIMENSIONAL REAL FUNCTION BY POLYNOMIEL INTERPOLATION. +C BY G. N. VANDERPLAATS APRIL, 1972. +C NASA-AMES RESEARCH CENTER, MOFFETT FIELD, CALIF. +C +C II = CALCULATION CONTROL. C 1: 2-POINT QUADRATIC INTERPOLATION, GIVEN X1, Y1, SLOPE, -C X2 AND Y2. -C 2: 3-POINT QUADRATIC INTERPOLATION, GIVEN X1, Y1, X2, Y2, -C X3 AND Y3. +C X2 AND Y2. +C 2: 3-POINT QUADRATIC INTERPOLATION, GIVEN X1, Y1, X2, Y2, +C X3 AND Y3. C 3: 3-POINT CUBIC INTERPOLATION, GIVEN X1, Y1, SLOPE, X2, Y2, -C X3 AND Y3. -C 4: 4-POINT CUBIC INTERPOLATION, GIVEN X1, Y1, X2, Y2, X3, -C Y3, X4 AND Y4. +C X3 AND Y3. +C 4: 4-POINT CUBIC INTERPOLATION, GIVEN X1, Y1, X2, Y2, X3, +C Y3, X4 AND Y4. C EPS MAY BE NEGATIVE. -C IF REQUIRED MINIMUM ON Y DOES NOT EXITS, OR THE FUNCTION IS +C IF REQUIRED MINIMUM ON Y DOES NOT EXITS, OR THE FUNCTION IS C ILL-CONDITIONED, XBAR = EPS-1.0 WILL BE RETURNED AS AN ERROR C INDICATOR. C IF DESIRED INTERPOLATION IS ILL-CONDITIONED, A LOWER ORDER -C INTERPOLATION, CONSISTANT WITH INPUT DATA, WILL BE ATTEMPTED, -C AND II WILL BE CHANGED ACCORDINGLY. +C INTERPOLATION, CONSISTANT WITH INPUT DATA, WILL BE ATTEMPTED, +C AND II WILL BE CHANGED ACCORDINGLY. XBAR1=EPS-1. XBAR=XBAR1 - X21=X2-X1 - IF (ABS(X21).LT.1.0E-20) RETURN - NSLOP=MOD(II,2) + X21=X2-X1 + IF (ABS(X21).LT.1.0E-20) RETURN + NSLOP=MOD(II,2) GO TO (10,20,40,50),II 10 CONTINUE C ------------------------------------------------------------------ -C II=1: 2-POINT QUADRATIC INTERPOLATION +C II=1: 2-POINT QUADRATIC INTERPOLATION C ------------------------------------------------------------------ II=1 DX=X1-X2 IF (ABS(DX).LT.1.0E-20) RETURN AA=(SLOPE+(Y2-Y1)/DX)/DX - IF (AA.LT.1.0E-20) RETURN - BB=SLOPE-2.*AA*X1 + IF (AA.LT.1.0E-20) RETURN + BB=SLOPE-2.*AA*X1 XBAR=-.5*BB/AA - IF (XBAR.LT.EPS) XBAR=XBAR1 + IF (XBAR.LT.EPS) XBAR=XBAR1 RETURN 20 CONTINUE C ------------------------------------------------------------------ -C II=2: 3-POINT QUADRATIC INTERPOLATION +C II=2: 3-POINT QUADRATIC INTERPOLATION C ------------------------------------------------------------------ II=2 - X21=X2-X1 - X31=X3-X1 - X32=X3-X2 + X21=X2-X1 + X31=X3-X1 + X32=X3-X2 QQ=X21*X31*X32 IF (ABS(QQ).LT.1.0E-20) RETURN AA=(Y1*X32-Y2*X31+Y3*X21)/QQ - IF (AA.LT.1.0E-20) GO TO 30 - BB=(Y2-Y1)/X21-AA*(X1+X2) + IF (AA.LT.1.0E-20) GO TO 30 + BB=(Y2-Y1)/X21-AA*(X1+X2) XBAR=-.5*BB/AA - IF (XBAR.LT.EPS) XBAR=XBAR1 + IF (XBAR.LT.EPS) XBAR=XBAR1 RETURN 30 CONTINUE IF (NSLOP.EQ.0) RETURN GO TO 10 40 CONTINUE C ------------------------------------------------------------------ -C II=3: 3-POINT CUBIC INTERPOLATION +C II=3: 3-POINT CUBIC INTERPOLATION C ------------------------------------------------------------------ II=3 - X21=X2-X1 - X31=X3-X1 - X32=X3-X2 + X21=X2-X1 + X31=X3-X1 + X32=X3-X2 QQ=X21*X31*X32 IF (ABS(QQ).LT.1.0E-20) RETURN - X11=X1*X1 + X11=X1*X1 DNOM=X2*X2*X31-X11*X32-X3*X3*X21 IF (ABS(DNOM).LT.1.0E-20) GO TO 20 - AA=((X31*X31*(Y2-Y1)-X21*X21*(Y3-Y1))/(X31*X21)-SLOPE*X32)/DNOM + AA=((X31*X31*(Y2-Y1)-X21*X21*(Y3-Y1))/(X31*X21)-SLOPE*X32)/DNOM IF (ABS(AA).LT.1.0E-20) GO TO 20 BB=((Y2-Y1)/X21-SLOPE-AA*(X2*X2+X1*X2-2.*X11))/X21 - CC=SLOPE-3.*AA*X11-2.*BB*X1 + CC=SLOPE-3.*AA*X11-2.*BB*X1 BAC=BB*BB-3.*AA*CC - IF (BAC.LT.0.) GO TO 20 - BAC=SQRT(BAC) - XBAR=(BAC-BB)/(3.*AA) - IF (XBAR.LT.EPS) XBAR=EPS + IF (BAC.LT.0.) GO TO 20 + BAC=SQRT(BAC) + XBAR=(BAC-BB)/(3.*AA) + IF (XBAR.LT.EPS) XBAR=EPS RETURN 50 CONTINUE C ------------------------------------------------------------------ C II=4: 4-POINT CUBIC INTERPOLATION C ------------------------------------------------------------------ - X21=X2-X1 - X31=X3-X1 - X41=X4-X1 - X32=X3-X2 - X42=X4-X2 - X11=X1*X1 - X22=X2*X2 - X33=X3*X3 - X44=X4*X4 - X111=X1*X11 - X222=X2*X22 + X21=X2-X1 + X31=X3-X1 + X41=X4-X1 + X32=X3-X2 + X42=X4-X2 + X11=X1*X1 + X22=X2*X2 + X33=X3*X3 + X44=X4*X4 + X111=X1*X11 + X222=X2*X22 Q2=X31*X21*X32 IF (ABS(Q2).LT.1.0E-30) RETURN - Q1=X111*X32-X222*X31+X3*X33*X21 - Q4=X111*X42-X222*X41+X4*X44*X21 + Q1=X111*X32-X222*X31+X3*X33*X21 + Q4=X111*X42-X222*X41+X4*X44*X21 Q5=X41*X21*X42 DNOM=Q2*Q4-Q1*Q5 IF (ABS(DNOM).LT.1.0E-30) GO TO 60 - Q3=Y3*X21-Y2*X31+Y1*X32 - Q6=Y4*X21-Y2*X41+Y1*X42 - AA=(Q2*Q6-Q3*Q5)/DNOM + Q3=Y3*X21-Y2*X31+Y1*X32 + Q6=Y4*X21-Y2*X41+Y1*X42 + AA=(Q2*Q6-Q3*Q5)/DNOM BB=(Q3-Q1*AA)/Q2 CC=(Y2-Y1-AA*(X222-X111))/X21-BB*(X1+X2) BAC=BB*BB-3.*AA*CC - IF (ABS(AA).LT.1.0E-20.OR.BAC.LT.0.) GO TO 60 - BAC=SQRT(BAC) - XBAR=(BAC-BB)/(3.*AA) - IF (XBAR.LT.EPS) XBAR=XBAR1 + IF (ABS(AA).LT.1.0E-20.OR.BAC.LT.0.) GO TO 60 + BAC=SQRT(BAC) + XBAR=(BAC-BB)/(3.*AA) + IF (XBAR.LT.EPS) XBAR=XBAR1 RETURN 60 CONTINUE IF (NSLOP.EQ.1) GO TO 40 GO TO 20 - END \ No newline at end of file + END diff --git a/pyoptsparse/pyCONMIN/source/cnmn05.f b/pyoptsparse/pyCONMIN/source/cnmn05.f index 6889d5e6..00c83653 100644 --- a/pyoptsparse/pyCONMIN/source/cnmn05.f +++ b/pyoptsparse/pyCONMIN/source/cnmn05.f @@ -3,15 +3,15 @@ SUBROUTINE CNMN05 (G,DF,A,S,B,C,SLOPE,PHI,ISC,IC,MS1,NVC,N1,N2,N3, IMPLICIT DOUBLE PRECISION(A-H,O-Z) COMMON /CNMN1/ DELFUN,DABFUN,FDCH,FDCHM,CT,CTMIN,CTL,CTLMIN,ALPHAX 1,ABOBJ1,THETA,OBJ,NDV,NCON,NSIDE,IPRINT,NFDG,NSCAL,LINOBJ,ITMAX,IT - 2RM,ICNDIR,IGOTO,NAC,INFO,INFOG,ITER,NFEASCT + 2RM,ICNDIR,IGOTO,NAC,INFO,INFOG,ITER,NFEASCT COMMON /OUTPUT/ IOUT - DIMENSION DF(N1), G(N2), ISC(N2), IC(N3), A(N1,N3), S(N1), C(N4), - 1MS1(N5), B(N3,N3) + DIMENSION DF(N1), G(N2), ISC(N2), IC(N3), A(N1,N3), S(N1), C(N4), + 1MS1(N5), B(N3,N3) C ROUTINE TO SOLVE DIRECTION FINDING PROBLEM IN MODIFIED METHOD OF C FEASIBLE DIRECTIONS. -C BY G. N. VANDERPLAATS MAY, 1972. +C BY G. N. VANDERPLAATS MAY, 1972. C NASA-AMES RESEARCH CENTER, MOFFETT FIELD, CALIF. -C NORM OF S VECTOR USED HERE IS S-TRANSPOSE TIMES S.LE.1. +C NORM OF S VECTOR USED HERE IS S-TRANSPOSE TIMES S.LE.1. C IF NVC = 0 FIND DIRECTION BY ZOUTENDIJK'S METHOD. OTHERWISE C FIND MODIFIED DIRECTION. C ------------------------------------------------------------------ @@ -20,195 +20,195 @@ SUBROUTINE CNMN05 (G,DF,A,S,B,C,SLOPE,PHI,ISC,IC,MS1,NVC,N1,N2,N3, NDV1=NDV+1 NDV2=NDV+2 NAC1=NAC+1 - NVC=0 + NVC=0 THMAX=0. - CTA=ABS(CT) + CTA=ABS(CT) CT1=1./CTA - CTAM=ABS(CTMIN) + CTAM=ABS(CTMIN) CTB=ABS(CTL) CT2=1./CTB CTBM=ABS(CTLMIN) - A1=1. - DO 40 I=1,NAC -C CALCULATE THETA - NCI=IC(I) - NCJ=1 - IF (NCI.LE.NCON) NCJ=ISC(NCI) - C1=G(NCI) - CTD=CT1 + A1=1. + DO 40 I=1,NAC +C CALCULATE THETA + NCI=IC(I) + NCJ=1 + IF (NCI.LE.NCON) NCJ=ISC(NCI) + C1=G(NCI) + CTD=CT1 CTC=CTAM IF (NCJ.LE.0) GO TO 10 CTC=CTBM - CTD=CT2 + CTD=CT2 10 IF (C1.GT.CTC) NVC=NVC+1 THT=0. GG=1.+CTD*C1 IF (NCJ.EQ.0.OR.C1.GT.CTC) THT=THETA*GG*GG - IF (THT.GT.50.) THT=50. - IF (THT.GT.THMAX) THMAX=THT - A(NDV1,I)=THT + IF (THT.GT.50.) THT=50. + IF (THT.GT.THMAX) THMAX=THT + A(NDV1,I)=THT C ------------------------------------------------------------------ -C NORMALIZE GRADIENTS OF CONSTRAINTS +C NORMALIZE GRADIENTS OF CONSTRAINTS C ------------------------------------------------------------------ A(NDV2,I)=1. - IF (NCI.GT.NCON) GO TO 40 - A1=0. - DO 20 J=1,NDV - A1=A1+A(J,I)**2 + IF (NCI.GT.NCON) GO TO 40 + A1=0. + DO 20 J=1,NDV + A1=A1+A(J,I)**2 20 CONTINUE - IF (A1.LT.1.0E-20) A1=1.0E-20 - A1=SQRT(A1) + IF (A1.LT.1.0E-20) A1=1.0E-20 + A1=SQRT(A1) A(NDV2,I)=A1 A1=1./A1 - DO 30 J=1,NDV + DO 30 J=1,NDV 30 A(J,I)=A1*A(J,I) 40 CONTINUE C ------------------------------------------------------------------ -C CHECK FOR ZERO GRADIENT. PROGRAM CHANGE-FEB, 1981, GV. +C CHECK FOR ZERO GRADIENT. PROGRAM CHANGE-FEB, 1981, GV. C ------------------------------------------------------------------ - I=0 -41 I=I+1 + I=0 +41 I=I+1 42 CONTINUE IF(A(NDV2,I).GT.1.0E-6) GO TO 45 -C ZERO GRADIENT IS FOUND. WRITE ERROR MESSAGE. +C ZERO GRADIENT IS FOUND. WRITE ERROR MESSAGE. IF(IPRINT.GE.2) WRITE(IOUT,43)IC(I) 43 FORMAT(5X,13H** CONSTRAINT,I5,18H HAS ZERO GRADIENT/ *5X,23HDELETED FROM ACTIVE SET) C REDUCE NAC BY ONE. - NAC=NAC-1 + NAC=NAC-1 C SHIFT COLUMNS OF A AND ROWS OF IC IF I.LE.NAC. - IF(I.GT.NAC) GO TO 46 + IF(I.GT.NAC) GO TO 46 C SHIFT. - DO 44 J=I,NAC + DO 44 J=I,NAC J1=J+1 IC(J)=IC(J1) DO 44 K=1,NDV2 44 A(K,J)=A(K,J1) - IF(I.LE.NAC) GO TO 42 + IF(I.LE.NAC) GO TO 42 45 CONTINUE - IF(I.LT.NAC) GO TO 41 + IF(I.LT.NAC) GO TO 41 46 CONTINUE - IF(NAC.LE.0) RETURN + IF(NAC.LE.0) RETURN NAC1=NAC+1 C DETERMINE IF CONSTRAINTS ARE VIOLATED. - NVC=0 - DO 47 I=1,NAC - NCI=IC(I) - NCJ=1 + NVC=0 + DO 47 I=1,NAC + NCI=IC(I) + NCJ=1 IF(NCI.LE.NCON) NCJ=ISC(NCI) CTC=CTAM - IF(NCJ.GT.0) CTC=CTBM - IF(G(NCI).GT.CTC) NVC=NVC+1 + IF(NCJ.GT.0) CTC=CTBM + IF(G(NCI).GT.CTC) NVC=NVC+1 47 CONTINUE C ------------------------------------------------------------------ -C NORMALIZE GRADIENT OF OBJECTIVE FUNCTION AND STORE IN NAC+1 -C COLUMN OF A +C NORMALIZE GRADIENT OF OBJECTIVE FUNCTION AND STORE IN NAC+1 +C COLUMN OF A C ------------------------------------------------------------------ - A1=0. - DO 50 I=1,NDV + A1=0. + DO 50 I=1,NDV A1=A1+DF(I)**2 50 CONTINUE - IF (A1.LT.1.0E-20) A1=1.0E-20 - A1=SQRT(A1) + IF (A1.LT.1.0E-20) A1=1.0E-20 + A1=SQRT(A1) A1=1./A1 - DO 60 I=1,NDV + DO 60 I=1,NDV 60 A(I,NAC1)=A1*DF(I) -C BUILD C VECTOR. +C BUILD C VECTOR. IF (NVC.GT.0) GO TO 80 C ------------------------------------------------------------------ C BUILD C FOR CLASSICAL METHOD C ------------------------------------------------------------------ NDB=NAC1 A(NDV1,NDB)=1. - DO 70 I=1,NDB -70 C(I)=-A(NDV1,I) - GO TO 110 + DO 70 I=1,NDB +70 C(I)=-A(NDV1,I) + GO TO 110 80 CONTINUE C ------------------------------------------------------------------ -C BUILD C FOR MODIFIED METHOD +C BUILD C FOR MODIFIED METHOD C ------------------------------------------------------------------ - NDB=NAC - A(NDV1,NAC1)=-PHI + NDB=NAC + A(NDV1,NAC1)=-PHI C ------------------------------------------------------------------ C SCALE THETA'S SO THAT MAXIMUM THETA IS UNITY C ------------------------------------------------------------------ IF (THMAX.GT.0.00001) THMAX=1./THMAX - DO 90 I=1,NDB - A(NDV1,I)=A(NDV1,I)*THMAX + DO 90 I=1,NDB + A(NDV1,I)=A(NDV1,I)*THMAX 90 CONTINUE DO 100 I=1,NDB - C(I)=0. - DO 100 J=1,NDV1 + C(I)=0. + DO 100 J=1,NDV1 100 C(I)=C(I)+A(J,I)*A(J,NAC1) 110 CONTINUE C ------------------------------------------------------------------ -C BUILD B MATRIX +C BUILD B MATRIX C ------------------------------------------------------------------ DO 120 I=1,NDB DO 120 J=1,NDB - B(I,J)=0. - DO 120 K=1,NDV1 -120 B(I,J)=B(I,J)-A(K,I)*A(K,J) + B(I,J)=0. + DO 120 K=1,NDV1 +120 B(I,J)=B(I,J)-A(K,I)*A(K,J) C ------------------------------------------------------------------ C SOLVE SPECIAL L. P. PROBLEM C ------------------------------------------------------------------ CALL CNMN08 (NDB,NER,C,MS1,B,N3,N4,N5) - IF (IPRINT.GT.1.AND.NER.GT.0) WRITE (IOUT,180) + IF (IPRINT.GT.1.AND.NER.GT.0) WRITE (IOUT,180) C CALCULATE RESULTING DIRECTION VECTOR, S. SLOPE=0. C ------------------------------------------------------------------ C USABLE-FEASIBLE DIRECTION C ------------------------------------------------------------------ DO 140 I=1,NDV - S1=0. - IF (NVC.GT.0) S1=-A(I,NAC1) + S1=0. + IF (NVC.GT.0) S1=-A(I,NAC1) DO 130 J=1,NDB -130 S1=S1-A(I,J)*C(J) +130 S1=S1-A(I,J)*C(J) SLOPE=SLOPE+S1*DF(I) -140 S(I)=S1 +140 S(I)=S1 S(NDV1)=1. - IF (NVC.GT.0) S(NDV1)=-A(NDV1,NAC1) + IF (NVC.GT.0) S(NDV1)=-A(NDV1,NAC1) DO 150 J=1,NDB 150 S(NDV1)=S(NDV1)-A(NDV1,J)*C(J) C ------------------------------------------------------------------ -C CHECK TO INSURE THE S-VECTOR IS FEASIBLE. +C CHECK TO INSURE THE S-VECTOR IS FEASIBLE. C PROGRAM MOD-FEB, 1981, GV. C ------------------------------------------------------------------ DO 174 J=1,NAC -C S DOT DEL(G). - SG=0. +C S DOT DEL(G). + SG=0. DO 172 I=1,NDV -172 SG=SG+S(I)*A(I,J) +172 SG=SG+S(I)*A(I,J) C IF(SG.GT.0.) GO TO 176 -C -C THIS CHANGE MADE ON 4/8/81 FOR G. VANDERPLAATS -C - IF(SG.GT.1.0E-04) GO TO 176 +C +C THIS CHANGE MADE ON 4/8/81 FOR G. VANDERPLAATS +C + IF(SG.GT.1.0E-04) GO TO 176 C FEASIBLE FOR THIS CONSTRAINT. CONTINUE. 174 CONTINUE - GO TO 179 + GO TO 179 176 CONTINUE -C S-VECTOR IS NOT FEASIBLE DUE TO SOME NUMERICAL PROBLEM. +C S-VECTOR IS NOT FEASIBLE DUE TO SOME NUMERICAL PROBLEM. IF(IPRINT.GE.2) WRITE(IOUT,178) -178 FORMAT(5X,38H** CALCULATED S-VECTOR IS NOT FEASIBLE/5X, +178 FORMAT(5X,38H** CALCULATED S-VECTOR IS NOT FEASIBLE/5X, * 19HBETA IS SET TO ZERO) S(NDV1)=0. - NVC=0 + NVC=0 RETURN 179 CONTINUE C ------------------------------------------------------------------ C NORMALIZE S TO MAX ABS OF UNITY C ------------------------------------------------------------------ - S1=0. + S1=0. DO 160 I=1,NDV A1=ABS(S(I)) - IF (A1.GT.S1) S1=A1 + IF (A1.GT.S1) S1=A1 160 CONTINUE -C IF (S1.LT.1.0E-10) RETURN -C +C IF (S1.LT.1.0E-10) RETURN +C C E-10 CHANGED TO E-04 ON 1/12/81 -C - IF (S1.LT.1.0E-04) RETURN +C + IF (S1.LT.1.0E-04) RETURN S1=1./S1 DO 170 I=1,NDV 170 S(I)=S1*S(I) @@ -216,10 +216,10 @@ SUBROUTINE CNMN05 (G,DF,A,S,B,C,SLOPE,PHI,ISC,IC,MS1,NVC,N1,N2,N3, S(NDV1)=S1*S(NDV1) RETURN C ------------------------------------------------------------------ -C FORMATS +C FORMATS C ------------------------------------------------------------------ -C -C +C +C 180 FORMAT (//5X,46H* * DIRECTION FINDING PROCESS DID NOT CONVERGE/5X, - 129H* * S-VECTOR MAY NOT BE VALID) - END + 129H* * S-VECTOR MAY NOT BE VALID) + END diff --git a/pyoptsparse/pyCONMIN/source/cnmn06.f b/pyoptsparse/pyCONMIN/source/cnmn06.f index 82dd7d0d..aa7215dc 100644 --- a/pyoptsparse/pyCONMIN/source/cnmn06.f +++ b/pyoptsparse/pyCONMIN/source/cnmn06.f @@ -5,42 +5,42 @@ SUBROUTINE CNMN06 (X,VLB,VUB,G,SCAL,DF,S,G1,G2,CTAM,CTBM,SLOPE,ALP IMPLICIT DOUBLE PRECISION(A-H,O-Z) COMMON /CNMN1/ DELFUN,DABFUN,FDCH,FDCHM,CT,CTMIN,CTL,CTLMIN,ALPHAX 1,ABOBJ1,THETA,OBJ,NDV,NCON,NSIDE,IPRINT,NFDG,NSCAL,LINOBJ,ITMAX,IT - 2RM,ICNDIR,IGOTO,NAC,INFO,INFOG,ITER,NFEASCT + 2RM,ICNDIR,IGOTO,NAC,INFO,INFOG,ITER,NFEASCT COMMON /OUTPUT/ IOUT DIMENSION X(N1), VLB(N1), VUB(N1), G(N2), SCAL(N1), DF(N1), S(N1), - 1 G1(N2), G2(N2), ISC(N2), NCAL(2) -C ROUTINE TO SOLVE ONE-DIMENSIONAL SEARCH PROBLEM FOR CONSTRAINED + 1 G1(N2), G2(N2), ISC(N2), NCAL(2) +C ROUTINE TO SOLVE ONE-DIMENSIONAL SEARCH PROBLEM FOR CONSTRAINED C FUNCTION MINIMIZATION. -C BY G. N. VANDERPLAATS AUG., 1974. +C BY G. N. VANDERPLAATS AUG., 1974. C NASA-AMES RESEARCH CENTER, MOFFETT FIELD, CALIF. -C OBJ = INITIAL AND FINAL FUNCTION VALUE. -C ALP = MOVE PARAMETER. +C OBJ = INITIAL AND FINAL FUNCTION VALUE. +C ALP = MOVE PARAMETER. C SLOPE = INITIAL SLOPE. -C -C ALPSID = MOVE TO SIDE CONSTRAINT. -C ALPFES = MOVE TO FEASIBLE REGION. +C +C ALPSID = MOVE TO SIDE CONSTRAINT. +C ALPFES = MOVE TO FEASIBLE REGION. C ALPNC = MOVE TO NEW NON-LINEAR CONSTRAINT. C ALPLN = MOVE TO LINEAR CONSTRAINT. -C ALPCA = MOVE TO RE-ENCOUNTER CURRENTLY ACTIVE CONSTRAINT. -C ALPMIN = MOVE TO MINIMIZE FUNCTION. +C ALPCA = MOVE TO RE-ENCOUNTER CURRENTLY ACTIVE CONSTRAINT. +C ALPMIN = MOVE TO MINIMIZE FUNCTION. C ALPTOT = TOTAL MOVE PARAMETER. ZRO=0. IF (JGOTO.EQ.0) GO TO 10 - GO TO (140,310,520),JGOTO + GO TO (140,310,520),JGOTO 10 IF (IPRINT.GE.5) WRITE (IOUT,730) ALPSAV=ALP ICOUNT=0 - ALPTOT=0. -C TOLERANCES. - CTAM=ABS(CTMIN) + ALPTOT=0. +C TOLERANCES. + CTAM=ABS(CTMIN) CTBM=ABS(CTLMIN) C PROPOSED MOVE. 20 CONTINUE C ------------------------------------------------------------------ -C ***** BEGIN SEARCH OR IMPOSE SIDE CONSTRAINT MODIFICATION ***** +C ***** BEGIN SEARCH OR IMPOSE SIDE CONSTRAINT MODIFICATION ***** C ------------------------------------------------------------------ - A2=ALPSAV - ICOUNT=ICOUNT+1 + A2=ALPSAV + ICOUNT=ICOUNT+1 ALPSID=1.0E+20 C INITIAL ALPHA AND OBJ. ALP=0. @@ -51,95 +51,95 @@ SUBROUTINE CNMN06 (X,VLB,VUB,G,SCAL,DF,S,G1,G2,CTAM,CTBM,SLOPE,ALP C FIND MOVE TO SIDE CONSTRAINT AND INSURE AGAINST VIOLATION OF C SIDE CONSTRAINTS C ------------------------------------------------------------------ - DO 60 I=1,NDV - SI=S(I) + DO 60 I=1,NDV + SI=S(I) IF (ABS(SI).GT.1.0E-20) GO TO 30 C ITH COMPONENT OF S IS SMALL. SET TO ZERO. - S(I)=0. + S(I)=0. SLOPE=SLOPE-SI*DF(I) GO TO 60 30 CONTINUE - XI=X(I) + XI=X(I) SI=1./SI IF (SI.GT.0.) GO TO 40 C LOWER BOUND. XI2=VLB(I) XI1=ABS(XI2) - IF (XI1.LT.1.) XI1=1. -C CONSTRAINT VALUE. - GI=(XI2-XI)/XI1 - IF (GI.GT.-1.0E-6) GO TO 50 -C PROPOSED MOVE TO LOWER BOUND. + IF (XI1.LT.1.) XI1=1. +C CONSTRAINT VALUE. + GI=(XI2-XI)/XI1 + IF (GI.GT.-1.0E-6) GO TO 50 +C PROPOSED MOVE TO LOWER BOUND. ALPA=(XI2-XI)*SI - IF (ALPA.LT.ALPSID) ALPSID=ALPA + IF (ALPA.LT.ALPSID) ALPSID=ALPA GO TO 60 40 CONTINUE C UPPER BOUND. XI2=VUB(I) XI1=ABS(XI2) - IF (XI1.LT.1.) XI1=1. -C CONSTRAINT VALUE. - GI=(XI-XI2)/XI1 - IF (GI.GT.-1.0E-6) GO TO 50 -C PROPOSED MOVE TO UPPER BOUND. + IF (XI1.LT.1.) XI1=1. +C CONSTRAINT VALUE. + GI=(XI-XI2)/XI1 + IF (GI.GT.-1.0E-6) GO TO 50 +C PROPOSED MOVE TO UPPER BOUND. ALPA=(XI2-XI)*SI - IF (ALPA.LT.ALPSID) ALPSID=ALPA + IF (ALPA.LT.ALPSID) ALPSID=ALPA GO TO 60 50 CONTINUE -C MOVE WILL VIOLATE SIDE CONSTRAINT. SET S(I)=0. +C MOVE WILL VIOLATE SIDE CONSTRAINT. SET S(I)=0. SLOPE=SLOPE-S(I)*DF(I) - S(I)=0. - KSID=KSID+1 + S(I)=0. + KSID=KSID+1 60 CONTINUE -C ALPSID IS UPPER BOUND ON ALPHA. - IF (A2.GT.ALPSID) A2=ALPSID +C ALPSID IS UPPER BOUND ON ALPHA. + IF (A2.GT.ALPSID) A2=ALPSID 70 CONTINUE C ------------------------------------------------------------------ C CHECK ILL-CONDITIONING C ------------------------------------------------------------------ IF (KSID.EQ.NDV.OR.ICOUNT.GT.10) GO TO 710 - IF (NVC.EQ.0.AND.SLOPE.GT.0.) GO TO 710 + IF (NVC.EQ.0.AND.SLOPE.GT.0.) GO TO 710 ALPFES=-1. ALPMIN=-1. ALPLN=1.1*ALPSID ALPNC=ALPSID ALPCA=ALPSID - IF (NCON.EQ.0) GO TO 90 + IF (NCON.EQ.0) GO TO 90 C STORE CONSTRAINT VALUES IN G1. DO 80 I=1,NCON G1(I)=G(I) 80 CONTINUE 90 CONTINUE C ------------------------------------------------------------------ -C MOVE A DISTANCE A2*S +C MOVE A DISTANCE A2*S C ------------------------------------------------------------------ ALPTOT=ALPTOT+A2 DO 100 I=1,NDV - X(I)=X(I)+A2*S(I) + X(I)=X(I)+A2*S(I) 100 CONTINUE IF (IPRINT.LT.5) GO TO 130 WRITE (IOUT,740) A2 - IF (NSCAL.EQ.0) GO TO 120 + IF (NSCAL.EQ.0) GO TO 120 DO 110 I=1,NDV -110 G(I)=SCAL(I)*X(I) +110 G(I)=SCAL(I)*X(I) WRITE (IOUT,750) (G(I),I=1,NDV) - GO TO 130 + GO TO 130 120 WRITE (IOUT,750) (X(I),I=1,NDV) C ------------------------------------------------------------------ -C UPDATE FUNCTION AND CONSTRAINT VALUES +C UPDATE FUNCTION AND CONSTRAINT VALUES C ------------------------------------------------------------------ -130 NCAL(1)=NCAL(1)+1 - JGOTO=1 +130 NCAL(1)=NCAL(1)+1 + JGOTO=1 RETURN 140 CONTINUE F2=OBJ - IF (IPRINT.GE.5) WRITE (IOUT,760) F2 - IF (IPRINT.LT.5.OR.NCON.EQ.0) GO TO 150 - WRITE (IOUT,770) - WRITE (IOUT,750) (G(I),I=1,NCON) + IF (IPRINT.GE.5) WRITE (IOUT,760) F2 + IF (IPRINT.LT.5.OR.NCON.EQ.0) GO TO 150 + WRITE (IOUT,770) + WRITE (IOUT,750) (G(I),I=1,NCON) 150 CONTINUE C ------------------------------------------------------------------ -C IDENTIFY ACCAPTABILITY OF DESIGNS F1 AND F2 +C IDENTIFY ACCAPTABILITY OF DESIGNS F1 AND F2 C ------------------------------------------------------------------ C IGOOD = 0 IS ACCAPTABLE. C CV = MAXIMUM CONSTRAINT VIOLATION. @@ -149,40 +149,40 @@ SUBROUTINE CNMN06 (X,VLB,VUB,G,SCAL,DF,S,G1,G2,CTAM,CTBM,SLOPE,ALP CV2=0. NVC1=0 IF (NCON.EQ.0) GO TO 170 - DO 160 I=1,NCON - CC=CTAM + DO 160 I=1,NCON + CC=CTAM IF (ISC(I).GT.0) CC=CTBM - C1=G1(I)-CC + C1=G1(I)-CC C2=G(I)-CC - IF (C2.GT.0.) NVC1=NVC1+1 - IF (C1.GT.CV1) CV1=C1 - IF (C2.GT.CV2) CV2=C2 + IF (C2.GT.0.) NVC1=NVC1+1 + IF (C1.GT.CV1) CV1=C1 + IF (C2.GT.CV2) CV2=C2 160 CONTINUE - IF (CV1.GT.0.) IGOOD1=1 - IF (CV2.GT.0.) IGOOD2=1 + IF (CV1.GT.0.) IGOOD1=1 + IF (CV2.GT.0.) IGOOD2=1 170 CONTINUE ALP=A2 OBJ=F2 C ------------------------------------------------------------------ -C IF F2 VIOLATES FEWER CONSTRAINTS THAN F1 BUT STILL HAS CONSTRAINT -C VIOLATIONS RETURN +C IF F2 VIOLATES FEWER CONSTRAINTS THAN F1 BUT STILL HAS CONSTRAINT +C VIOLATIONS RETURN C ------------------------------------------------------------------ IF (NVC1.LT.NVC.AND.NVC1.GT.0) GO TO 710 C ------------------------------------------------------------------ C IDENTIFY BEST OF DESIGNS F1 ANF F2 C ------------------------------------------------------------------ C IBEST CORRESPONDS TO MINIMUM VALUE DESIGN. -C IF CONSTRAINTS ARE VIOLATED, IBEST CORRESPONDS TO MINIMUM -C CONSTRAINT VIOLATION. +C IF CONSTRAINTS ARE VIOLATED, IBEST CORRESPONDS TO MINIMUM +C CONSTRAINT VIOLATION. IF (IGOOD1.EQ.0.AND.IGOOD2.EQ.0) GO TO 180 C VIOLATED CONSTRAINTS. PICK MINIMUM VIOLATION. - IBEST=1 - IF (CV1.GE.CV2) IBEST=2 - GO TO 190 + IBEST=1 + IF (CV1.GE.CV2) IBEST=2 + GO TO 190 180 CONTINUE -C NO CONSTRAINT VIOLATION. PICK MINIMUM F. - IBEST=1 - IF (F2.LE.F1) IBEST=2 +C NO CONSTRAINT VIOLATION. PICK MINIMUM F. + IBEST=1 + IF (F2.LE.F1) IBEST=2 190 CONTINUE II=1 C ------------------------------------------------------------------ @@ -198,146 +198,146 @@ SUBROUTINE CNMN06 (X,VLB,VUB,G,SCAL,DF,S,G1,G2,CTAM,CTBM,SLOPE,ALP C ------------------------------------------------------------------ C ***** 2 - POINT INTERPOLATION ***** C ------------------------------------------------------------------ - III=0 -200 III=III+1 + III=0 +200 III=III+1 C1=G1(III) - C2=G(III) + C2=G(III) IF (ISC(III).EQ.0) GO TO 210 C ------------------------------------------------------------------ C LINEAR CONSTRAINT C ------------------------------------------------------------------ IF (C1.GE.1.0E-5.AND.C1.LE.CTBM) GO TO 220 - CALL CNMN07 (II,ALP,ZRO,ZRO,C1,A2,C2,ZRO,ZRO) + CALL CNMN07 (II,ALP,ZRO,ZRO,C1,A2,C2,ZRO,ZRO) IF (ALP.LE.0.) GO TO 220 IF (C1.GT.CTBM.AND.ALP.GT.ALPFES) ALPFES=ALP - IF (C1.LT.CTL.AND.ALP.LT.ALPLN) ALPLN=ALP - GO TO 220 + IF (C1.LT.CTL.AND.ALP.LT.ALPLN) ALPLN=ALP + GO TO 220 210 CONTINUE C ------------------------------------------------------------------ -C NON-LINEAR CONSTRAINT +C NON-LINEAR CONSTRAINT C ------------------------------------------------------------------ IF (C1.GE.1.0E-5.AND.C1.LE.CTAM) GO TO 220 - CALL CNMN07 (II,ALP,ZRO,ZRO,C1,A2,C2,ZRO,ZRO) + CALL CNMN07 (II,ALP,ZRO,ZRO,C1,A2,C2,ZRO,ZRO) IF (ALP.LE.0.) GO TO 220 IF (C1.GT.CTAM.AND.ALP.GT.ALPFES) ALPFES=ALP IF (C1.LT.CT.AND.ALP.LT.ALPNC) ALPNC=ALP 220 CONTINUE IF (III.LT.NCON) GO TO 200 230 CONTINUE - IF (LINOBJ.GT.0.OR.SLOPE.GE.0.) GO TO 240 -C CALCULATE ALPHA TO MINIMIZE FUNCTION. + IF (LINOBJ.GT.0.OR.SLOPE.GE.0.) GO TO 240 +C CALCULATE ALPHA TO MINIMIZE FUNCTION. CALL CNMN04 (II,ALPMIN,ZRO,ZRO,F1,SLOPE,A2,F2,ZRO,ZRO,ZRO,ZRO) 240 CONTINUE C ------------------------------------------------------------------ -C PROPOSED MOVE +C PROPOSED MOVE C ------------------------------------------------------------------ -C MOVE AT LEAST FAR ENOUGH TO OVERCOME CONSTRAINT VIOLATIONS. - A3=ALPFES +C MOVE AT LEAST FAR ENOUGH TO OVERCOME CONSTRAINT VIOLATIONS. + A3=ALPFES C MOVE TO MINIMIZE FUNCTION. - IF (ALPMIN.GT.A3) A3=ALPMIN + IF (ALPMIN.GT.A3) A3=ALPMIN C IF A3.LE.0, SET A3 = ALPSID. - IF (A3.LE.0.) A3=ALPSID -C LIMIT MOVE TO NEW CONSTRAINT ENCOUNTER. - IF (A3.GT.ALPNC) A3=ALPNC - IF (A3.GT.ALPLN) A3=ALPLN -C MAKE A3 NON-ZERO. - IF (A3.LE.1.0E-20) A3=1.0E-20 -C IF A3=A2=ALPSID AND F2 IS BEST, GO INVOKE SIDE CONSTRAINT -C MODIFICATION. - ALPB=1.-A2/A3 - ALPA=1.-ALPSID/A3 - JBEST=0 + IF (A3.LE.0.) A3=ALPSID +C LIMIT MOVE TO NEW CONSTRAINT ENCOUNTER. + IF (A3.GT.ALPNC) A3=ALPNC + IF (A3.GT.ALPLN) A3=ALPLN +C MAKE A3 NON-ZERO. + IF (A3.LE.1.0E-20) A3=1.0E-20 +C IF A3=A2=ALPSID AND F2 IS BEST, GO INVOKE SIDE CONSTRAINT +C MODIFICATION. + ALPB=1.-A2/A3 + ALPA=1.-ALPSID/A3 + JBEST=0 IF (ABS(ALPB).LT.1.0E-10.AND.ABS(ALPA).LT.1.0E-10) JBEST=1 - IF (JBEST.EQ.1.AND.IBEST.EQ.2) GO TO 20 + IF (JBEST.EQ.1.AND.IBEST.EQ.2) GO TO 20 C SIDE CONSTRAINT CHECK NOT SATISFIED. IF (NCON.EQ.0) GO TO 260 C STORE CONSTRAINT VALUES IN G2. - DO 250 I=1,NCON + DO 250 I=1,NCON G2(I)=G(I) 250 CONTINUE 260 CONTINUE -C IF A3=A2, SET A3=.9*A2. +C IF A3=A2, SET A3=.9*A2. IF (ABS(ALPB).LT.1.0E-10) A3=.9*A2 -C MOVE AT LEAST .01*A2. - IF (A3.LT.(.01*A2)) A3=.01*A2 +C MOVE AT LEAST .01*A2. + IF (A3.LT.(.01*A2)) A3=.01*A2 C LIMIT MOVE TO 5.*A2. - IF (A3.GT.(5.*A2)) A3=5.*A2 -C LIMIT MOVE TO ALPSID. - IF (A3.GT.ALPSID) A3=ALPSID -C MOVE A DISTANCE A3*S. - ALP=A3-A2 - ALPTOT=ALPTOT+ALP + IF (A3.GT.(5.*A2)) A3=5.*A2 +C LIMIT MOVE TO ALPSID. + IF (A3.GT.ALPSID) A3=ALPSID +C MOVE A DISTANCE A3*S. + ALP=A3-A2 + ALPTOT=ALPTOT+ALP DO 270 I=1,NDV X(I)=X(I)+ALP*S(I) 270 CONTINUE IF (IPRINT.LT.5) GO TO 300 - WRITE (IOUT,780) + WRITE (IOUT,780) WRITE (IOUT,740) A3 - IF (NSCAL.EQ.0) GO TO 290 + IF (NSCAL.EQ.0) GO TO 290 DO 280 I=1,NDV -280 G(I)=SCAL(I)*X(I) +280 G(I)=SCAL(I)*X(I) WRITE (IOUT,750) (G(I),I=1,NDV) - GO TO 300 + GO TO 300 290 WRITE (IOUT,750) (X(I),I=1,NDV) 300 CONTINUE C ------------------------------------------------------------------ C UPDATE FUNCTION AND CONSTRAINT VALUES C ------------------------------------------------------------------ - NCAL(1)=NCAL(1)+1 - JGOTO=2 + NCAL(1)=NCAL(1)+1 + JGOTO=2 RETURN 310 CONTINUE F3=OBJ - IF (IPRINT.GE.5) WRITE (IOUT,760) F3 - IF (IPRINT.LT.5.OR.NCON.EQ.0) GO TO 320 - WRITE (IOUT,770) - WRITE (IOUT,750) (G(I),I=1,NCON) + IF (IPRINT.GE.5) WRITE (IOUT,760) F3 + IF (IPRINT.LT.5.OR.NCON.EQ.0) GO TO 320 + WRITE (IOUT,770) + WRITE (IOUT,750) (G(I),I=1,NCON) 320 CONTINUE C ------------------------------------------------------------------ -C CALCULATE MAXIMUM CONSTRAINT VIOLATION AND PICK BEST DESIGN +C CALCULATE MAXIMUM CONSTRAINT VIOLATION AND PICK BEST DESIGN C ------------------------------------------------------------------ CV3=0. IGOOD3=0 NVC1=0 IF (NCON.EQ.0) GO TO 340 - DO 330 I=1,NCON - CC=CTAM + DO 330 I=1,NCON + CC=CTAM IF (ISC(I).GT.0) CC=CTBM C1=G(I)-CC - IF (C1.GT.CV3) CV3=C1 - IF (C1.GT.0.) NVC1=NVC1+1 + IF (C1.GT.CV3) CV3=C1 + IF (C1.GT.0.) NVC1=NVC1+1 330 CONTINUE - IF (CV3.GT.0.) IGOOD3=1 + IF (CV3.GT.0.) IGOOD3=1 340 CONTINUE C DETERMINE BEST DESIGN. - IF (IBEST.EQ.2) GO TO 360 -C CHOOSE BETWEEN F1 AND F3. + IF (IBEST.EQ.2) GO TO 360 +C CHOOSE BETWEEN F1 AND F3. IF (IGOOD1.EQ.0.AND.IGOOD3.EQ.0) GO TO 350 - IF (CV1.GE.CV3) IBEST=3 - GO TO 380 -350 IF (F3.LE.F1) IBEST=3 - GO TO 380 + IF (CV1.GE.CV3) IBEST=3 + GO TO 380 +350 IF (F3.LE.F1) IBEST=3 + GO TO 380 360 CONTINUE -C CHOOSE BETWEEN F2 AND F3. +C CHOOSE BETWEEN F2 AND F3. IF (IGOOD2.EQ.0.AND.IGOOD3.EQ.0) GO TO 370 - IF (CV2.GE.CV3) IBEST=3 - GO TO 380 -370 IF (F3.LE.F2) IBEST=3 + IF (CV2.GE.CV3) IBEST=3 + GO TO 380 +370 IF (F3.LE.F2) IBEST=3 380 CONTINUE ALP=A3 OBJ=F3 C IF F3 VIOLATES FEWER CONSTRAINTS THAN F1 RETURN. IF (NVC1.LT.NVC) GO TO 710 C IF OBJECTIVE AND ALL CONSTRAINTS ARE LINEAR, RETURN. - IF (LINOBJ.NE.0.AND.NLNC.EQ.NCON) GO TO 710 + IF (LINOBJ.NE.0.AND.NLNC.EQ.NCON) GO TO 710 C IF A3 = ALPLN AND F3 IS BOTH GOOD AND BEST RETURN. ALPB=1.-ALPLN/A3 IF ((ABS(ALPB).LT.1.0E-20.AND.IBEST.EQ.3).AND.(IGOOD3.EQ.0)) GO TO 1 710 C IF A3 = ALPSID AND F3 IS BEST, GO INVOKE SIDE CONSTRAINT -C MODIFICATION. - ALPA=1.-ALPSID/A3 - IF (ABS(ALPA).LT.1.0E-20.AND.IBEST.EQ.3) GO TO 20 +C MODIFICATION. + ALPA=1.-ALPSID/A3 + IF (ABS(ALPA).LT.1.0E-20.AND.IBEST.EQ.3) GO TO 20 C ------------------------------------------------------------------ C ********** 3 - POINT INTERPOLATION ********* C ------------------------------------------------------------------ @@ -346,7 +346,7 @@ SUBROUTINE CNMN06 (X,VLB,VUB,G,SCAL,DF,S,G1,G2,CTAM,CTBM,SLOPE,ALP ALPFES=-1. ALPMIN=-1. C ------------------------------------------------------------------ -C IF A3 IS GREATER THAN A2 AND CV3 IS GREATER THAN CV2, SET +C IF A3 IS GREATER THAN A2 AND CV3 IS GREATER THAN CV2, SET C MOVE LIMITS TO A3. PROGRAM MOD-FEB, 1981, GV. C ------------------------------------------------------------------ IF(A3.LE.A2.OR.CV3.LE.CV2) GO TO 285 @@ -355,199 +355,199 @@ SUBROUTINE CNMN06 (X,VLB,VUB,G,SCAL,DF,S,G1,G2,CTAM,CTBM,SLOPE,ALP ALPCA=A3 285 CONTINUE IF (NCON.EQ.0) GO TO 440 - III=0 -390 III=III+1 + III=0 +390 III=III+1 C1=G1(III) C2=G2(III) - C3=G(III) + C3=G(III) IF (ISC(III).EQ.0) GO TO 400 C ------------------------------------------------------------------ C LINEAR CONSTRAINT. FIND ALPFES ONLY. ALPLN SAME AS BEFORE. C ------------------------------------------------------------------ - IF (C1.LE.CTBM) GO TO 430 + IF (C1.LE.CTBM) GO TO 430 II=1 - CALL CNMN07 (II,ALP,ZRO,ZRO,C1,A3,C3,ZRO,ZRO) - IF (ALP.GT.ALPFES) ALPFES=ALP - GO TO 430 + CALL CNMN07 (II,ALP,ZRO,ZRO,C1,A3,C3,ZRO,ZRO) + IF (ALP.GT.ALPFES) ALPFES=ALP + GO TO 430 400 CONTINUE C ------------------------------------------------------------------ -C NON-LINEAR CONSTRAINT +C NON-LINEAR CONSTRAINT C ------------------------------------------------------------------ II=2 - CALL CNMN07 (II,ALP,ZRO,ZRO,C1,A2,C2,A3,C3) - IF (ALP.LE.ZRO) GO TO 430 + CALL CNMN07 (II,ALP,ZRO,ZRO,C1,A2,C2,A3,C3) + IF (ALP.LE.ZRO) GO TO 430 IF (C1.GE.CT.AND.C1.LE.0.) GO TO 410 - IF (C1.GT.CTAM.OR.C1.LT.0.) GO TO 420 -C ALP IS MINIMUM MOVE. UPDATE FOR NEXT CONSTRAINT ENCOUNTER. + IF (C1.GT.CTAM.OR.C1.LT.0.) GO TO 420 +C ALP IS MINIMUM MOVE. UPDATE FOR NEXT CONSTRAINT ENCOUNTER. 410 ALPA=ALP CALL CNMN07 (II,ALP,ALPA,ZRO,C1,A2,C2,A3,C3) - IF (ALP.LT.ALPCA.AND.ALP.GE.ALPA) ALPCA=ALP - GO TO 430 + IF (ALP.LT.ALPCA.AND.ALP.GE.ALPA) ALPCA=ALP + GO TO 430 420 CONTINUE IF (ALP.GT.ALPFES.AND.C1.GT.CTAM) ALPFES=ALP IF (ALP.LT.ALPNC.AND.C1.LT.0.) ALPNC=ALP 430 CONTINUE IF (III.LT.NCON) GO TO 390 440 CONTINUE - IF (LINOBJ.GT.0.OR.SLOPE.GT.0.) GO TO 450 + IF (LINOBJ.GT.0.OR.SLOPE.GT.0.) GO TO 450 C ------------------------------------------------------------------ -C CALCULATE ALPHA TO MINIMIZE FUNCTION +C CALCULATE ALPHA TO MINIMIZE FUNCTION C ------------------------------------------------------------------ II=3 - IF (A2.GT.A3.AND.(IGOOD2.EQ.0.AND.IBEST.EQ.2)) II=2 + IF (A2.GT.A3.AND.(IGOOD2.EQ.0.AND.IBEST.EQ.2)) II=2 CALL CNMN04 (II,ALPMIN,ZRO,ZRO,F1,SLOPE,A2,F2,A3,F3,ZRO,ZRO) 450 CONTINUE C ------------------------------------------------------------------ -C PROPOSED MOVE +C PROPOSED MOVE C ------------------------------------------------------------------ -C MOVE AT LEAST ENOUGH TO OVERCOME CONSTRAINT VIOLATIONS. - A4=ALPFES +C MOVE AT LEAST ENOUGH TO OVERCOME CONSTRAINT VIOLATIONS. + A4=ALPFES C MOVE TO MINIMIZE FUNCTION. - IF (ALPMIN.GT.A4) A4=ALPMIN + IF (ALPMIN.GT.A4) A4=ALPMIN C IF A4.LE.0, SET A4 = ALPSID. - IF (A4.LE.0.) A4=ALPSID -C LIMIT MOVE TO NEW CONSTRAINT ENCOUNTER. - IF (A4.GT.ALPLN) A4=ALPLN - IF (A4.GT.ALPNC) A4=ALPNC -C LIMIT MOVE TO RE-ENCOUNTER CURRENTLY ACTIVE CONSTRAINT. - IF (A4.GT.ALPCA) A4=ALPCA + IF (A4.LE.0.) A4=ALPSID +C LIMIT MOVE TO NEW CONSTRAINT ENCOUNTER. + IF (A4.GT.ALPLN) A4=ALPLN + IF (A4.GT.ALPNC) A4=ALPNC +C LIMIT MOVE TO RE-ENCOUNTER CURRENTLY ACTIVE CONSTRAINT. + IF (A4.GT.ALPCA) A4=ALPCA C LIMIT A4 TO 5.*A3. - IF (A4.GT.(5.*A3)) A4=5.*A3 + IF (A4.GT.(5.*A3)) A4=5.*A3 C UPDATE DESIGN. IF (IBEST.NE.3.OR.NCON.EQ.0) GO TO 470 -C STORE CONSTRAINT VALUES IN G2. F3 IS BEST. F2 IS NOT. - DO 460 I=1,NCON +C STORE CONSTRAINT VALUES IN G2. F3 IS BEST. F2 IS NOT. + DO 460 I=1,NCON G2(I)=G(I) 460 CONTINUE 470 CONTINUE -C IF A4=A3 AND IGOOD1=0 AND IGOOD3=1, SET A4=.9*A3. - ALP=A4-A3 +C IF A4=A3 AND IGOOD1=0 AND IGOOD3=1, SET A4=.9*A3. + ALP=A4-A3 IF ((IGOOD1.EQ.0.AND.IGOOD3.EQ.1).AND.ABS(ALP).LT.1.0E-20) A4=.9*A - 13 + 13 C ------------------------------------------------------------------ C MOVE A DISTANCE A4*S C ------------------------------------------------------------------ - ALP=A4-A3 - ALPTOT=ALPTOT+ALP + ALP=A4-A3 + ALPTOT=ALPTOT+ALP DO 480 I=1,NDV X(I)=X(I)+ALP*S(I) 480 CONTINUE IF (IPRINT.LT.5) GO TO 510 - WRITE (IOUT,720) + WRITE (IOUT,720) WRITE (IOUT,740) A4 - IF (NSCAL.EQ.0) GO TO 500 + IF (NSCAL.EQ.0) GO TO 500 DO 490 I=1,NDV -490 G(I)=SCAL(I)*X(I) +490 G(I)=SCAL(I)*X(I) WRITE (IOUT,750) (G(I),I=1,NDV) - GO TO 510 + GO TO 510 500 WRITE (IOUT,750) (X(I),I=1,NDV) 510 CONTINUE C ------------------------------------------------------------------ C UPDATE FUNCTION AND CONSTRAINT VALUES C ------------------------------------------------------------------ - NCAL(1)=NCAL(1)+1 - JGOTO=3 + NCAL(1)=NCAL(1)+1 + JGOTO=3 RETURN 520 CONTINUE F4=OBJ - IF (IPRINT.GE.5) WRITE (IOUT,760) F4 - IF (IPRINT.LT.5.OR.NCON.EQ.0) GO TO 530 - WRITE (IOUT,770) - WRITE (IOUT,750) (G(I),I=1,NCON) + IF (IPRINT.GE.5) WRITE (IOUT,760) F4 + IF (IPRINT.LT.5.OR.NCON.EQ.0) GO TO 530 + WRITE (IOUT,770) + WRITE (IOUT,750) (G(I),I=1,NCON) 530 CONTINUE C DETERMINE ACCAPTABILITY OF F4. IGOOD4=0 CV4=0. IF (NCON.EQ.0) GO TO 550 - DO 540 I=1,NCON - CC=CTAM + DO 540 I=1,NCON + CC=CTAM IF (ISC(I).GT.0) CC=CTBM C1=G(I)-CC - IF (C1.GT.CV4) CV4=C1 + IF (C1.GT.CV4) CV4=C1 540 CONTINUE - IF (CV4.GT.0.) IGOOD4=1 + IF (CV4.GT.0.) IGOOD4=1 550 CONTINUE ALP=A4 OBJ=F4 C ------------------------------------------------------------------ -C DETERMINE BEST DESIGN +C DETERMINE BEST DESIGN C ------------------------------------------------------------------ - GO TO (560,610,660),IBEST + GO TO (560,610,660),IBEST 560 CONTINUE -C CHOOSE BETWEEN F1 AND F4. +C CHOOSE BETWEEN F1 AND F4. IF (IGOOD1.EQ.0.AND.IGOOD4.EQ.0) GO TO 570 - IF (CV1.GT.CV4) GO TO 710 - GO TO 580 + IF (CV1.GT.CV4) GO TO 710 + GO TO 580 570 CONTINUE - IF (F4.LE.F1) GO TO 710 + IF (F4.LE.F1) GO TO 710 580 CONTINUE -C F1 IS BEST. +C F1 IS BEST. ALPTOT=ALPTOT-A4 OBJ=F1 DO 590 I=1,NDV - X(I)=X(I)-A4*S(I) + X(I)=X(I)-A4*S(I) 590 CONTINUE IF (NCON.EQ.0) GO TO 710 - DO 600 I=1,NCON + DO 600 I=1,NCON G(I)=G1(I) 600 CONTINUE - GO TO 710 + GO TO 710 610 CONTINUE -C CHOOSE BETWEEN F2 AND F4. +C CHOOSE BETWEEN F2 AND F4. IF (IGOOD2.EQ.0.AND.IGOOD4.EQ.0) GO TO 620 - IF (CV2.GT.CV4) GO TO 710 - GO TO 630 + IF (CV2.GT.CV4) GO TO 710 + GO TO 630 620 CONTINUE - IF (F4.LE.F2) GO TO 710 + IF (F4.LE.F2) GO TO 710 630 CONTINUE -C F2 IS BEST. +C F2 IS BEST. OBJ=F2 A2=A4-A2 ALPTOT=ALPTOT-A2 DO 640 I=1,NDV - X(I)=X(I)-A2*S(I) + X(I)=X(I)-A2*S(I) 640 CONTINUE IF (NCON.EQ.0) GO TO 710 - DO 650 I=1,NCON + DO 650 I=1,NCON G(I)=G2(I) 650 CONTINUE - GO TO 710 + GO TO 710 660 CONTINUE -C CHOOSE BETWEEN F3 AND F4. +C CHOOSE BETWEEN F3 AND F4. IF (IGOOD3.EQ.0.AND.IGOOD4.EQ.0) GO TO 670 - IF (CV3.GT.CV4) GO TO 710 - GO TO 680 + IF (CV3.GT.CV4) GO TO 710 + GO TO 680 670 CONTINUE - IF (F4.LE.F3) GO TO 710 + IF (F4.LE.F3) GO TO 710 680 CONTINUE -C F3 IS BEST. +C F3 IS BEST. OBJ=F3 A3=A4-A3 ALPTOT=ALPTOT-A3 DO 690 I=1,NDV - X(I)=X(I)-A3*S(I) + X(I)=X(I)-A3*S(I) 690 CONTINUE IF (NCON.EQ.0) GO TO 710 - DO 700 I=1,NCON + DO 700 I=1,NCON G(I)=G2(I) 700 CONTINUE 710 CONTINUE ALP=ALPTOT IF (IPRINT.GE.5) WRITE (IOUT,790) - JGOTO=0 + JGOTO=0 RETURN C ------------------------------------------------------------------ C FORMATS C ------------------------------------------------------------------ -C -C -720 FORMAT (/5X,25HTHREE-POINT INTERPOLATION) +C +C +720 FORMAT (/5X,25HTHREE-POINT INTERPOLATION) 730 FORMAT (/////58H* * * CONSTRAINED ONE-DIMENSIONAL SEARCH INFORMATI - 1ON * * *) -740 FORMAT (//5X,15HPROPOSED DESIGN/5X,7HALPHA =,E12.5/5X,8HX-VECTOR) + 1ON * * *) +740 FORMAT (//5X,15HPROPOSED DESIGN/5X,7HALPHA =,E12.5/5X,8HX-VECTOR) 750 FORMAT (1X,8E12.4) 760 FORMAT (/5X,5HOBJ =,E13.5) -770 FORMAT (/5X,17HCONSTRAINT VALUES) -780 FORMAT (/5X,23HTWO-POINT INTERPOLATION) -790 FORMAT (/5X,35H* * * END OF ONE-DIMENSIONAL SEARCH) - END +770 FORMAT (/5X,17HCONSTRAINT VALUES) +780 FORMAT (/5X,23HTWO-POINT INTERPOLATION) +790 FORMAT (/5X,35H* * * END OF ONE-DIMENSIONAL SEARCH) + END diff --git a/pyoptsparse/pyCONMIN/source/cnmn07.f b/pyoptsparse/pyCONMIN/source/cnmn07.f index 65fdace0..546a3ad8 100644 --- a/pyoptsparse/pyCONMIN/source/cnmn07.f +++ b/pyoptsparse/pyCONMIN/source/cnmn07.f @@ -2,66 +2,66 @@ SUBROUTINE CNMN07 (II,XBAR,EPS,X1,Y1,X2,Y2,X3,Y3) IMPLICIT DOUBLE PRECISION(A-H,O-Z) C ROUTINE TO FIND FIRST XBAR.GE.EPS CORRESPONDING TO A REAL ZERO C OF A ONE-DIMENSIONAL FUNCTION BY POLYNOMIEL INTERPOLATION. -C BY G. N. VANDERPLAATS APRIL, 1972. -C NASA-AMES RESEARCH CENTER, MOFFETT FIELD, CALIF. -C II = CALCULATION CONTROL. -C 1: 2-POINT LINEAR INTERPOLATION, GIVEN X1, Y1, X2 AND Y2. -C 2: 3-POINT QUADRATIC INTERPOLATION, GIVEN X1, Y1, X2, Y2, -C X3 AND Y3. +C BY G. N. VANDERPLAATS APRIL, 1972. +C NASA-AMES RESEARCH CENTER, MOFFETT FIELD, CALIF. +C II = CALCULATION CONTROL. +C 1: 2-POINT LINEAR INTERPOLATION, GIVEN X1, Y1, X2 AND Y2. +C 2: 3-POINT QUADRATIC INTERPOLATION, GIVEN X1, Y1, X2, Y2, +C X3 AND Y3. C EPS MAY BE NEGATIVE. C IF REQUIRED ZERO ON Y DOES NOT EXITS, OR THE FUNCTION IS C ILL-CONDITIONED, XBAR = EPS-1.0 WILL BE RETURNED AS AN ERROR C INDICATOR. C IF DESIRED INTERPOLATION IS ILL-CONDITIONED, A LOWER ORDER C INTERPOLATION, CONSISTANT WITH INPUT DATA, WILL BE ATTEMPTED AND -C II WILL BE CHANGED ACCORDINGLY. +C II WILL BE CHANGED ACCORDINGLY. XBAR1=EPS-1. XBAR=XBAR1 JJ=0 - X21=X2-X1 - IF (ABS(X21).LT.1.0E-20) RETURN - IF (II.EQ.2) GO TO 30 -C + X21=X2-X1 + IF (ABS(X21).LT.1.0E-20) RETURN + IF (II.EQ.2) GO TO 30 +C 10 CONTINUE C ------------------------------------------------------------------ -C II=1: 2-POINT LINEAR INTERPOLATION +C II=1: 2-POINT LINEAR INTERPOLATION C ------------------------------------------------------------------ II=1 YY=Y1*Y2 - IF (JJ.EQ.0.OR.YY.LT.0.) GO TO 20 + IF (JJ.EQ.0.OR.YY.LT.0.) GO TO 20 C INTERPOLATE BETWEEN X2 AND X3. DY=Y3-Y2 IF (ABS(DY).LT.1.0E-20) GO TO 20 - XBAR=X2+Y2*(X2-X3)/DY - IF (XBAR.LT.EPS) XBAR=XBAR1 + XBAR=X2+Y2*(X2-X3)/DY + IF (XBAR.LT.EPS) XBAR=XBAR1 RETURN 20 DY=Y2-Y1 C INTERPOLATE BETWEEN X1 AND X2. IF (ABS(DY).LT.1.0E-20) RETURN - XBAR=X1+Y1*(X1-X2)/DY - IF (XBAR.LT.EPS) XBAR=XBAR1 + XBAR=X1+Y1*(X1-X2)/DY + IF (XBAR.LT.EPS) XBAR=XBAR1 RETURN 30 CONTINUE C ------------------------------------------------------------------ -C II=2: 3-POINT QUADRATIC INTERPOLATION +C II=2: 3-POINT QUADRATIC INTERPOLATION C ------------------------------------------------------------------ JJ=1 - X31=X3-X1 - X32=X3-X2 + X31=X3-X1 + X32=X3-X2 QQ=X21*X31*X32 IF (ABS(QQ).LT.1.0E-20) RETURN AA=(Y1*X32-Y2*X31+Y3*X21)/QQ IF (ABS(AA).LT.1.0E-20) GO TO 10 - BB=(Y2-Y1)/X21-AA*(X1+X2) - CC=Y1-X1*(AA*X1+BB) + BB=(Y2-Y1)/X21-AA*(X1+X2) + CC=Y1-X1*(AA*X1+BB) BAC=BB*BB-4.*AA*CC - IF (BAC.LT.0.) GO TO 10 - BAC=SQRT(BAC) + IF (BAC.LT.0.) GO TO 10 + BAC=SQRT(BAC) AA=.5/AA XBAR=AA*(BAC-BB) XB2=-AA*(BAC+BB) - IF (XBAR.LT.EPS) XBAR=XB2 + IF (XBAR.LT.EPS) XBAR=XB2 IF (XB2.LT.XBAR.AND.XB2.GT.EPS) XBAR=XB2 - IF (XBAR.LT.EPS) XBAR=XBAR1 + IF (XBAR.LT.EPS) XBAR=XBAR1 RETURN - END \ No newline at end of file + END diff --git a/pyoptsparse/pyCONMIN/source/cnmn08.f b/pyoptsparse/pyCONMIN/source/cnmn08.f index cf4be6c1..925ec09b 100644 --- a/pyoptsparse/pyCONMIN/source/cnmn08.f +++ b/pyoptsparse/pyCONMIN/source/cnmn08.f @@ -4,109 +4,109 @@ SUBROUTINE CNMN08 (NDB,NER,C,MS1,B,N3,N4,N5) C ROUTINE TO SOLVE SPECIAL LINEAR PROBLEM FOR IMPOSING S-TRANSPOSE C TIMES S.LE.1 BOUNDS IN THE MODIFIED METHOD OF FEASIBLE DIRECTIONS. C BY G. N. VANDERPLAATS APRIL, 1972. -C NASA-AMES RESEARCH CENTER, MOFFETT FIELD, CALIF. +C NASA-AMES RESEARCH CENTER, MOFFETT FIELD, CALIF. C REF. 'STRUCTURAL OPTIMIZATION BY METHODS OF FEASIBLE DIRECTIONS', -C G. N. VANDERPLAATS AND F. MOSES, JOURNAL OF COMPUTERS +C G. N. VANDERPLAATS AND F. MOSES, JOURNAL OF COMPUTERS C AND STRUCTURES, VOL 3, PP 739-755, 1973. C FORM OF L. P. IS BX=C WHERE 1ST NDB COMPONENTS OF X CONTAIN VECTOR C U AND LAST NDB COMPONENTS CONTAIN VECTOR V. CONSTRAINTS ARE C U.GE.0, V.GE.0, AND U-TRANSPOSE TIMES V = 0. -C NER = ERROR FLAG. IF NER.NE.0 ON RETURN, PROCESS HAS NOT +C NER = ERROR FLAG. IF NER.NE.0 ON RETURN, PROCESS HAS NOT C CONVERGED IN 5*NDB ITERATIONS. -C VECTOR MS1 IDENTIFIES THE SET OF BASIC VARIABLES. +C VECTOR MS1 IDENTIFIES THE SET OF BASIC VARIABLES. C ------------------------------------------------------------------ C CHOOSE INITIAL BASIC VARIABLES AS V, AND INITIALIZE VECTOR MS1 C ------------------------------------------------------------------ - NER=1 + NER=1 M2=2*NDB -C CALCULATE CBMIN AND EPS AND INITIALIZE MS1. +C CALCULATE CBMIN AND EPS AND INITIALIZE MS1. EPS=-1.0E+10 CBMIN=0. - DO 10 I=1,NDB - BI=B(I,I) + DO 10 I=1,NDB + BI=B(I,I) CBMAX=0. IF (BI.LT.-1.0E-6) CBMAX=C(I)/BI - IF (BI.GT.EPS) EPS=BI - IF (CBMAX.GT.CBMIN) CBMIN=CBMAX + IF (BI.GT.EPS) EPS=BI + IF (CBMAX.GT.CBMIN) CBMIN=CBMAX 10 MS1(I)=0 - EPS=.0001*EPS -C IF (EPS.LT.-1.0E-10) EPS=-1.0E-10 -C + EPS=.0001*EPS +C IF (EPS.LT.-1.0E-10) EPS=-1.0E-10 +C C E-10 CHANGED TO E-03 ON 1/12/81 -C - IF (EPS.LT.-1.0E-03) EPS=-1.0E-03 - IF (EPS.GT.-.0001) EPS=-.0001 +C + IF (EPS.LT.-1.0E-03) EPS=-1.0E-03 + IF (EPS.GT.-.0001) EPS=-.0001 CBMIN=CBMIN*1.0E-6 -C IF (CBMIN.LT.1.0E-10) CBMIN=1.0E-10 -C +C IF (CBMIN.LT.1.0E-10) CBMIN=1.0E-10 +C C E-10 CHANGED TO E-05 ON 1/12/81 -C - IF (CBMIN.LT.1.0E-05) CBMIN=1.0E-05 - ITER1=0 +C + IF (CBMIN.LT.1.0E-05) CBMIN=1.0E-05 + ITER1=0 NMAX=5*NDB C ------------------------------------------------------------------ C ********** BEGIN NEW ITERATION ********** C ------------------------------------------------------------------ -20 ITER1=ITER1+1 - IF (ITER1.GT.NMAX) RETURN +20 ITER1=ITER1+1 + IF (ITER1.GT.NMAX) RETURN C FIND MAX. C(I)/B(I,I) FOR I=1,NDB. CBMAX=.9*CBMIN ICHK=0 - DO 30 I=1,NDB - C1=C(I) - BI=B(I,I) -C IF (BI.GT.EPS.OR.C1.GT.0.) GO TO 30 - IF (BI.GT.EPS.OR.C1.GT.-1.0E-05) GO TO 30 -C + DO 30 I=1,NDB + C1=C(I) + BI=B(I,I) +C IF (BI.GT.EPS.OR.C1.GT.0.) GO TO 30 + IF (BI.GT.EPS.OR.C1.GT.-1.0E-05) GO TO 30 +C C 0. CHANGED TO -1.0E-05 ON 1/12/81 -C +C CB=C1/BI - IF (CB.LE.CBMAX) GO TO 30 + IF (CB.LE.CBMAX) GO TO 30 ICHK=I CBMAX=CB 30 CONTINUE IF (CBMAX.LT.CBMIN) GO TO 70 - IF (ICHK.EQ.0) GO TO 70 + IF (ICHK.EQ.0) GO TO 70 C UPDATE VECTOR MS1. - JJ=ICHK - IF (MS1(JJ).EQ.0) JJ=ICHK+NDB - KK=JJ+NDB - IF (KK.GT.M2) KK=JJ-NDB + JJ=ICHK + IF (MS1(JJ).EQ.0) JJ=ICHK+NDB + KK=JJ+NDB + IF (KK.GT.M2) KK=JJ-NDB MS1(KK)=ICHK - MS1(JJ)=0 + MS1(JJ)=0 C ------------------------------------------------------------------ -C PIVOT OF B(ICHK,ICHK) +C PIVOT OF B(ICHK,ICHK) C ------------------------------------------------------------------ BB=1./B(ICHK,ICHK) - DO 40 J=1,NDB + DO 40 J=1,NDB 40 B(ICHK,J)=BB*B(ICHK,J) - C(ICHK)=CBMAX - B(ICHK,ICHK)=BB + C(ICHK)=CBMAX + B(ICHK,ICHK)=BB C ELIMINATE COEFICIENTS ON VARIABLE ENTERING BASIS AND STORE -C COEFICIENTS ON VARIABLE LEAVING BASIS IN THEIR PLACE. - DO 60 I=1,NDB - IF (I.EQ.ICHK) GO TO 60 - BB1=B(I,ICHK) +C COEFICIENTS ON VARIABLE LEAVING BASIS IN THEIR PLACE. + DO 60 I=1,NDB + IF (I.EQ.ICHK) GO TO 60 + BB1=B(I,ICHK) B(I,ICHK)=0. - DO 50 J=1,NDB -50 B(I,J)=B(I,J)-BB1*B(ICHK,J) - C(I)=C(I)-BB1*CBMAX + DO 50 J=1,NDB +50 B(I,J)=B(I,J)-BB1*B(ICHK,J) + C(I)=C(I)-BB1*CBMAX 60 CONTINUE GO TO 20 70 CONTINUE - NER=0 + NER=0 C ------------------------------------------------------------------ -C STORE ONLY COMPONENTS OF U-VECTOR IN 'C'. USE B(I,1) FOR -C TEMPORARY STORAGE +C STORE ONLY COMPONENTS OF U-VECTOR IN 'C'. USE B(I,1) FOR +C TEMPORARY STORAGE C ------------------------------------------------------------------ - DO 80 I=1,NDB - B(I,1)=C(I) + DO 80 I=1,NDB + B(I,1)=C(I) 80 CONTINUE - DO 90 I=1,NDB - C(I)=0. + DO 90 I=1,NDB + C(I)=0. J=MS1(I) - IF (J.GT.0) C(I)=B(J,1) - IF (C(I).LT.0.) C(I)=0. + IF (J.GT.0) C(I)=B(J,1) + IF (C(I).LT.0.) C(I)=0. 90 CONTINUE RETURN - END \ No newline at end of file + END diff --git a/pyoptsparse/pyCONMIN/source/cnmn09.f b/pyoptsparse/pyCONMIN/source/cnmn09.f index 6e3b5e6b..11ba4bec 100644 --- a/pyoptsparse/pyCONMIN/source/cnmn09.f +++ b/pyoptsparse/pyCONMIN/source/cnmn09.f @@ -1,39 +1,39 @@ SUBROUTINE CNMN09(CNMNFUN,CNMNGRD,X,G,IC,DF,A, . N1,N2,N3,N4,N5) - + IMPLICIT DOUBLE PRECISION(A-H,O-Z) - + COMMON /CNMN1/ DELFUN,DABFUN,FDCH,FDCHM,CT, . CTMIN,CTL,CTLMIN,ALPHAX,ABOBJ1,THETA,OBJ, . NDV,NCON,NSIDE,IPRINT,NFDG,NSCAL,LINOBJ, . ITMAX,ITRM,ICNDIR,IGOTO,NAC,INFO,INFOG,ITER - + COMMON /VARABLE/ AOBJ COMMON /FEVALS/ NFUN,NGRD - + DIMENSION X(N1),G(N2),IC(N2),DF(N1),A(N1,N2) - + EXTERNAL CNMNFUN,CNMNGRD C C IF(INFO.GE.2) GO TO 10 -C +C C OBJECTIVE FUNCTION & CONSTRAINTS -C +C CALL CNMNFUN(N1,N2,X,AOBJ,G) NFUN=NFUN+1 GO TO 20 - + 10 CONTINUE C C C GRADIENT INFORMATION -C +C CALL CNMNGRD(N1,N2,X,AOBJ,G,CT,DF,A,IC,NAC) NGRD=NGRD+1 20 CONTINUE - + RETURN - END + END diff --git a/pyoptsparse/pyCONMIN/source/conmin.f b/pyoptsparse/pyCONMIN/source/conmin.f index 36d84034..3691ff0a 100644 --- a/pyoptsparse/pyCONMIN/source/conmin.f +++ b/pyoptsparse/pyCONMIN/source/conmin.f @@ -1,34 +1,34 @@ SUBROUTINE CONMIN(NDV_,NCON_,X_,VLB_,VUB_,OBJ_,G_, 1 N1,N2,N3,N4,N5,IPRINT_,IOUT_,IFILE,ITMAX_,DELFUN_, 2 DABFUN_,ITRM_,NFEASCT_,NFDG_,NFUN_,NGRD_,CNMNFUN,CNMNGRD) - + IMPLICIT DOUBLE PRECISION(A-H,O-Z) - + EXTERNAL CNMNFUN,CNMNGRD - + CHARACTER*(*) IFILE - + DIMENSION X_(NDV_),VLB_(NDV_),VUB_(NDV_),G_(NCON_) - + DIMENSION X(N1),VLB(N1),VUB(N1),SCAL(N1),S(N1),DF(N1) DIMENSION G(N2),G1(N2),G2(N2),ISC(N2) DIMENSION IC(N3),B(N3,N3) DIMENSION C(N4) DIMENSION MS1(N5) DIMENSION A(N1,N3) - + COMMON /CNMN1/ DELFUN,DABFUN,FDCH,FDCHM,CT,CTMIN,CTL,CTLMIN, - . ALPHAX,ABOBJ1,THETA,OBJ,NDV,NCON,NSIDE,IPRINT, - . NFDG,NSCAL,LINOBJ,ITMAX,ITRM,ICNDIR,IGOTO,NAC, + . ALPHAX,ABOBJ1,THETA,OBJ,NDV,NCON,NSIDE,IPRINT, + . NFDG,NSCAL,LINOBJ,ITMAX,ITRM,ICNDIR,IGOTO,NAC, . INFO,INFOG,ITER,NFEASCT - + COMMON /VARABLE/ AOBJ COMMON /OUTPUT/ IOUT COMMON /FEVALS/ NFUN,NGRD -C -C INITIALIZE -C - INFOG=0 +C +C INITIALIZE +C + INFOG=0 INFO=0 NDV=NDV_ NCON=NCON_ @@ -39,7 +39,7 @@ SUBROUTINE CONMIN(NDV_,NCON_,X_,VLB_,VUB_,OBJ_,G_, 5 CONTINUE IPRINT=IPRINT_ ITMAX=ITMAX_ - DO 6 J=1,NCON + DO 6 J=1,NCON ISC(J)=0 6 CONTINUE NFDG=NFDG_ @@ -48,25 +48,25 @@ SUBROUTINE CONMIN(NDV_,NCON_,X_,VLB_,VUB_,OBJ_,G_, NSCAL=0 NFEASCT=NFEASCT_ FDCH=0.0 - FDCHM=0.0 + FDCHM=0.0 CT=0.0 CTMIN=0.0 - CTL=0.0 + CTL=0.0 CTLMIN=0.0 - THETA=0.0 - PHI=0.0 + THETA=0.0 + PHI=0.0 DELFUN=DELFUN_ DABFUN=DABFUN_ LINOBJ=0.0 ITRM=ITRM_ ALPHAX=0.0 ABOBJ1=0.0 -C +C NFUN=0 NGRD=0 -C +C C OPEN WRITE FILE -C +C IOUT=IOUT_ IF (IPRINT.EQ.0) GO TO 10 OPEN(UNIT=IOUT,FILE=IFILE(1:LEN_TRIM(IFILE)), @@ -74,27 +74,27 @@ SUBROUTINE CONMIN(NDV_,NCON_,X_,VLB_,VUB_,OBJ_,G_, 10 CONTINUE C C MAXIMUM NUMBER OF ITERATIONS -C +C NLIM=ITMAX*(NDV+5) -C +C C NON-ITERATIVE PART OF ANALYSIS -C - IGOTO = 0 -C +C + IGOTO = 0 +C C ITERATIVE PART OF ANALYSIS -C +C DO 20 I = 1,NLIM C - LOOPCNT=I -C + LOOPCNT=I +C C CALL THE OPTIMIZATION ROUTINE CONMIN -C +C CALL CNMN00(X,VLB,VUB,G,SCAL,DF,A,S,G1,G2,B, . C,ISC,IC,MS1,N1,N2,N3,N4,N5) C C CHECK TERMINATION CRITERIA C - IF(IGOTO.EQ.0) LOOPCNT=-999 + IF(IGOTO.EQ.0) LOOPCNT=-999 C C ANALYSIS MODULE C @@ -107,7 +107,7 @@ SUBROUTINE CONMIN(NDV_,NCON_,X_,VLB_,VUB_,OBJ_,G_, C 30 CONTINUE C -C PRINT FINAL RESULTS +C PRINT FINAL RESULTS C IF (IPRINT.EQ.0) GO TO 32 WRITE(6,1650) NFUN-1 @@ -126,7 +126,7 @@ SUBROUTINE CONMIN(NDV_,NCON_,X_,VLB_,VUB_,OBJ_,G_, 36 CONTINUE NFUN_=NFUN-1 NGRD_=NGRD - + RETURN C ------------------------------------------------------------------ @@ -134,5 +134,5 @@ SUBROUTINE CONMIN(NDV_,NCON_,X_,VLB_,VUB_,OBJ_,G_, C ------------------------------------------------------------------ 1650 FORMAT(//8X,'NUMBER OF FUNC-CALLS: NFUN =',I5) 1750 FORMAT(8X,'NUMBER OF GRAD-CALLS: NGRD =',I5) - + END diff --git a/pyoptsparse/pyCONMIN/source/f2py/README b/pyoptsparse/pyCONMIN/source/f2py/README index 54e48d04..94c094bd 100644 --- a/pyoptsparse/pyCONMIN/source/f2py/README +++ b/pyoptsparse/pyCONMIN/source/f2py/README @@ -1,2 +1,2 @@ -This directory contains the f2py signature file. +This directory contains the f2py signature file. Do not edit these file unless you really know what you are doing. diff --git a/pyoptsparse/pyCONMIN/source/f2py/conmin.pyf b/pyoptsparse/pyCONMIN/source/f2py/conmin.pyf index e6a4488b..0204e0a8 100644 --- a/pyoptsparse/pyCONMIN/source/f2py/conmin.pyf +++ b/pyoptsparse/pyCONMIN/source/f2py/conmin.pyf @@ -1,8 +1,8 @@ ! -*- f90 -*- ! Note: the context of this file is case sensitive. -python module conmin__user__routines - interface conmin_user_interface +python module conmin__user__routines + interface conmin_user_interface subroutine cnmnfun(n1,n2,x,aobj,g) integer intent(in) :: n1 integer intent(in) :: n2 @@ -24,7 +24,7 @@ python module conmin__user__routines end subroutine cnmngrd end interface conmin_user_interface end python module conmin__user__routines -python module conmin ! in +python module conmin ! in interface ! in :conmin subroutine conmin(ndv_,ncon_,x_,vlb_,vub_,obj_,g_,n1,n2,n3,n4,n5,iprint_,iout_,ifile,itmax_,delfun_,dabfun_,itrm_,nfeasct_,nfdg_,nfun_,ngrd_,cnmnfun,cnmngrd) ! in :conmin:source/conmin.f use conmin__user__routines @@ -99,5 +99,5 @@ python module conmin ! in subroutine closeunit(unitnum) ! in :conmin:source/closeunit.f integer intent(in) :: unitnum end subroutine closeunit - end interface + end interface end python module conmin diff --git a/pyoptsparse/pyCONMIN/source/openunit.f b/pyoptsparse/pyCONMIN/source/openunit.f index ebd1cd38..851ad60b 100644 --- a/pyoptsparse/pyCONMIN/source/openunit.f +++ b/pyoptsparse/pyCONMIN/source/openunit.f @@ -20,9 +20,9 @@ subroutine openunit(unitnum,filename,filestatus,fileaction,ierror) C Helper routine to flush buffers to files subroutine pyflush(unitnum) - + integer unitnum - + call flush(unitnum) return diff --git a/pyoptsparse/pyIPOPT/pyIPOPT.py b/pyoptsparse/pyIPOPT/pyIPOPT.py index 1ef57239..85f91662 100644 --- a/pyoptsparse/pyIPOPT/pyIPOPT.py +++ b/pyoptsparse/pyIPOPT/pyIPOPT.py @@ -294,7 +294,7 @@ def intermediate(_, *args, **kwargs): def _set_ipopt_options(self, nlp): """ - set all of the the options in self.options in the ipopt instance nlp + Set all of the the options in self.options in the ipopt instance nlp """ # Set Options from the local options dictionary # --------------------------------------------- diff --git a/pyoptsparse/pyNLPQLP/LICENSE b/pyoptsparse/pyNLPQLP/LICENSE index f206107f..3f4faea5 100644 --- a/pyoptsparse/pyNLPQLP/LICENSE +++ b/pyoptsparse/pyNLPQLP/LICENSE @@ -2,6 +2,6 @@ NLPQL - Non-Linear Programming by Quadratic Lagrangian Copyright (c) 1991, Klaus Schittkowski (Klaus.Schittkowski@uni-bayreuth.de) Patch for pyOpt - 2010, Ruben E. Perez (Ruben.Perez@rmc.ca) -NLPQL is a licensed software, to obtain the program sources and -for term and conditions of use please refer to the specific +NLPQL is a licensed software, to obtain the program sources and +for term and conditions of use please refer to the specific commercial or academic agreement made with Professor Schittkowski. diff --git a/pyoptsparse/pyNLPQLP/source/README b/pyoptsparse/pyNLPQLP/source/README index 07cac09f..452f7fc8 100644 --- a/pyoptsparse/pyNLPQLP/source/README +++ b/pyoptsparse/pyNLPQLP/source/README @@ -1,3 +1,3 @@ This directory contains the Fortran 77 source for NLPQLP. To use, copy the NLPQLP.FOR and QL.FOR source code here and rename the files to -NLPQLP.F and QL.F and pyOptSparse will take care of compiling it. \ No newline at end of file +NLPQLP.F and QL.F and pyOptSparse will take care of compiling it. diff --git a/pyoptsparse/pyNLPQLP/source/f2py/nlpqlp.pyf b/pyoptsparse/pyNLPQLP/source/f2py/nlpqlp.pyf index f056a014..51938c40 100644 --- a/pyoptsparse/pyNLPQLP/source/f2py/nlpqlp.pyf +++ b/pyoptsparse/pyNLPQLP/source/f2py/nlpqlp.pyf @@ -31,7 +31,7 @@ python module nlpqlp__user__routines end subroutine nlgrad end interface nlpqlp_user_interface end python module nlpqlp__user__routiness -python module nlpqlp ! in +python module nlpqlp ! in interface ! in :nlpqlp subroutine wrapper(np, m, me, mmax, n, nmax, mnn2, x, f, g, df, dg, u, xl, xu, & c, d, acc, accqp, stpmin, maxfun, maxit, maxnm, rho, mode, iprint, iout, & diff --git a/pyoptsparse/pyNLPQLP/source/wrapper.F90 b/pyoptsparse/pyNLPQLP/source/wrapper.F90 index 53ce2119..5ad17c3c 100644 --- a/pyoptsparse/pyNLPQLP/source/wrapper.F90 +++ b/pyoptsparse/pyNLPQLP/source/wrapper.F90 @@ -33,12 +33,12 @@ subroutine wrapper(np, m, me, mmax, n, nmax, mnn2, x, f, g, df, dg, u, xl, xu, & external ql ! The structure of this routine is based on NLP_DEMOA.f90. It really - ! pains me to use goto statements, but they kind of make sense here. + ! pains me to use goto statements, but they kind of make sense here. ifail = 0 - lwa = 23*N+4*M+3*MMAX+NP*(N+M+1)+150 + 3*NMAX*NMAX/2+10*NMAX+MMAX+M+1 + lwa = 23*N+4*M+3*MMAX+NP*(N+M+1)+150 + 3*NMAX*NMAX/2+10*NMAX+MMAX+M+1 lkwa = n + 30 - lactiv = 2*m + 10 + lactiv = 2*m + 10 ! Allocate some workspace allocate (wa(lwa), kwa(lkwa), active(lactiv)) @@ -51,29 +51,29 @@ subroutine wrapper(np, m, me, mmax, n, nmax, mnn2, x, f, g, df, dg, u, xl, xu, & call nlfunc(m, me, mmax, n, f, g, x, active, fail) call flush(iout) - if (fail) then + if (fail) then ! NLPQLP says to set ifail to -10 and it will back-off on the ! step and try again ifail = -10 print *, "+===========================================+" - print *, "| Failed user supplied function in NLPQLP |" + print *, "| Failed user supplied function in NLPQLP |" print *, "+===========================================+" end if ! Now go back to NLPQLP IF this ISN'T the first pass when ifail == 0 if (ifail == -1 .or. ifail == -10) goto 4 - + ! ------------ Call the user supplied gradient ---------------- 2 continue call nlgrad(m, me, mmax, n, f, g, df, dg, x, active, wa) call flush(iout) ! Now go back to NLPQLP if (ifail == -2) goto 4 - + ! -------------------------------------------------------------- 4 continue - ! The actual NLPQLP run command. + ! The actual NLPQLP run command. call nlpqlp (np, m, me, mmax, n, nmax, mnn2, x, f, g, & df, dg, u, xl, xu, c, d, acc, accqp, stpmin, maxfun, maxit, & maxnm, rho, iprint, mode, iout, ifail, wa, lwa, kwa, lkwa, & diff --git a/pyoptsparse/pyNSGA2/LICENSE b/pyoptsparse/pyNSGA2/LICENSE index c006b447..a1a9dacc 100644 --- a/pyoptsparse/pyNSGA2/LICENSE +++ b/pyoptsparse/pyNSGA2/LICENSE @@ -5,11 +5,11 @@ Modified for pyOpt - 2008, Ruben E. Perez (Ruben.Perez@rmc.ca) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -copies of the Software, and to permit persons to whom the Software +without limitation the rights to use, copy, modify, merge, publish, +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -Distribution, sublicense, and/or sell of this code for any commercial +Distribution, sublicense, and/or sell of this code for any commercial purpose is permissible ONLY BY DIRECT ARRANGEMENT WITH THE COPYRIGHT OWNER. The above copyright notice and this permission notice shall be included diff --git a/pyoptsparse/pyNSGA2/source/README b/pyoptsparse/pyNSGA2/source/README index f28d26bc..713a524a 100644 --- a/pyoptsparse/pyNSGA2/source/README +++ b/pyoptsparse/pyNSGA2/source/README @@ -1,4 +1,4 @@ -This directory contains the C source for -NSGA2, the main routine of the original -program has been modified to enable Python +This directory contains the C source for +NSGA2, the main routine of the original +program has been modified to enable Python interfacing by Dr. Ruben E. Perez. diff --git a/pyoptsparse/pyNSGA2/source/nsga2.c b/pyoptsparse/pyNSGA2/source/nsga2.c index cf886e6a..9711cba5 100644 --- a/pyoptsparse/pyNSGA2/source/nsga2.c +++ b/pyoptsparse/pyNSGA2/source/nsga2.c @@ -1,19 +1,19 @@ /* ------------------------------------------------------------------------------- * * NSGA-II (Non-dominated Sorting Genetic Algorithm - II) - * + * * current version only works with continous design variables treated as reals - * no provisions for binary specification or integer/discrete variable handling - * + * no provisions for binary specification or integer/discrete variable handling + * * nvar - number of variables * ncon - number of constraints * nobj - number of objectives - * f - - * x - - * g - - * nfeval - - * xl - - * xu - + * f - + * x - + * g - + * nfeval - + * xl - + * xu - * popsize - population size (a multiple of 4) * ngen - number of generations * pcross_real - probability of crossover of real variable (0.6-1.0) @@ -26,76 +26,76 @@ * * * Output files - * + * * - initial_pop.out: contains initial population data * - final_pop.out: contains final population data * - all_pop.out: containts generation population data * - best_pop.out: contains best solutions * - params.out: contains input parameters information * - .out: contains runtime information - * - * ---------------------------------------------------------------------------- - * + * + * ---------------------------------------------------------------------------- + * * References: * ----------- - * - * - Deb K., Agrawal S., Pratap A., and Meyarivan T., A Fast and Elitist - * multi-objective Genetic Algorithm: NSGA-II, IEEE Transactions on + * + * - Deb K., Agrawal S., Pratap A., and Meyarivan T., A Fast and Elitist + * multi-objective Genetic Algorithm: NSGA-II, IEEE Transactions on * Evolutionary Computation (IEEE-TEC), 2002, Vol. 6, No. 2, pp 182-197 - * - * ---------------------------------------------------------------------------- - * + * + * ---------------------------------------------------------------------------- + * * Usage: * ------ - * - * - * ---------------------------------------------------------------------------- - * + * + * + * ---------------------------------------------------------------------------- + * * Copyrights: * ----------- - * + * * - Original NSGA-II implementation: (C) Dr. Kalyanmoy Deb 2005 - * - Randon Number Generator: (C) Dr. David E. Goldberg 1986 - * - * ----------------------------------------------------------------------------*/ + * - Randon Number Generator: (C) Dr. David E. Goldberg 1986 + * + * ----------------------------------------------------------------------------*/ /* ------------------------------------------------------------------------------- - * includefiles + * includefiles * ---------------------------------------------------------------------------- */ # include "nsga2.h" /* ------------------------------------------------------------------------------- - * NSGA2 + * NSGA2 * ---------------------------------------------------------------------------- */ int nsga2(int nvar, int ncon, int nobj, double f[], double x[], double g[], - int nfeval, double xl[], double xu[], int popsize, int ngen, - double pcross_real, double pmut_real, double eta_c, double eta_m, + int nfeval, double xl[], double xu[], int popsize, int ngen, + double pcross_real, double pmut_real, double eta_c, double eta_m, double pcross_bin, double pmut_bin, int printout, double seed, int xinit) { /* declaration of local variables and structures */ int i, j; - int nreal, nbin, *nbits, bitlength; + int nreal, nbin, *nbits, bitlength; double *min_realvar, *max_realvar; double *min_binvar, *max_binvar; int *nbinmut, *nrealmut, *nbincross, *nrealcross; - + Global global; - + population *parent_pop; population *child_pop; population *mixed_pop; - + // "random" numbers seed - if (seed==0) - { + if (seed==0) + { // use of clock to generate "random" seed time_t seconds; seconds=time(NULL); seed=seconds; } - + // Files FILE *fpt1; FILE *fpt2; @@ -124,14 +124,14 @@ int nsga2(int nvar, int ncon, int nobj, double f[], double x[], double g[], fprintf(fpt5,"# This file contains information about inputs as read by the program\n"); fprintf(fpt6,"# This file contains runtime information\n"); } - + // Input Handling nreal = nvar; // number of real variables nbin = 0; // number of binary variables - + min_realvar = (double *)malloc(nreal*sizeof(double)); max_realvar = (double *)malloc(nreal*sizeof(double)); - + j = 0; for (i=0; i= 1) { @@ -190,7 +190,7 @@ int nsga2(int nvar, int ncon, int nobj, double f[], double x[], double g[], fprintf(fpt5,"\n Probability of mutation of binary variable = %e",pmut_bin); } fprintf(fpt5,"\n Seed for random number generator = %e",seed); - + fprintf(fpt1,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength); fprintf(fpt2,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength); fprintf(fpt3,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength); @@ -199,8 +199,8 @@ int nsga2(int nvar, int ncon, int nobj, double f[], double x[], double g[], fprintf(fpt4,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength); } } - - // + + // global.nreal = nreal; global.nbin = nbin; global.nobj = nobj; @@ -218,8 +218,8 @@ int nsga2(int nvar, int ncon, int nobj, double f[], double x[], double g[], global.max_realvar = max_realvar; global.min_binvar = min_binvar; global.max_binvar = max_binvar; - global.bitlength = bitlength; - + global.bitlength = bitlength; + // nbinmut = 0; nrealmut = 0; @@ -233,8 +233,8 @@ int nsga2(int nvar, int ncon, int nobj, double f[], double x[], double g[], allocate_memory_pop (mixed_pop, 2*popsize, global); randomize(); initialize_pop (parent_pop, global); - - // + + // if (xinit!=0) { i=0; @@ -243,7 +243,7 @@ int nsga2(int nvar, int ncon, int nobj, double f[], double x[], double g[], parent_pop->ind[i].xreal[j] = x[j]; } } - + // First Generation if (printout >= 1) { @@ -260,9 +260,9 @@ int nsga2(int nvar, int ncon, int nobj, double f[], double x[], double g[], fprintf(fpt4,"# gen = 1\n"); report_pop(parent_pop,fpt4, global); } - + fprintf(fpt6,"\n gen = 1"); - + fflush(fpt1); fflush(fpt2); fflush(fpt3); @@ -274,7 +274,7 @@ int nsga2(int nvar, int ncon, int nobj, double f[], double x[], double g[], fflush(fpt6); } fflush(stdout); - + // Iterate Generations for (i=2; i<=ngen; i++) { @@ -284,7 +284,7 @@ int nsga2(int nvar, int ncon, int nobj, double f[], double x[], double g[], evaluate_pop(child_pop, global); merge (parent_pop, child_pop, mixed_pop, global); fill_nondominated_sort (mixed_pop, parent_pop, global); - + /* Comment following three lines if information for all generations is not desired, it will speed up the execution */ if (printout >= 1) @@ -299,14 +299,14 @@ int nsga2(int nvar, int ncon, int nobj, double f[], double x[], double g[], fflush(fpt6); } } - + // Output if (printout >= 1) { fprintf(fpt6,"\n Generations finished"); report_pop(parent_pop,fpt2, global); report_feasible(parent_pop,fpt3, global); - + if (nreal!=0) { fprintf(fpt5,"\n Number of crossover of real variable = %i",nrealcross); @@ -335,10 +335,10 @@ int nsga2(int nvar, int ncon, int nobj, double f[], double x[], double g[], fclose(fpt4); } fclose(fpt5); - + } - - // + + // for (i=0; iind[i].constr_violation == 0.0 && parent_pop->ind[i].rank==1) @@ -364,8 +364,8 @@ int nsga2(int nvar, int ncon, int nobj, double f[], double x[], double g[], break; } } - - // + + // if (nreal!=0) { free (min_realvar); @@ -383,14 +383,14 @@ int nsga2(int nvar, int ncon, int nobj, double f[], double x[], double g[], free (parent_pop); free (child_pop); free (mixed_pop); - - // + + // if (printout >= 1) { fprintf(fpt6,"\n Routine successfully exited \n"); fflush(fpt6); fclose(fpt6); } - + return (0); } diff --git a/pyoptsparse/pyNSGA2/source/nsga2.h b/pyoptsparse/pyNSGA2/source/nsga2.h index 051382fa..3e641237 100644 --- a/pyoptsparse/pyNSGA2/source/nsga2.h +++ b/pyoptsparse/pyNSGA2/source/nsga2.h @@ -1,8 +1,8 @@ /* ------------------------------------------------------------------------------- * * Header File for nsga2.c - * - * ---------------------------------------------------------------------------- */ + * + * ---------------------------------------------------------------------------- */ # ifndef _GLOBAL_H_ # define _GLOBAL_H_ @@ -75,7 +75,7 @@ typedef struct double *max_realvar; double *min_binvar; double *max_binvar; - int bitlength; + int bitlength; } Global; diff --git a/pyoptsparse/pyNSGA2/source/swig/README b/pyoptsparse/pyNSGA2/source/swig/README index 21e9839d..c617fd69 100644 --- a/pyoptsparse/pyNSGA2/source/swig/README +++ b/pyoptsparse/pyNSGA2/source/swig/README @@ -1,2 +1,2 @@ -This directory contains the swig signature file. +This directory contains the swig signature file. Do not edit these file unless you really know what you are doing. diff --git a/pyoptsparse/pyNSGA2/source/swig/nsga2.i b/pyoptsparse/pyNSGA2/source/swig/nsga2.i index e4bf0a6f..c30f1e7b 100644 --- a/pyoptsparse/pyNSGA2/source/swig/nsga2.i +++ b/pyoptsparse/pyNSGA2/source/swig/nsga2.i @@ -44,7 +44,7 @@ void set_pyfunc(PyObject *pyfunc); static PyObject *py_fobjcon = NULL; /* Initialize Python callback function pointer */ -void set_pyfunc(PyObject *pyfunc) +void set_pyfunc(PyObject *pyfunc) { Py_XDECREF(py_fobjcon); Py_XINCREF(pyfunc); @@ -55,40 +55,40 @@ void set_pyfunc(PyObject *pyfunc) /* C <-> Python callback */ void nsga2func (int nreal, int nbin, int nobj, int ncon, double *xreal, double *xbin, int **gene, double *obj, double *constr) { - + int i, j, k; double getval; PyObject *arglist, *result, *xx, *ff, *gg; - + arglist = PyTuple_New(6); - + PyTuple_SetItem(arglist,0,PyLong_FromLong(nreal)); - + PyTuple_SetItem(arglist,1,PyLong_FromLong(nobj)); - + PyTuple_SetItem(arglist,2,PyLong_FromLong(ncon)); - + xx = PyList_New(nreal); for (i=0;i Tuple[ndarray, ndarray, bool]: - """internal method to call function and extract obj, con""" + """Internal method to call function and extract obj, con""" xCall = self.optProb.processXtoDict(x) # Call objective diff --git a/pyoptsparse/pyOpt_history.py b/pyoptsparse/pyOpt_history.py index b90d1080..8ae163c5 100644 --- a/pyoptsparse/pyOpt_history.py +++ b/pyoptsparse/pyOpt_history.py @@ -539,7 +539,7 @@ def getValues(self, names=None, callCounters=None, major=True, scale=False, stac -------- First we can request DV history over all major iterations: - >>> hist.getValues(names='xvars', major=True) + >>> hist.getValues(names="xvars", major=True) {'xvars': array([[-2.00000000e+00, 1.00000000e+00], [-1.00000000e+00, 9.00000000e-01], [-5.00305827e-17, 4.21052632e-01], @@ -551,7 +551,7 @@ def getValues(self, names=None, callCounters=None, major=True, scale=False, stac Next we can look at DV and optimality for the first and last iteration only: - >>> hist.getValues(names=['xvars','optimality'],callCounters=[0,'last']) + >>> hist.getValues(names=["xvars", "optimality"], callCounters=[0, "last"]) {'optimality': array([1.27895528, 0. ]), 'xvars': array([[-2. , 1. ], [ 0.5, 2. ]])} diff --git a/pyoptsparse/pyOpt_optimization.py b/pyoptsparse/pyOpt_optimization.py index f9d83dbc..64fa6143 100644 --- a/pyoptsparse/pyOpt_optimization.py +++ b/pyoptsparse/pyOpt_optimization.py @@ -211,9 +211,9 @@ def addVarGroup( Examples -------- >>> # Add a single design variable 'alpha' - >>> optProb.addVar('alpha', varType='c', value=2.0, lower=0.0, upper=10.0, scale=0.1) + >>> optProb.addVar("alpha", varType="c", value=2.0, lower=0.0, upper=10.0, scale=0.1) >>> # Add 10 unscaled variables of 0.5 between 0 and 1 with name 'y' - >>> optProb.addVarGroup('y', varType='c', value=0.5, lower=0.0, upper=1.0, scale=1.0) + >>> optProb.addVarGroup("y", varType="c", value=0.5, lower=0.0, upper=1.0, scale=1.0) Notes ----- diff --git a/pyoptsparse/pyOpt_optimizer.py b/pyoptsparse/pyOpt_optimizer.py index 0bb22015..202d44b5 100644 --- a/pyoptsparse/pyOpt_optimizer.py +++ b/pyoptsparse/pyOpt_optimizer.py @@ -639,7 +639,8 @@ def _masterFunc2(self, x, evaluate, writeHist=True): def _internalEval(self, x): """ Special internal evaluation for optimizers that have a - separate callback for each constraint""" + separate callback for each constraint + """ fobj, fcon, gobj, gcon, fail = self._masterFunc(x, ["fobj", "fcon", "gobj", "gcon"]) @@ -694,7 +695,8 @@ def _convertJacobian(self, gcon_csr_in): def _waitLoop(self): """Non-root processors go into this waiting loop while the - root proc does all the work in the optimization algorithm""" + root proc does all the work in the optimization algorithm + """ mode = None info = None diff --git a/pyoptsparse/pyOpt_utils.py b/pyoptsparse/pyOpt_utils.py index e3572a03..ed1f8bc8 100644 --- a/pyoptsparse/pyOpt_utils.py +++ b/pyoptsparse/pyOpt_utils.py @@ -4,9 +4,9 @@ a constant sparsity structure as required by the optimizers. We use a very simple dictionary format to represent the three most common forms of sparse matrices:: - mat = {'coo':[row, col, data], 'shape':[nrow, ncols]} # A coo matrix - mat = {'csr':[rowp, colind, data], 'shape':[nrow, ncols]} # A csr matrix - mat = {'csc':[colp, rowind, data], 'shape':[nrow, ncols]} # A csc matrix + mat = {"coo": [row, col, data], "shape": [nrow, ncols]} # A coo matrix + mat = {"csr": [rowp, colind, data], "shape": [nrow, ncols]} # A csr matrix + mat = {"csc": [colp, rowind, data], "shape": [nrow, ncols]} # A csc matrix """ # Standard Python modules diff --git a/pyoptsparse/pyPSQP/LICENSE b/pyoptsparse/pyPSQP/LICENSE index 1a0e242b..31cb21e5 100644 --- a/pyoptsparse/pyPSQP/LICENSE +++ b/pyoptsparse/pyPSQP/LICENSE @@ -3,8 +3,8 @@ Copyright (c) 2007, Ladislav Luksan (luksan@uivt.cas.cz) Modified for pyOpt - 2010, Ruben E. Perez (Ruben.Perez@rmc.ca) This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation, either version 3 of +it under the terms of the GNU Lesser General Public License as +published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -12,8 +12,8 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -You should have received a copy of the GNU Lesser General -Public License along with this program. If not, see +You should have received a copy of the GNU Lesser General +Public License along with this program. If not, see . ---------------------------------------------------------------------- diff --git a/pyoptsparse/pyPSQP/source/README b/pyoptsparse/pyPSQP/source/README index cb8e09e6..7a82c1f5 100644 --- a/pyoptsparse/pyPSQP/source/README +++ b/pyoptsparse/pyPSQP/source/README @@ -1,4 +1,4 @@ This directory contains the Fortran 77 source for -PSQP, plus a pyOpt interfacing file called psqpw.f, +PSQP, plus a pyOpt interfacing file called psqpw.f, and two helper files called openunit.f and closeunit.f to manipulate Fortran units from Python. diff --git a/pyoptsparse/pyPSQP/source/f2py/README b/pyoptsparse/pyPSQP/source/f2py/README index 54e48d04..94c094bd 100644 --- a/pyoptsparse/pyPSQP/source/f2py/README +++ b/pyoptsparse/pyPSQP/source/f2py/README @@ -1,2 +1,2 @@ -This directory contains the f2py signature file. +This directory contains the f2py signature file. Do not edit these file unless you really know what you are doing. diff --git a/pyoptsparse/pyPSQP/source/f2py/psqp.pyf b/pyoptsparse/pyPSQP/source/f2py/psqp.pyf index b1ab0b54..51da4b1e 100644 --- a/pyoptsparse/pyPSQP/source/f2py/psqp.pyf +++ b/pyoptsparse/pyPSQP/source/f2py/psqp.pyf @@ -35,7 +35,7 @@ python module psqp__user__routines end subroutine dcon end interface psqp_user_interface end python module psqp__user__routines -python module psqp ! in +python module psqp ! in interface ! in :psqp subroutine psqp_wrap(nf,nc,x,ix,xl,xu,cf,ic,cl,cu,mit,mfv,met,mec,xmax,tolx,tolc,tolg,rpf,f,gmax,cmax,iprnt,iout,ifile,iterm) ! in :psqp:source/psqp_wrap.f use psqp__user__routines diff --git a/pyoptsparse/pyPSQP/source/openunit.f b/pyoptsparse/pyPSQP/source/openunit.f index e67f8966..b0d9c138 100644 --- a/pyoptsparse/pyPSQP/source/openunit.f +++ b/pyoptsparse/pyPSQP/source/openunit.f @@ -11,7 +11,7 @@ subroutine openunit(unitnum,filename,filestatus,fileaction,ierror) Cf2py intent(in) fileaction integer ierror Cf2py intent(out) ierror - + open(unit=unitnum,file=filename,status=filestatus, > access=fileaction,iostat=ierror) @@ -20,9 +20,9 @@ subroutine openunit(unitnum,filename,filestatus,fileaction,ierror) C Helper routine to flush buffers to files subroutine pyflush(unitnum) - + integer unitnum - + call flush(unitnum) return diff --git a/pyoptsparse/pyPSQP/source/psqp_wrap.f90 b/pyoptsparse/pyPSQP/source/psqp_wrap.f90 index b42eb456..a4b4deb3 100644 --- a/pyoptsparse/pyPSQP/source/psqp_wrap.f90 +++ b/pyoptsparse/pyPSQP/source/psqp_wrap.f90 @@ -89,7 +89,7 @@ ! FUNCTION, X(NF) IS A VECTOR OF VARIABLES AND GC(NF) IS THE ! GRADIENT OF THE CONSTRAINT FUNCTION. ! -SUBROUTINE PSQP_WRAP(NF,NC,X,IX,XL,XU,CF,IC,CL,CU, & +SUBROUTINE PSQP_WRAP(NF,NC,X,IX,XL,XU,CF,IC,CL,CU, & MIT,MFV,MET,MEC,XMAX,TOLX,TOLC,TOLG,RPF, & F,GMAX,CMAX,IPRNT,IOUT,IFILE,ITERM) ! @@ -127,13 +127,13 @@ SUBROUTINE PSQP_WRAP(NF,NC,X,IX,XL,XU,CF,IC,CL,CU, & LIA = 1 ! ! OPEN WRITE FILE - ! + ! IF (IPRNT.NE.0) THEN OPEN(UNIT=IOUT,FILE=IFILE,STATUS='UNKNOWN') END IF - ! + ! ! CALL PSQP - ! + ! NB = 1 CALL PSQP(NF,NB,NC,X,IX,XL,XU,CF,IC,CL,CU,RA,RA(LCFO),RA(LCFD),& RA(LGC),IA,RA(LCR),RA(LCZ),RA(LCP),RA(LGF),RA(LG),& diff --git a/pyoptsparse/pyParOpt/meson.build b/pyoptsparse/pyParOpt/meson.build index 0bc4f8e6..4500d203 100644 --- a/pyoptsparse/pyParOpt/meson.build +++ b/pyoptsparse/pyParOpt/meson.build @@ -7,4 +7,4 @@ py3_target.install_sources( python_sources, pure: true, subdir: 'pyoptsparse/pyParOpt' -) \ No newline at end of file +) diff --git a/pyoptsparse/pySLSQP/source/README b/pyoptsparse/pySLSQP/source/README index 9b85b0b9..0a749cfa 100644 --- a/pyoptsparse/pySLSQP/source/README +++ b/pyoptsparse/pySLSQP/source/README @@ -1,3 +1,3 @@ -This directory contains the Fortran 77 source for +This directory contains the Fortran 77 source for SLSQP, plus two helper files called openunit.f and closeunit.f to manipulate Fortran units from Python. diff --git a/pyoptsparse/pySLSQP/source/daxpy.f b/pyoptsparse/pySLSQP/source/daxpy.f index e21693c0..96875010 100644 --- a/pyoptsparse/pySLSQP/source/daxpy.f +++ b/pyoptsparse/pySLSQP/source/daxpy.f @@ -44,4 +44,3 @@ SUBROUTINE DAXPY(N,DA,DX,INCX,DY,INCY) 50 CONTINUE RETURN END - \ No newline at end of file diff --git a/pyoptsparse/pySLSQP/source/dcopy.f b/pyoptsparse/pySLSQP/source/dcopy.f index b9aa02b6..71b7b13b 100644 --- a/pyoptsparse/pySLSQP/source/dcopy.f +++ b/pyoptsparse/pySLSQP/source/dcopy.f @@ -251,4 +251,3 @@ DOUBLE PRECISION FUNCTION DNRM2 ( N, DX, INCX) 300 CONTINUE RETURN END - \ No newline at end of file diff --git a/pyoptsparse/pySLSQP/source/drot.f b/pyoptsparse/pySLSQP/source/drot.f index 77df1e46..a2285f4f 100644 --- a/pyoptsparse/pySLSQP/source/drot.f +++ b/pyoptsparse/pySLSQP/source/drot.f @@ -34,4 +34,3 @@ SUBROUTINE DROT (N,DX,INCX,DY,INCY,C,S) 30 CONTINUE RETURN END - \ No newline at end of file diff --git a/pyoptsparse/pySLSQP/source/drotg.f b/pyoptsparse/pySLSQP/source/drotg.f index 30fa7c1b..4b80a37e 100644 --- a/pyoptsparse/pySLSQP/source/drotg.f +++ b/pyoptsparse/pySLSQP/source/drotg.f @@ -25,4 +25,3 @@ SUBROUTINE DROTG(DA,DB,C,S) DB = Z RETURN END - \ No newline at end of file diff --git a/pyoptsparse/pySLSQP/source/dscal.f b/pyoptsparse/pySLSQP/source/dscal.f index 2e7811cf..777fd7ed 100644 --- a/pyoptsparse/pySLSQP/source/dscal.f +++ b/pyoptsparse/pySLSQP/source/dscal.f @@ -38,4 +38,3 @@ SUBROUTINE DSCAL(N,DA,DX,INCX) 50 CONTINUE RETURN END - \ No newline at end of file diff --git a/pyoptsparse/pySLSQP/source/f2py/README b/pyoptsparse/pySLSQP/source/f2py/README index 54e48d04..94c094bd 100644 --- a/pyoptsparse/pySLSQP/source/f2py/README +++ b/pyoptsparse/pySLSQP/source/f2py/README @@ -1,2 +1,2 @@ -This directory contains the f2py signature file. +This directory contains the f2py signature file. Do not edit these file unless you really know what you are doing. diff --git a/pyoptsparse/pySLSQP/source/f2py/slsqp.pyf b/pyoptsparse/pySLSQP/source/f2py/slsqp.pyf index 14edad20..4fe3fa96 100644 --- a/pyoptsparse/pySLSQP/source/f2py/slsqp.pyf +++ b/pyoptsparse/pySLSQP/source/f2py/slsqp.pyf @@ -1,8 +1,8 @@ ! -*- f90 -*- ! Note: the context of this file is case sensitive. -python module slsqp__user__routines - interface slsqp_user_interface +python module slsqp__user__routines + interface slsqp_user_interface subroutine slfunc(m,meq,la,n,f,c,x) integer intent(in) :: m integer intent(in) :: meq @@ -25,7 +25,7 @@ python module slsqp__user__routines end subroutine slgrad end interface slsqp_user_interface end python module slsqp__user__routines -python module slsqp ! in +python module slsqp ! in interface ! in :slsqp subroutine slsqp(m,meq,la,n,x,xl,xu,f,c,g,a,acc,iter,iprint,iout,ifile,mode,w,l_w,jw,l_jw,nfunc,ngrad,slfunc,slgrad) ! in :slsqp:source/slsqp.f use slsqp__user__routines @@ -68,5 +68,5 @@ python module slsqp ! in subroutine closeunit(unitnum) ! in :slsqp:source/closeunit.f integer intent(in) :: unitnum end subroutine closeunit - end interface + end interface end python module slsqp diff --git a/pyoptsparse/pySLSQP/source/h12.f b/pyoptsparse/pySLSQP/source/h12.f index 7ed74def..91c4b024 100644 --- a/pyoptsparse/pySLSQP/source/h12.f +++ b/pyoptsparse/pySLSQP/source/h12.f @@ -78,4 +78,3 @@ SUBROUTINE H12 (MODE,LPIVOT,L1,M,U,IUE,UP,C,ICE,ICV,NCV) 60 I4=I4+ICE 70 CONTINUE 80 END - \ No newline at end of file diff --git a/pyoptsparse/pySLSQP/source/hfti.f b/pyoptsparse/pySLSQP/source/hfti.f index b677c620..08f9257b 100644 --- a/pyoptsparse/pySLSQP/source/hfti.f +++ b/pyoptsparse/pySLSQP/source/hfti.f @@ -125,4 +125,3 @@ SUBROUTINE HFTI(A,MDA,M,N,B,MDB,NB,TAU,KRANK,RNORM,H,G,IP) 250 CONTINUE 270 KRANK=K END - \ No newline at end of file diff --git a/pyoptsparse/pySLSQP/source/ldl.f b/pyoptsparse/pySLSQP/source/ldl.f index 5ad16dff..f5806dac 100644 --- a/pyoptsparse/pySLSQP/source/ldl.f +++ b/pyoptsparse/pySLSQP/source/ldl.f @@ -250,4 +250,3 @@ DOUBLE PRECISION FUNCTION LINMIN (MODE, AX, BX, F, TOL) C END OF LINMIN END - \ No newline at end of file diff --git a/pyoptsparse/pySLSQP/source/ldp.f b/pyoptsparse/pySLSQP/source/ldp.f index c1b9a836..c8004235 100644 --- a/pyoptsparse/pySLSQP/source/ldp.f +++ b/pyoptsparse/pySLSQP/source/ldp.f @@ -95,4 +95,3 @@ SUBROUTINE LDP(G,MG,M,N,H,X,XNORM,W,INDEX,MODE) C END OF SUBROUTINE LDP 50 END - \ No newline at end of file diff --git a/pyoptsparse/pySLSQP/source/lsei.f b/pyoptsparse/pySLSQP/source/lsei.f index 1b1788ee..0ff92503 100644 --- a/pyoptsparse/pySLSQP/source/lsei.f +++ b/pyoptsparse/pySLSQP/source/lsei.f @@ -129,4 +129,3 @@ SUBROUTINE LSEI(C,D,E,F,G,H,LC,MC,LE,ME,LG,MG,N,X,XNRM,W,JW,MODE) C END OF SUBROUTINE LSEI 75 END - \ No newline at end of file diff --git a/pyoptsparse/pySLSQP/source/lsi.f b/pyoptsparse/pySLSQP/source/lsi.f index f668f568..87803bb5 100644 --- a/pyoptsparse/pySLSQP/source/lsi.f +++ b/pyoptsparse/pySLSQP/source/lsi.f @@ -75,4 +75,3 @@ SUBROUTINE LSI(E,F,G,H,LE,ME,LG,MG,N,X,XNORM,W,JW,MODE) C END OF SUBROUTINE LSI 50 END - \ No newline at end of file diff --git a/pyoptsparse/pySLSQP/source/lsq.f b/pyoptsparse/pySLSQP/source/lsq.f index 0ac509c2..21390bcf 100644 --- a/pyoptsparse/pySLSQP/source/lsq.f +++ b/pyoptsparse/pySLSQP/source/lsq.f @@ -193,4 +193,4 @@ subroutine bound(n, x, xl, xu) x(i) = xu(i) end if end do - end subroutine bound \ No newline at end of file + end subroutine bound diff --git a/pyoptsparse/pySLSQP/source/nnls.f b/pyoptsparse/pySLSQP/source/nnls.f index 3b9aed2a..a38c70c6 100644 --- a/pyoptsparse/pySLSQP/source/nnls.f +++ b/pyoptsparse/pySLSQP/source/nnls.f @@ -192,4 +192,3 @@ SUBROUTINE NNLS (A, MDA, M, N, B, X, RNORM, W, Z, INDEX, MODE) C END OF SUBROUTINE NNLS 290 END - \ No newline at end of file diff --git a/pyoptsparse/pySLSQP/source/openunit.f b/pyoptsparse/pySLSQP/source/openunit.f index e67f8966..b0d9c138 100644 --- a/pyoptsparse/pySLSQP/source/openunit.f +++ b/pyoptsparse/pySLSQP/source/openunit.f @@ -11,7 +11,7 @@ subroutine openunit(unitnum,filename,filestatus,fileaction,ierror) Cf2py intent(in) fileaction integer ierror Cf2py intent(out) ierror - + open(unit=unitnum,file=filename,status=filestatus, > access=fileaction,iostat=ierror) @@ -20,9 +20,9 @@ subroutine openunit(unitnum,filename,filestatus,fileaction,ierror) C Helper routine to flush buffers to files subroutine pyflush(unitnum) - + integer unitnum - + call flush(unitnum) return diff --git a/pyoptsparse/pySLSQP/source/slsqp.f b/pyoptsparse/pySLSQP/source/slsqp.f index ba4c4b72..d4d6885f 100644 --- a/pyoptsparse/pySLSQP/source/slsqp.f +++ b/pyoptsparse/pySLSQP/source/slsqp.f @@ -319,4 +319,3 @@ SUBROUTINE SLSQP (M,MEQ,LA,N,X,XL,XU,F,C,G,A,ACC,ITER, 1460 FORMAT(8X,30HNUMBER OF GRAD-CALLS: NGRAD =,I4) C END - diff --git a/pyoptsparse/pySLSQP/source/slsqpb.f b/pyoptsparse/pySLSQP/source/slsqpb.f index 70c7e736..3736c564 100644 --- a/pyoptsparse/pySLSQP/source/slsqpb.f +++ b/pyoptsparse/pySLSQP/source/slsqpb.f @@ -1,7 +1,7 @@ SUBROUTINE SLSQPB (M, MEQ, LA, N, X, XL, XU, F, C, G, A, ACC, * ITER, MODE, R, L, X0, MU, S, U, V, W, IW, * ALPHA, F0, GS, H1, H2, H3, H4, T, T0, TOL, - * IEXACT, INCONS, IRESET, ITERMX, LINE, N1, + * IEXACT, INCONS, IRESET, ITERMX, LINE, N1, * N2, N3) C NONLINEAR PROGRAMMING BY SOLVING SEQUENTIALLY QUADRATIC PROGRAMS @@ -289,4 +289,3 @@ SUBROUTINE SLSQPB (M, MEQ, LA, N, X, XL, XU, F, C, G, A, ACC, C END OF SLSQPB 330 END - \ No newline at end of file diff --git a/pyoptsparse/pySNOPT/LICENSE b/pyoptsparse/pySNOPT/LICENSE index ec47e53c..fceea9bc 100644 --- a/pyoptsparse/pySNOPT/LICENSE +++ b/pyoptsparse/pySNOPT/LICENSE @@ -3,6 +3,6 @@ Copyright (c) 2008, Philip Gill (pgill@ucsd.edu), Walter Murray (walter@leland.stanford.edu), and Michael Saunders (saunders@stanford.edu) -SNOPT is a licensed software, to obtain the program sources and for -term and conditions of use please refer to the specific commercial +SNOPT is a licensed software, to obtain the program sources and for +term and conditions of use please refer to the specific commercial or academic agreement with Stanford Business Software Inc. diff --git a/pyoptsparse/pySNOPT/meson.build b/pyoptsparse/pySNOPT/meson.build index 24a97ef7..61edfdb0 100644 --- a/pyoptsparse/pySNOPT/meson.build +++ b/pyoptsparse/pySNOPT/meson.build @@ -40,4 +40,4 @@ endif # python_sources, # pure: false, # subdir: 'pyoptsparse/pySNOPT' -#) \ No newline at end of file +#) diff --git a/pyoptsparse/pySNOPT/source/f2py/README b/pyoptsparse/pySNOPT/source/f2py/README index 54e48d04..94c094bd 100644 --- a/pyoptsparse/pySNOPT/source/f2py/README +++ b/pyoptsparse/pySNOPT/source/f2py/README @@ -1,2 +1,2 @@ -This directory contains the f2py signature file. +This directory contains the f2py signature file. Do not edit these file unless you really know what you are doing. diff --git a/pyoptsparse/pySNOPT/source/f2py/snopt.pyf b/pyoptsparse/pySNOPT/source/f2py/snopt.pyf index 467b1503..c4b95a18 100644 --- a/pyoptsparse/pySNOPT/source/f2py/snopt.pyf +++ b/pyoptsparse/pySNOPT/source/f2py/snopt.pyf @@ -221,7 +221,7 @@ python module snoptc__user__routines end subroutine sqlog end interface snoptc_user_interface end python module snoptc__user__routines -python module snopt ! in +python module snopt ! in interface ! in :snopt subroutine openunit(unitnum,filename,filestatus,fileaction,ierror) ! in :snopt:openunit.f integer intent(in) :: unitnum @@ -266,7 +266,7 @@ python module snopt ! in integer :: negcon integer :: nncon integer :: nnjac - integer :: nnobj + integer :: nnobj integer intent(out) :: mincw integer intent(out) :: miniw integer intent(out) :: minrw @@ -328,7 +328,7 @@ python module snopt ! in end subroutine sngetc subroutine sngeti(buffer,ivalue,inform,cw,lencw,iw,leniw,rw,lenrw) ! in :snopt:sn02lib.f character*(*) :: buffer - integer intent(out) :: ivalue + integer intent(out) :: ivalue integer :: inform character*8 intent(in,out), dimension(lencw) :: cw integer optional,check(len(cw)==lencw),depend(cw) :: lencw=len(cw) @@ -357,7 +357,7 @@ python module snopt ! in integer optional,check(len(pi)>=m),depend(pi) :: m=len(pi) integer optional,check((len(locj)-1)>=n),depend(locj) :: n=(len(locj)-1) integer optional,check(len(jcol)>=ne),depend(jcol) :: ne=len(jcol) - integer :: nncon + integer :: nncon integer :: nnobj integer :: nnjac integer :: iobj @@ -374,7 +374,7 @@ python module snopt ! in integer intent(inout), dimension(n+m),depend(m,n) :: hs double precision intent(inout), dimension(n+m),depend(m,n) :: x double precision intent(inout), dimension(m) :: pi - double precision intent(inout), dimension(n+m),depend(m,n) :: rc + double precision intent(inout), dimension(n+m),depend(m,n) :: rc integer intent(inout) :: inform integer intent(inout) :: mincw integer intent(inout) :: miniw @@ -569,7 +569,7 @@ python module snopt ! in integer dimension(leniw) :: iw integer, optional,check(len(iw)>=leniw),depend(iw) :: leniw=len(iw) end subroutine sqlog - end interface + end interface end python module snopt ! This file was auto-generated with f2py (version:2.37.233-1545). diff --git a/pyoptsparse/pySNOPT/source/openunit.f b/pyoptsparse/pySNOPT/source/openunit.f index e67f8966..b0d9c138 100644 --- a/pyoptsparse/pySNOPT/source/openunit.f +++ b/pyoptsparse/pySNOPT/source/openunit.f @@ -11,7 +11,7 @@ subroutine openunit(unitnum,filename,filestatus,fileaction,ierror) Cf2py intent(in) fileaction integer ierror Cf2py intent(out) ierror - + open(unit=unitnum,file=filename,status=filestatus, > access=fileaction,iostat=ierror) @@ -20,9 +20,9 @@ subroutine openunit(unitnum,filename,filestatus,fileaction,ierror) C Helper routine to flush buffers to files subroutine pyflush(unitnum) - + integer unitnum - + call flush(unitnum) return diff --git a/pyoptsparse/testing/pyOpt_testing.py b/pyoptsparse/testing/pyOpt_testing.py index 53aa55f9..4f7c1ff6 100644 --- a/pyoptsparse/testing/pyOpt_testing.py +++ b/pyoptsparse/testing/pyOpt_testing.py @@ -245,7 +245,7 @@ def optimize(self, sens=None, setDV=None, optOptions=None, storeHistory=False, h if self.optName in DEFAULT_OPTIMIZERS: raise e else: - raise unittest.SkipTest(f"Optimizer not available: {self.optName}") + raise unittest.SkipTest(f"Optimizer not available: {self.optName}") from e if isinstance(setDV, str): self.optProb.setDVsFromHistory(setDV) diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 00000000..73e9c25c --- /dev/null +++ b/ruff.toml @@ -0,0 +1,8 @@ +extend = "~/.config/ruff/ruff.toml" +extend-exclude =[ + # OptView and related files need to be fixed eventually + "pyoptsparse/postprocessing/OptView.py", + "pyoptsparse/postprocessing/OptView_baseclass.py", + "pyoptsparse/postprocessing/OptView_dash.py", + "pyoptsparse/postprocessing/view_saved_figure.py", +] diff --git a/tests/test_hs015.py b/tests/test_hs015.py index 7f312a77..84c98d82 100644 --- a/tests/test_hs015.py +++ b/tests/test_hs015.py @@ -175,7 +175,7 @@ def test_snopt_hotstart(self): @staticmethod def my_snstop(iterDict): - """manually terminate SNOPT after 1 major iteration""" + """Manually terminate SNOPT after 1 major iteration""" if iterDict["nMajor"] == 1: return 1 return 0 diff --git a/tests/test_optProb.py b/tests/test_optProb.py index 1e0d401c..119fa580 100644 --- a/tests/test_optProb.py +++ b/tests/test_optProb.py @@ -203,7 +203,7 @@ def map_check_value(self, key, val): } def processValue(key, val, output): - """helper function since some functions have optional arguments that are needed""" + """Helper function since some functions have optional arguments that are needed""" if key == "Con": return process_funcs[key][output](val, scaled=False, natural=True) elif key == "Obj": diff --git a/tests/test_snopt_bugfix.py b/tests/test_snopt_bugfix.py index 12ffe28a..552de219 100644 --- a/tests/test_snopt_bugfix.py +++ b/tests/test_snopt_bugfix.py @@ -74,8 +74,8 @@ def test_opt(self): # Optimizer try: opt = SNOPT(options=optOptions) - except ImportError: - raise unittest.SkipTest("Optimizer not available: SNOPT") + except ImportError as e: + raise unittest.SkipTest("Optimizer not available: SNOPT") from e sol = opt(optProb, sens=sens) @@ -105,8 +105,8 @@ def test_opt_bug1(self): # Optimizer try: opt = SNOPT(options=optOptions) - except ImportError: - raise unittest.SkipTest("Optimizer not available: SNOPT") + except ImportError as e: + raise unittest.SkipTest("Optimizer not available: SNOPT") from e opt(optProb, sens=sens) @@ -146,8 +146,8 @@ def test_opt_bug_print_2con(self): # Optimizer try: opt = SNOPT(options=optOptions) - except ImportError: - raise unittest.SkipTest("Optimizer not available: SNOPT") + except ImportError as e: + raise unittest.SkipTest("Optimizer not available: SNOPT") from e sol = opt(optProb, sens=sens) diff --git a/tests/test_user_termination.py b/tests/test_user_termination.py index b1fcde3a..f7b3b9ae 100644 --- a/tests/test_user_termination.py +++ b/tests/test_user_termination.py @@ -5,6 +5,7 @@ The proper response of the pyIPOPT and pySNOPT optimizers are tested. """ + # Standard Python modules import unittest @@ -102,8 +103,8 @@ def test_obj(self, optName): try: opt = OPT(optName, options=optOptions) - except ImportError: - raise unittest.SkipTest(f"Optimizer not available: {optName}") + except ImportError as e: + raise unittest.SkipTest(f"Optimizer not available: {optName}") from e sol = opt(optProb, sens=termcomp.sens) @@ -123,8 +124,8 @@ def test_sens(self, optName): try: opt = OPT(optName, options=optOptions) - except ImportError: - raise unittest.SkipTest(f"Optimizer not available: {optName}") + except ImportError as e: + raise unittest.SkipTest(f"Optimizer not available: {optName}") from e sol = opt(optProb, sens=termcomp.sens)