Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Dockerfile.*
run_test.sh
44 changes: 44 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
language: C

sudo: false

services:
- docker

env:
global:
CACHE_IMAGE: ofuhrer/fv3atm_test

before_install:
- test -n $CC && unset CC

jobs:
include:
- stage: build docker images
script:
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
- cd test
- docker pull $CACHE_IMAGE:base || true
- docker build
--target base
--cache-from $CACHE_IMAGE:base
--tag $CACHE_IMAGE:base
--file Dockerfile.base
"."
- docker push $CACHE_IMAGE:base
- cd ../
- docker pull $CACHE_IMAGE:test || true
- docker build
--target test
--cache-from $CACHE_IMAGE:test
--tag $CACHE_IMAGE:test
--file test/Dockerfile.test
"."
- docker push $CACHE_IMAGE:test
- stage: run tests
script:
docker run
-it
--rm
--mount type=bind,source=$TRAVIS_BUILD_DIR/test/work,target=/work
--name=fv3_atm ofuhrer/fv3atm_test:test
1 change: 1 addition & 0 deletions test/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Dockerfile.*
124 changes: 124 additions & 0 deletions test/Dockerfile.base
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
## ---------------------------------------------------------------------------------
## Build environment image
FROM ubuntu:19.10 AS base

MAINTAINER Oliver Fuhrer, oliverf@vulcan.com

ENV ESMF_BRANCH=ESMF_8_0_0 \
NCEP_SHA=3da51e139d5cd731c9fc27f39d88cb4e1328212b \
FMS_SHA=f68878549364e39591216874d5a922c06b7d3a91 \
STOCHASTIC_SHA=01739da377d603c9c8d6d666afe2442260fd79d1 \
FV3ATM_SHA=b48b640f4d8cae978e2d98e149412054d74dcce7 \
FV3CONFIG_BRANCH=v0.3.2

ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
curl \
wget \
gcc \
git \
libblas-dev \
liblapack-dev \
libnetcdf-dev \
libnetcdff-dev \
perl \
make \
rsync \
libffi-dev \
openssl \
libopenmpi3 \
python3 \
python3-pip \
bats

RUN ln -s /bin/python3 /bin/python && \
ln -s /bin/pip3 /bin/pip && \
pip install --no-cache-dir pyyaml

RUN git config --global user.email "you@example.com" && \
git config --global user.name "Your Name"

## ---------------------------------------------------------------------------------
## Build NCEPlibs
RUN git config --global http.sslverify false && \
git clone https://github.com/NCAR/NCEPlibs.git /NCEPlibs && \
mkdir /opt/NCEPlibs && \
cd NCEPlibs && \
git checkout $NCEP_SHA && \
echo "y" | ./make_ncep_libs.sh -s linux -c gnu -d /opt/NCEPlibs -o 1 && \
/bin/rm -rf /NCEPlibs && mv /opt/NCEPlibs /NCEPlibs

## ---------------------------------------------------------------------------------
## Build ESMF
ENV ESMF_DIR=/esmf \
ESMF_INSTALL_PREFIX=/usr/local/esmf \
ESMF_NETCDF_INCLUDE=/usr/include \
ESMF_NETCDF_LIBS="-lnetcdf -lnetcdff" \
ESMF_BOPT=O3
RUN git clone -b $ESMF_BRANCH --depth 1 https://git.code.sf.net/p/esmf/esmf $ESMF_DIR && \
cd $ESMF_DIR && \
make lib -j8 && \
make install && \
make installcheck

