/esmf

Primary LanguageFortranOtherNOASSERTION

================================================================================

                        README - ESMF 8.1.0 beta snapshot

                    Earth System Modeling Framework (ESMF)

 Earth System Modeling Framework
 Copyright 2002-2020, University Corporation for Atmospheric Research,
 Massachusetts Institute of Technology, Geophysical Fluid Dynamics
 Laboratory, University of Michigan, National Centers for Environmental
 Prediction, Los Alamos National Laboratory, Argonne National Laboratory,
 NASA Goddard Space Flight Center.
 Licensed under the University of Illinois-NCSA License.

================================================================================

Hello and welcome to ESMF.


If you need to compile and link your code against an already-built ESMF library,
go to the "APPLICATION" section below.


If you need to build the ESMF library, go to the "BUILDING and INSTALLING"
section below. (If you just downloaded the ESMF tarball, it is source code and
you will have to build the library first.)


If you are looking for more documentation, or higher-level information
about the ESMF project itself, go to the "MORE HELP" section below.


Several addon packages are included with this ESMF release under ./src/addon:
  ESMPy   - Python interface to ESMF.
  MAPL    - Usability layer developed under the NASA 
            Modeling Analysis and Prediction (MAP) program.
  NUOPC   - Interoperability layer developed under the 
            National Unified Operational Prediction Capability (NUOPC) program.
See each addon package for a specific README file.


Please contact <esmf_support@ucar.edu> with any questions or problems.

================================================================================
================================================================================

APPLICATION compilation and linking
-----------------------------------

If you want to compile and link your application against an ESMF library
which has already been installed on your system, you will need to tell
the compiler where the ESMF module files and ESMF library files are located.
If this has already been documented by the installer of the ESMF library,
follow the directions given. However, if not, then you must determine the
correct compiler and linker flags yourself.

You can do this in a variety of ways. If you already have build scripts or
existing makefiles, you can explicitly add the correct compiler and linker
flags. The ESMF build process puts the modules and library into separate
directories depending on the options used when building the ESMF library.
The directory containing the ESMF library file also contains a makefile 
fragment named "esmf.mk" (e.g. ./lib/libg/Linux.intel.32.mpich.default/esmf.mk
for an ESMF library built on Linux with the Intel compiler for 32-bit using
the mpich MPI-implementation). This makefile fragment defines several variables
indicating compiler options, include paths, linker options, library paths and
libraries necessary to compile and link against ESMF with Fortran or C++. Look
at "esmf.mk" to pull out the necessary flags to compile and link your own code
against the installed ESMF library.

Alternatively, you may want to include "esmf.mk" from within your own build
system. All of the variables defined in "esmf.mk" have prefix "ESMF_"
as to prevent name space conflicts with users' makefiles. Notice that "esmf.mk"
is a self-contained file and is not affected by environment variables. It is
not necessary to set any ESMF_ environment variables to use an ESMF library
that has been installed on your system!

================================================================================
================================================================================

BUILDING and INSTALLING the ESMF library
----------------------------------------

The following compilers and utilities are required for compiling, linking and
testing the ESMF software:
* Fortran90 (or later) compiler
* C++ compiler
* GNU's gcc compiler - for a standard cpp preprocessor implementation
* GNU make
* MPI implementation compatible with the above compilers (but see below)
* LAPACK library compatible with the above compilers (but see below)
* Perl - for running test scripts

Alternatively ESMF can be built using a single-processor MPI-bypass library
that comes with ESMF. It allows ESMF applications to be linked and run in
single-process mode.


Steps of the standard build and install procedure:

 1) Set required environment variable(s) (see next section below).

 2) Type 'gmake' (the GNU make program) to build the ESMF library.

 3) Optionally test the ESMF library build using any of the following targets:
    a) 'gmake unit_tests' to build and run the unit tests.
    b) 'gmake system_tests' to build and run the system tests.
    c) 'gmake check' to build and run the unit and system tests.
    d) 'gmake examples' to build and run the examples.
    f) 'gmake all_tests' to build and run all available tests and examples.
    
    Please consult the "Platform Specific Notes Related to Executing Test 
    Targets" below before attempting to use any of these targets.
    
 4) Type 'gmake install' to install the ESMF library in a custom location.
 
 5) Optionally test the ESMF library installation via 'gmake installcheck'.

================================================================================

GNUmake
-------

The ESMF build system uses the GNU make program; it is generally named
'gmake' but may also be simply 'make' or 'gnumake' on some platforms. We do
not use configure or autoconf; the selection of various options is done by
setting environment variables before building the framework.


Environment Variables
---------------------

