   VTMOP for libEnsemble: Solving blackbox MOPs with libEnsemble

VTMOP is a Fortran 2008 package containing a robust, portable solver and
a flexible framework for solving MOPs. Designed for efficiency and
scalability to an arbitrary number of objectives, VTMOP attempts to generate
uniformly spaced points on a (possibly nonconvex) Pareto front with minimal
cost function evaluations.

This directory contains a minimal copy of VTMOP, containing only the
subroutines and dependencies that are used by the libEnsemble interface.

A Fortran interface for the VTMOP subroutines used by libEnsemble is given in
vtmop_libe.f90. It contains a module VTMOP_LIBE_MOD, which contains two
subroutines VTMOP_LIBE_INIT(...) and VTMOP_LIBE_GENERATE(...). See the headers
for those subroutines for the full interface and usage information.

The files fmodpy_simplified_vtmop_libe.f90 and vtmop_libe_c_wrapper.f90
are wrapper files generated by fmodpy, for calling vtmop_libe.f90 in C/C++.
The file __init__.py was also generated by fmodpy, and contains instructions
for building all the C and Fortran binaries, and an interface for calling
the C wrapper in Python.

To use the Python interface, first import the Python module:
 - from [this directory] import vtmop_libe_mod
Then call the wrapped subroutines
 - vtmop_libe_mod.vtmop_libe_init(...)
 - vtmop_libe_mod.vtmop_libe_generate(...)

The first time that vtmop_libe_mod is imported, the __init__.py file will
automatically attempt to compile the binaries using gfortran. gfortran
is no longer needed after the binaries have been generated. If you would
like to build with a different compiler, edit lines 16 and 20 of __init__.py,
as necessary.

In summary, the following files are contained in this directory:

 - The file depend_graph.txt contains a diagram of the dependency tree for the
   minimal copy of VTMOP.
 - The file __init__.py contains a Python wrapper for vtmop_libe.f90,
   containing a Python instance of the module vtmop_libe_mod.
 - The file vtmop_libe.f90 contains a Fortran interface for the VTMOP
   subroutines used by libEnsemble.
 - fmodpy_simplified_vtmop_libe.f90 and vtmop_libe_c_wrapper.f90 are wrappers
   for vtmop_libe.f90, automatically generated using fmodpy.
   vtmop_libe_c_wrapper.f90 provides a C/C++ interface for the module.
 - The file vtmop.f90 is the main Fortran 2008 file containing a minimal copy
   of VTMOP.
 - The file delsparse.f90 contains the module and driver subroutines
   for DELAUNAYSPARSE (ACM TOMS Algorithm 1012).
 - The file linear_shepard.f90 is a Fortran 95 module for computing the LSHEP
   surrogate model (ACM TOMS Algorithm 905).
 - The file qnstop.f90 contains the LATINDESIGN function from QNSTOP
   (ACM TOMS Algorithm 1007).
 - The file shared_modules.f90 contains the REAL_PRECISION module, which is
   used for approximately 64 bit arithmetic.
 - The file slatec.f contains the subroutine DWNNLS and its dependencies
   from the SLATEC library. This library has been slightly modified to
   comply with the modern Fortran standards. Additionally, legacy
   implementations of the BLAS subroutines DROTM and DTROMG have been
   included under different names to avoid dependency issues.
 - The files lapack.f and blas.f contain all LAPACK and BLAS
   subroutines that are referenced (both directly and indirectly) in
   VTMOP or its dependencies.
 - A sample GNU (or Intel, by uncommenting lines 3 and 4) Makefile is provided.
   However, this Makefile is not needed since Python builds the binaries on
   import. The Makefile only exists for debugging purposes.

--------------------------------------------------------------------------------

For further inquiries, contact
Tyler Chang, tchang@anl.gov

The Python and C wrappers for this project were automatically generated using
fmodpy. Consider supporting fmodpy on GitHub: https://github.com/tchlux/fmodpy.

For more information on fmodpy and Fortran -> Python wrappers, contact
Thomas Lux, tchlux@vt.edu

To cite this work:
Chang, T.H., Larson, J., Watson, L.T., and Lux, T.C.H. Managing
computationally expensive blackbox multiobjective optimization problems
with libEnsemble. In Proc. 2020 Spring Simulation Conference (SpringSim '20),
Article No. 31, pp. 1–12. DOI: 10.22360/springsim.2020.hpc.001