## ---------------------------------------------------------------------------------
## Build FMS
COPY patches/PATCH-FMS-affinity.c-fix-getpid.patch /
COPY patches/PATCH-FMS-libFMS_Makefile.am-add-sat-vapor-pres.patch /
RUN git clone https://github.com/NOAA-GFDL/FMS.git /FMS && \
cd /FMS && git checkout $FMS_SHA && \
git am /PATCH-FMS-affinity.c-fix-getpid.patch && \
git am /PATCH-FMS-libFMS_Makefile.am-add-sat-vapor-pres.patch && \
CC=mpicc FC=mpifort LDFLAGS="-L/usr/lib" LOG_DRIVER_FLAGS="--comments" \
CPPFLAGS="-I/usr/include -Duse_LARGEFILE -DMAXFIELDMETHODS_=500 -DGFS_PHYS" \
FCFLAGS="-fcray-pointer -Waliasing -ffree-line-length-none -fno-range-check -fdefault-real-8 -fdefault-double-8 -fopenmp" \
autoreconf --install && \
CC=mpicc FC=mpifort LDFLAGS="-L/usr/lib" LOG_DRIVER_FLAGS="--comments" \
CPPFLAGS="-I/usr/include -Duse_LARGEFILE -DMAXFIELDMETHODS_=500 -DGFS_PHYS" \
FCFLAGS="-fcray-pointer -Waliasing -ffree-line-length-none -fno-range-check -fdefault-real-8 -fdefault-double-8 -fopenmp" \
./configure && \
CC=mpicc FC=mpifort LDFLAGS="-L/usr/lib" LOG_DRIVER_FLAGS="--comments" \
CPPFLAGS="-I/usr/include -Duse_LARGEFILE -DMAXFIELDMETHODS_=500 -DGFS_PHYS" \
FCFLAGS="-fcray-pointer -Waliasing -ffree-line-length-none -fno-range-check -fdefault-real-8 -fdefault-double-8 -fopenmp" \
make -j8 && \
mv /FMS/*/*.mod /FMS/*/*.o /FMS/*/*.h /FMS/

## ---------------------------------------------------------------------------------
## Build fv3atm executable

ENV NCEP_DIR=/NCEPlibs \
FMS_DIR=/FMS \
ESMF_DIR=/usr/local/esmf

ENV ESMF_INC="-I/usr/local/esmf/include -I${ESMF_DIR}/mod/modO3/Linux.gfortran.64.mpiuni.default/" \
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${ESMF_DIR}/lib/libO3/Linux.gfortran.64.mpiuni.default/:${FMS_DIR}/libFMS/.libs/

COPY patches/PATCH-stochastic_physics-update_ca.F90-fix-logical-comparisons.patch /
RUN git clone https://github.com/noaa-psd/stochastic_physics.git /stochastic_physics && \
cd /stochastic_physics && git checkout $STOCHASTIC_SHA

COPY patches/PATCH-fv3atm-apply-fixes.patch /
RUN git clone https://github.com/NOAA-EMC/fv3atm.git /FV3 && \
cd /FV3 && git checkout $FV3ATM_SHA && \
git submodule update --init && \
git am /PATCH-fv3atm-apply-fixes.patch && \
mkdir namphysics && mkdir conf

RUN /bin/rm -f /PATCH-*
COPY etc/make.rules /FV3/conf/make.rules
COPY etc/configure.fv3.gnu_docker /FV3/conf/configure.fv3

# compile base (should speedup compilation of injected code)
#RUN cd /FV3 && make clean && make libs -j8
#RUN cd /FV3/atmos_cubed_sphere && make clean && cd /FV3 && make -j8

## ## ---------------------------------------------------------------------------------
## ## Install fv3config
## RUN git clone -b $FV3CONFIG_BRANCH https://github.com/VulcanClimateModeling/fv3config.git && \
## cd fv3config && \
## pip install --no-cache-dir -e . && \
## python -m fv3config.download_data

## ---------------------------------------------------------------------------------
## Not meant for entering
CMD ["bash"]
25 changes: 25 additions & 0 deletions test/Dockerfile.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
## ---------------------------------------------------------------------------------
## Build test image
FROM ofuhrer/fv3atm_test:base AS test

MAINTAINER Oliver Fuhrer, oliverf@vulcan.com

# inject code into container image
#RUN /bin/rm -rf /FV3/atmos_cubed_sphere && \
# mkdir /FV3/atmos_cubed_sphere
#COPY GFDL_tools /FV3/atmos_cubed_sphere/GFDL_tools
#COPY driver /FV3/atmos_cubed_sphere/driver
#COPY model /FV3/atmos_cubed_sphere/model
#COPY tools /FV3/atmos_cubed_sphere/tools
#COPY makefile /FV3/atmos_cubed_sphere/makefile

# rebuild (with injected code)
RUN cd /FV3 && make libs -j8 && make -j8

# setup everything for testing
ENV LD_LIBRARY_PATH=/FMS/libFMS/.libs:/usr/local/esmf/lib/libO3/Linux.gfortran.64.mpiuni.default

RUN mkdir /work
WORKDIR /work

CMD ["/work/run_test.sh"]
139 changes: 139 additions & 0 deletions test/etc/configure.fv3.gnu_docker
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@

############
# commands #
############
FC = FC=gfortran mpifort
CC = CC=gcc mpicc
CXX = g++
LD = mpifort

INCLUDE =

#########
# flags #
#########
# default is 64-bit OpenMP non-hydrostatic build
DEBUG =
REPRO = Y
VERBOSE =
OPENMP = Y
AVX2 = N
HYDRO = N
32BIT = N


NCEPLIBS_INC = /NCEPlibs/include
INCLUDE += -I$(NCEPLIBS_INC)

NCEPLIBS_DIR = /NCEPlibs/lib
NEMSIO_LIB = $(NCEPLIBS_DIR)/libnemsio_d.a
BACIO_LIB4 = $(NCEPLIBS_DIR)/libbacio_4.a
SP_LIBd = $(NCEPLIBS_DIR)/libsp_v2.0.2_d.a
W3EMC_LIBd = $(NCEPLIBS_DIR)/libw3emc_d.a
W3NCO_LIBd = $(NCEPLIBS_DIR)/libw3nco_d.a
NCEPLIBS = $(NEMSIO_LIB) $(BACIO_LIB4) $(SP_LIBd) $(W3EMC_LIBd) $(W3NCO_LIBd)

##############################################
# Need to use at least GNU Make version 3.81 #
##############################################
need := 3.81
ok := $(filter $(need),$(firstword $(sort $(MAKE_VERSION) $(need))))
ifneq ($(need),$(ok))
$(error Need at least make version $(need). Load module gmake/3.81)
endif

NETCDF_DIR = /usr
NETCDF_ROOT = $(NETCDF_DIR)
INCLUDE += -I$(NETCDF_ROOT)/include

FPPFLAGS := -cpp -Wp,-w $(INCLUDE) -fPIC
CFLAGS := $(INCLUDE) -fPIC

FFLAGS := $(INCLUDE) -fcray-pointer -ffree-line-length-none -fno-range-check -fPIC

CPPDEFS += -Duse_libMPI -Duse_netCDF -DSPMD -DUSE_LOG_DIAG_FIELD_INFO -Duse_LARGEFILE -DUSE_GFSL63 -DGFS_PHYS -DNO_INLINE_POST
CPPDEFS += -DNEW_TAUCTMAX -DINTERNAL_FILE_NML

ifeq ($(HYDRO),Y)
CPPDEFS +=
else
CPPDEFS += -DMOIST_CAPPA -DUSE_COND
endif

ifeq ($(32BIT),Y)
CPPDEFS += -DOVERLOAD_R4 -DOVERLOAD_R8
else
FFLAGS += -fdefault-double-8 -fdefault-real-8
endif

ifeq ($(AVX2),Y)
FFLAGS += -xCORE-AVX2 -qno-opt-dynamic-align
CFLAGS += -xCORE-AVX2 -qno-opt-dynamic-align
endif

FFLAGS_OPT = -O2
FFLAGS_REPRO = -O2 -g -fbacktrace
FFLAGS_DEBUG = -O0 -g -fbacktrace -fno-fast-math -ffree-line-length-none -fno-backslash -pedantic -Waliasing -Wampersand -Wline-truncation -Wsurprising -Wtabs -Wunderflow -fdump-core -ffpe-trap=invalid,zero,overflow -fbounds-check -finit-real=nan -finit-integer=9999999 -finit-logical=true -finit-character=35

TRANSCENDENTALS := -fast-transcendentals
FFLAGS_OPENMP = -fopenmp
FFLAGS_VERBOSE = -v -V -what

CFLAGS += -D__IFC

CFLAGS_OPT = -O2
CFLAGS_REPRO = -O2
CFLAGS_OPENMP = -fopenmp
CFLAGS_DEBUG = -O0 -g

# Optional Testing compile flags. Mutually exclusive from DEBUG, REPRO, and OPT
# *_TEST will match the production if no new option(s) is(are) to be tested.
FFLAGS_TEST = -O3 -debug minimal -fp-model source -qoverride-limits
CFLAGS_TEST = -O2

LDFLAGS := -L${ESMF_DIR}/lib/libO3/Linux.gfortran.64.mpiuni.default/ -L${FMS_DIR}/libFMS/.libs/
LDFLAGS_OPENMP := -fopenmp
LDFLAGS_VERBOSE := -Wl,-V,--verbose,-cref,-M

# start with blank LIBS
LIBS :=

LIBS += -lgfortran

ifneq ($(REPRO),)
CFLAGS += $(CFLAGS_REPRO)
FFLAGS += $(FFLAGS_REPRO)
FAST :=
else ifneq ($(DEBUG),)
CFLAGS += $(CFLAGS_DEBUG)
FFLAGS += $(FFLAGS_DEBUG)
FAST :=
else ifneq ($(TEST),)
CFLAGS += $(CFLAGS_TEST)
FFLAGS += $(FFLAGS_TEST)
FAST :=
else
CFLAGS += $(CFLAGS_OPT)
FFLAGS += $(FFLAGS_OPT)
FAST := $(TRANSCENDENTALS)
endif

ifneq ($(OPENMP),)
CFLAGS += $(CFLAGS_OPENMP)
FFLAGS += $(FFLAGS_OPENMP)
LDFLAGS += $(LDFLAGS_OPENMP)
# to correct a loader bug on gaea: envars below set by module load intel
#LIBS += -L$(INTEL_PATH)/$(INTEL_MAJOR_VERSION)/$(INTEL_MINOR_VERSION)/lib/intel64 -lifcoremt
#LIBS += -lifcoremt
endif

ifneq ($(VERBOSE),)
CFLAGS += $(CFLAGS_VERBOSE)
FFLAGS += $(FFLAGS_VERBOSE)
LDFLAGS += $(LDFLAGS_VERBOSE)
endif

LIBS += -lFMS -lesmf -lnetcdff -lnetcdf -llapack -lblas -lc -lrt

LDFLAGS += $(LIBS)

30 changes: 30 additions & 0 deletions test/etc/make.rules
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
.SUFFIXES:
.SUFFIXES: .F90 .f90 .F .f .o .c

.F90.f90:
$(CPP) $(CPPFLAGS) $< > $*.f90

.F.f:
$(CPP) $(CPPFLAGS) $< > $*.f

.f.o:
$(FC) $(FFLAGS) $(OTHER_FFLAGS) -c $< -o $@

.f90.o:
$(FC) $(FFLAGS) $(OTHER_FFLAGS) -c $< -o $@

.F.o:
$(FC) $(CPPDEFS) $(FPPFLAGS) $(FFLAGS) $(OTHER_FFLAGS) -c $< -o $@

.F90.o:
$(FC) $(CPPDEFS) $(FPPFLAGS) $(FFLAGS) $(OTHER_FFLAGS) -c $< -o $@

.c.o:
$(CC) $(CPPDEFS) $(CPPFLAGS) $(CFLAGS) $(OTHERFLAGS) $(OTHER_CFLAGS) -c $< -o $@

depend: $(DEPEND_FILES) makefile
@echo "Building dependencies ..."
@ls -1 $(DEPEND_FILES) > Srcfiles
@echo "." > Filepath
@$(MKDEPENDS) -m Filepath Srcfiles > depend
@$(RM) -f Filepath Srcfiles
Loading