The following environment variables are the most likely ones to be used
for a typical ESMF library build under normal circumstances. In most
situations only one or two environment variables need to be set. There are
other environment variables which can be set to customize the ESMF library
build process. In particular, ESMF's dependency on 3rd party libraries, such as
LAPACK, NETCDF, etc., is controlled by special environment variables. The ESMF
User's Guide documents all environment variables in detail. 

ESMF_DIR

The environment variable ESMF_DIR must be set to the full pathname of the 
top level ESMF directory before building the framework. This is the only 
environment variable which is required to be set on all platforms under 
all conditions.

bsh/ksh example  :  export ESMF_DIR=/home/joeuser/esmf
csh/tcsh example :  setenv ESMF_DIR /home/joeuser/esmf

ESMF_BOPT

This environment variable controls the build option. To make a debuggable
version of the library set ESMF_BOPT to 'g' before building. The default is 'O'
(capital oh) which builds an optimized version of the library. If ESMF_BOPT is
O, ESMF_OPTLEVEL can also be set to a numeric value between 0 and 4 to select a
specific optimization level.

ESMF_COMM

On systems with a vendor-supplied MPI communications library the vendor library 
is chosen by default for communications and ESMF_COMM need not be set. For other
systems (e.g. Linux or Darwin) a multitude of MPI implementations are available
and ESMF_COMM must be set to indicate which implementation is used to build
the ESMF library. Set ESMF_COMM according to your situation to: mpich, mpich2,
lam, openmpi or intelmpi. ESMF_COMM may also be set to "user" indicating that
the user will set all the required flags using advanced ESMF environment
variables. Please see the User's Guide for more details.

Alternatively, ESMF comes with a single-processor MPI-bypass library which is
the default for Linux and Darwin systems. To force the use of this bypass
library set ESMF_COMM equal to "mpiuni".

ESMF_COMPILER

The ESMF library build requires a working Fortran90 and C++ compiler. On 
platforms that don't come with a single vendor supplied compiler suite
(e.g. Linux or Darwin) ESMF_COMPILER must be set to select which Fortran and
C++ compilers are being used to build the ESMF library. Notice that setting the
ESMF_COMPILER variable does _not_ affect how the compiler executables are
located on the system. ESMF_COMPILER (together with ESMF_COMM) affect the
name that is expected for the compiler executables. Furthermore, the 
ESMF_COMPILER setting is used to select compiler and linker flags consistent
with the compilers indicated.

By default, Fortran and C++ compiler executables are expected to be located in
a location contained in the user's PATH environment variable. This means that
if you cannot locate the correct compiler executable via the "which" command
on the shell prompt the ESMF build system won't find it either!

There are advanced ESMF environment variables that can be used to select 
specific compiler executables by specifying the full path. This can be used to
pick specific compiler executables without having to modify the PATH environment
variable. Please see the User's Guide for details.

Use 'gmake info' to see which compiler executables the ESMF build system will
be using according to your environment variable settings.

To see possible values for ESMF_COMPILER, cd to $ESMF_DIR/build_config and list
the directories there. The first part of each directory name corresponds to the
output of 'uname -s' for this platform. The second part contains possible values
for ESMF_COMPILER. In some cases multiple combinations of Fortran and C++
compilers are possible, e.g. there is "intel" and "intelgcc" available for
Linux. Setting ESMF_COMPILER to "intel" indicates that both Intel Fortran and
C++ compilers are used, whereas "intelgcc" indicates that the Intel Fortran
compiler is used in combination with GCC's C++ compiler.

If you do not find a configuration that matches your situation you will need to
port ESMF. Please see the "PORTING" section below for help.

ESMF_ABI

If a system supports 32-bit and 64-bit (pointer wordsize) application binary
interfaces (ABIs), this variable can be set to select which ABI to use. Valid 
values are '32' or '64'. By default the most common ABI is chosen.

ESMF_OS

Typically equal to the output of "uname -s" except for UNICOS/mp where
ESMF_OS is set to Unicos. This variable is not normally set by the user unless 
cross-compiling. ESMF_OS indicates the target system for which the ESMF library
is being built. Under normal circumstances, i.e. ESMF is being built on the 
target system, ESMF_OS is set automatically. However, when cross-compiling for
a different target system ESMF_OS must be set to the respective target OS. For
example, when compiling for the Cray X1 on an interactive X1 node ESMF_OS will
be set automatically. However, when ESMF is being cross-compiled for the X1 on
a Linux host the user must set ESMF_OS to Unicos manually in order to indicate
the intended target platform.

ESMF_INSTALL_PREFIX

This variable specifies the prefix of the installation path used with the
install target. Library, F90 module files, header files and documentation
all are installed relative to ESMF_INSTALL_PREFIX by default. See the ESMF
User's Guide on how to customize the installation location of the installed
files using additional "ESMF_INSTALL_..." environment variables.
The ESMF_INSTALL_PREFIX may be provided as an absolute path or relative to 
ESMF_DIR.


Supported Makefile Targets
--------------------------

 info       : print out extensive system configuration information about what
              compilers, libraries, paths, flags, etc are being used.

 clean      : remove all files built for this OS/compiler/ABI.
 distclean  : remove all files built for all architectures.
 clobber    : same as distclean.

 lib        : build the ESMF library only (default).
 check      : build and run the unit and system tests to validate the library.
 all        : build the library, the unit and system tests, and examples.
 doc        : build the documentation (requires specific latex macros packages
              and additional utilities).  See the ESMF web site for details;
              the web site also provides pre-built pdf and html versions of all
              docs.

 unit_tests           : build and run the unit tests
 unit_tests_uni       : build unit tests and run them in uni-processor mode
 build_unit_tests     : build unit tests (don't run)
 run_unit_tests       : run unit tests (don't build)
 run_unit_tests_uni   : run unit tests in uni-processor mode (don't build)
 clean_unit_tests     : remove unit test executables only

 system_tests         : build and run the system tests
 system_tests_uni     : build system tests and run them in uni-processor mode
 build_system_tests   : build system tests (don't run)
 run_system_tests     : run system tests (don't build)
 run_system_tests_uni : run system tests in uni-processor mode (don't build)
 clean_system_tests   : remove system test executables only

 examples             : build and run the examples
 examples_uni         : build examples and run them in uni-processor mode
 build_examples       : build examples (don't run)
 run_examples         : run examples (don't build)
 run_examples_uni     : run examples in uni-processor mode (don't build)
 clean_examples       : remove example executables only

 all_tests            : build and run all available tests and examples.
 build_all_tests      : build all available tests and examples (don't run)
 run_all_tests        : run all available tests and examples (don't build)
 clean_all_tests      : remove all available test and example executables

 install              : install the ESMF library in a custom location
 installcheck         : check the ESMF library installation
 

Platform Specific Notes Related to Executing Test Targets
---------------------------------------------------------

After the ESMF library has been built successfully it is a good idea to test
its functional integrity by building and executing a range of test applications.
It is important to use the same environment settings for the ESMF gmake test 
targets as were used during the library build.

The ESMF library source tree comes with 3 flavors of test codes:
- unit_tests:   separately test the functionality of individual ESMF code units
- system_tests: test the interplay of multiple ESMF code units
- examples:     demonstrate features of individual ESMF code units. Example
                sources are quoted in the ESMF Reference Manual.

Unless the ESMF library was built in MPI-bypass mode (mpiuni), all applications
compiled and linked against ESMF automatically become MPI applications and must
be executed as such. Details of how to execute MPI applications vary widely from
system to system. ESMF uses an mpirun script mechanism to abstract away most of
these differences.

ESMF provides mpirun scripts for a wide range of system configurations. These
are used by ESMF by default or can be set by the user via the ESMF_MPIRUN
environment variable. The best way to see how the existing scripts are used
on the supported platforms is to go to the "Supported Platforms" web page at
https://www.earthsystemcog.org/projects/esmf/platforms_7_0_0 and follow the link
for the platform of interest. Each test report contains the output of 
"gmake info", which lists the settings of the ESMF_MPIxxx environment variables.

Users are encouraged to read the "Setting up ESMF to run Test Suite
Applications" in the User's Guide to gain a deeper insight into how ESMF
manages parallel application launching. This User's Guide section is especially
valuable in case no suitable script is available and the user is confronted
with the task of writing a customized, system specific mpirun script to work
with ESMF.

================================================================================
================================================================================

PORTING the ESMF library to a new platform and/or fixing build problems:
-----------------------------------------------------------------------


Overview
--------

If the build_config directory does not already contain a directory for your
platform/compiler, or if your platform/compiler is already supported but you
need to make some adaptations for your local system, this section should help
you get started.

The top level makefile is $ESMF_DIR/makefile. It should not need to be
modified. The bulk of the makefile rules and settings used by all platforms
and compilers is $ESMF_DIR/build/common.mk. This makefile should not be
changed unless the modification is intended to apply to every system on which
ESMF is built. This makefile is included by the top level makefile.

The per-platform makefile fragments which contain the settings which differ
for each system and compiler combination are in separate subdirectories under
$ESMF_DIR/build_config.

If you find the settings are close and you just need to add additional
information, or the changes are very specific to a particular system, you can
set the environment variable ESMF_SITE to a value, and then the makefiles will
include
$ESMF_DIR/build_config/$ESMF_OS.$ESMF_COMPILER.$ESMF_SITE/build_rules.mk,
in addition to the default settings.

If you are supporting a completely new platform, make a new directory
following the naming pattern described below. Copy the contents of the
closest existing match into that directory and start making changes.


Naming Conventions
------------------

In $ESMF_DIR/build_config, each compiler/platform combination has
a separate subdirectory which follows a 3-part naming convention:

The first part is the system name as it is automatically set in ESMF_OS.

The second part is the compiler name for those platforms which support
compilers from different vendors.  For those systems which come with a
single vendor-supplied compiler, the compiler name is 'default'.  
The environment variable ESMF_COMPILER is used to select the compiler.

The last part of the name is the site-specific information. The 'default'
directories contain files which are always read for the given 
architecture/compiler combination. Then, in addition, if the environment
variable ESMF_SITE has a value, the corresponding directory will be 
searched after the default directory, for overrides and additional settings 
of directory names, values, flags, and other custom information.

Note that building on the SGI Altix is the same as the other Linux/Intel 
platforms, so set ESMF_COMPILER to 'intel' to use the files in the
Linux.intel.default directory. For Altix set ESMF_COMM to 'mpi' in order to
pick up the vendor MPI library.


File Descriptions
-----------------

Each default directory contains the following files:

 ESMC_Conf.h    : C++ preprocessor definitions needed for this platform.

 ESMF_Conf.inc  : values needed by both preprocessed F90 and C++; contains
                  information in a format parseable by both languages.         

 build_rules.mk : makefile fragment which is included by the main ESMF build
                  system and contains specific settings for this platform.


Customizing an Existing Platform
--------------------------------

0. Check on http://sourceforge.net/projects/esmfcontrib -> CVS to be sure
   someone else has not already done this for your location or machine.

1. Set the environment variable ESMF_SITE to a string.  Suggested values are
   either your location (e.g. mit, cola) or a specific machine (e.g. bluesky).

2. Make a subdirectory named in the form:  system.compiler.site

3. Initially copy over only build_rules.mk from the corresponding default
   directory and remove all values which remain the same.  The build_rules.mk
   file in this site-specific directory will be included after the default
   one has been read, so only differences should be maintained.  

4. The ESMC_Conf.h and ESMF_conf.inc files do not need to be copied.

5. Test and get it working.

6. Post it back on the esmfcontrib sourceforge site for others to use.


Adding a New Platform
---------------------

1. Create a new subdirectory which follows the naming conventions.

2. Copy the contents of the most similar existing directory over to the 
   new directory.

3. Edit the build_rules.mk file to set the compiler names, flags, etc.
   Since ESMF contains both F90 and C++ code, generally the linkers are
   not able to simply link without being given additional libraries.

4. Edit the ESMC_Conf.h file and look over the macro definitions.

5. Once it is working, post it back on the esmfcontrib sourceforge site and
   email esmf_support@ucar.edu so we can include it in our next
   release.


Directories
-----------

build_config:    Contains makefile fragments that can be customized by the 
                 user for specific platforms, compilers, and sites.
                 See the README in this directory for help with porting to
                 new platforms or compilers.

build:           Contains the generic portion of the build that a
                 user would not be expected to modify.  Also contains a 
                 sample user makefile.

scripts:         Contains scripts for testing and uniprocessor runs, and some
                 templates.

src:             Contains the source code.


The following directories are created during the building and testing stages:

lib:             Contains the ESMF library file.

mod:             Contains the Fortran module files.

test:            Contains unit and system test executables and output.

examples:        Contains examples executables and output.

doc:             Contains documentation (if built).

================================================================================

MORE HELP:
---------

Information about the ESMF project can be found at the ESMF web site:
        https://www.earthsystemcog.org/

Software documentation for the last public release is at:
        https://www.earthsystemcog.org/ -> Users -> User Docs

Software documentation for all releases is at:
        https://www.earthsystemcog.org/ -> Software -> Download/Releases

The ESMF User's Guide contains information on building and installing the ESMF.
The ESMF Reference Manual contains information on the architecture of the ESMF,
example code, and details of the API (Application Programming Interface).

The ESMF library source code is also available for download at:
        http://sourceforge.net/projects/esmf

Follow the directions on that web page to download a tarball and for
access to the ESMF CVS repository.  The Sourceforge site also contains 
the bugs, support, and task lists for ESMF.

Demos, system tests, and use test cases, demonstrating how ESMF can be used in 
realistic situations are available at:
        https://www.earthsystemcog.org/projects/esmf/code_examples/

Contributions from ESMF users are available at:
        http://sourceforge.net/projects/esmfcontrib

Please contact esmf_support@ucar.edu with any questions or problems.

================================================================================
$Id$