Code_Aster 14.2 in parallelo su Ubuntu Bionic

Questo post mostra come costruire una versione di Code_Aster 14.2 in parallelo a partire dai sorgenti. Questa procedura, che richiede una conoscenza intermedia dell’ambiente Linux, non è ufficiale ma è stata creata a partire da suggerimenti e procedure esistenti.

La distribuzione di partenza utilizzata è una Ubuntu Bionic 18.04 LTS, anche se è possibile adattare la procedura ad altre versioni di Ubuntu e di Code_Aster. I comandi non devono essere eseguiti come “root” ma come utente normale (in particolare l’installazione di Code_Aster), la maggior parte dell’installazione viene effettuata all’interno della directory home dell’utente (ma è possibile metterla altrove, purchè l’utente abbia i diritti necessari).

Per prima cosa occorre installare alcuni strumenti e librerie:

sudo apt-get install -y curl mercurial gfortran g++ python-dev python-numpy liblapack-dev libblas-dev tcl tk zlib1g-dev bison flex checkinstall openmpi-bin cmake hdf5-tools swig grace gettext libboost-dev libboost-python-dev libopenmpi-dev tkpng libatlas-base-dev libblacs-mpi-dev

Definiamo alcune variabili di ambiente con le versioni e i percorsi per i software da installare e costruiamo alcune directory dove verranno messi i sorgenti da compilare (DEV_DIR) e i risultati delle compilazioni (INSTALL_DIR):

export ASTER_VER=14.2
export DEV_DIR=~/dev
export INSTALL_DIR=~/install
export HDF5_VER=1.8.14
export MED_VER=3.3.1
export METIS_VER=5.1.0
export PARMETIS_VER=4.0.3
export SCOTCH_VER=6.0.4
export MUMPS_VER=5.1.2
export MFRONT_VER=3.1.1
export PETSC_VER=3.8.2
export SCALAPACK_VER=2.0.2
export ASTER_ROOT=$INSTALL_DIR/aster
export ASTER_PUBLIC=$ASTER_ROOT/public
export ASTER_FULLSRC_DIR=$DEV_DIR/aster-full-src-${ASTER_VER}.0

mkdir $INSTALL_DIR
mkdir -p $DEV_DIR/aster-prerequisites
mkdir -p $DEV_DIR/codeaster

Installiamo gli strumenti di sviluppo per Code_Aster, utili per verificare l’installazione una volta effettuata:

cd $DEV_DIR/codeaster

curl -o ~/.hgrc https://bitbucket.org/code_aster/codeaster-devtools/raw/tip/etc/hgrc_template # modify and set user name and email

hg clone https://bitbucket.org/code_aster/codeaster-devtools devtools

Scarichiamo e compiliamo la versione sequenziale di Code_Aster:

curl -Sl https://www.code-aster.org/FICHIERS/aster-full-src-$ASTER_VER.0-1.noarch.tar.gz | tar -xzC $DEV_DIR

cd $ASTER_FULLSRC_DIR
python setup.py --prefix $INSTALL_DIR/aster

Scarichiamo ptscotch:

cd $DEV_DIR/aster-prerequisites
mkdir ptscotch

tar xf $ASTER_FULLSRC_DIR/SRC/scotch-${SCOTCH_VER}-aster5.tar.gz -C ptscotch --strip-components 1

Prima di poterlo compilare, occorre modificare i sorgenti per disattivare l’opzione SCOTCH_PTHREAD (a questo scopo costruiamo ad applichiamo una patch), poi possiamo compilare:

cat >> patch_ptscotch << 'EOF'
diff -ruN ptscotch/src/Makefile.inc ptscotch-without-pthread/src/Makefile.inc
--- ptscotch/src/Makefile.inc	2016-10-07 07:43:22.000000000 +0000
+++ ptscotch-without-pthread/src/Makefile.inc	2018-06-08 08:41:07.693702800 +0000
@@ -9,7 +9,7 @@
 CCS		= gcc
 CCP		= mpicc
 CCD		= gcc
-CFLAGS		= -O3 -fPIC -DCOMMON_FILE_COMPRESS_GZ -DCOMMON_PTHREAD -DCOMMON_RANDOM_FIXED_SEED -DSCOTCH_RENAME -DSCOTCH_RENAME_PARSER -DSCOTCH_PTHREAD -Drestrict=__restrict
+CFLAGS		= -O3 -fPIC -DCOMMON_FILE_COMPRESS_GZ -DCOMMON_PTHREAD -DCOMMON_RANDOM_FIXED_SEED -DSCOTCH_RENAME -DSCOTCH_RENAME_PARSER -Drestrict=__restrict
 CLIBFLAGS	=
 LDFLAGS		= -fPIC -lz -lm -pthread -lrt
 CP		= cp
EOF

patch -s -p0 < patch_ptscotch
cd ptscotch/src
make scotch esmumps ptscotch ptesmumps CCD=mpicc
mkdir ${ASTER_PUBLIC}/ptscotch-${SCOTCH_VER}
make install prefix=${ASTER_PUBLIC}/ptscotch-${SCOTCH_VER}

Scarichiamo e compiliamo parmetis:

cd $DEV_DIR/aster-prerequisites
wget --no-check-certificate --quiet ${PARMETIS_SRC} -O parmetis.tar.gz
mkdir parmetis
tar xf parmetis.tar.gz -C parmetis --strip-components 1
cd parmetis
make config prefix=${ASTER_PUBLIC}/parmetis-${PARMETIS_VER}
make -j
make install

Stessa cosa per scalapack:

cd $DEV_DIR/aster-prerequisites
mkdir scalapack

curl -Sl http://www.netlib.org/scalapack/scalapack-${SCALAPACK_VER}.tgz | tar -xzC $DEV_DIR/aster-prerequisites/scalapack --strip-components 1

cd scalapack && mkdir build && cd build

cmake -DCMAKE_INSTALL_PREFIX=${ASTER_PUBLIC}/scalapack-${SCALAPACK_VER} -DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=ON ..

make -j && make install
cd ${ASTER_PUBLIC}/scalapack-${SCALAPACK_VER}/lib
cp libscalapack.so libblacs.so

Finalmente possiamo compilare il risolutore Mumps (notare che la lunga riga di configurazione è un comando unico):

cd $DEV_DIR/aster-prerequisites
mkdir mumps
tar xf $ASTER_FULLSRC_DIR/SRC/mumps-${MUMPS_VER}-aster5.tar.gz -C mumps --strip-components 1
cd mumps

INCLUDES="${ASTER_PUBLIC}/metis-${METIS_VER}/include ${ASTER_PUBLIC}/parmetis-${PARMETIS_VER}/include ${ASTER_PUBLIC}/ptscotch-${SCOTCH_VER}/include" LIBPATH="${ASTER_PUBLIC}/metis-${METIS_VER}/lib ${ASTER_PUBLIC}/parmetis-${PARMETIS_VER}/lib ${ASTER_PUBLIC}/ptscotch-${SCOTCH_VER}/lib ${ASTER_PUBLIC}/scalapack-${SCALAPACK_VER}/lib" ./waf configure --prefix=${ASTER_PUBLIC}/mumps-${MUMPS_VER}_mpi --install-tests --enable-mpi

./waf build --jobs=1
./waf install --jobs=1

Possiamo ora scaricare ed installare il risolutore iterativo Petsc:

cd $DEV_DIR/aster-prerequisites
mkdir petsc

curl -Sl https://bitbucket.org/petsc/petsc/get/v${PETSC_VER}.tar.gz | tar --strip-components 1 -xzC $DEV_DIR/aster-prerequisites/petsc

cd petsc

./configure --COPTFLAGS="-O2" --CXXOPTFLAGS="-O2"  --FOPTFLAGS="-O2"  --with-debugging=0 --with-shared-libraries=1  --with-scalapack-dir=${ASTER_PUBLIC}/scalapack-${SCALAPACK_VER}  --with-mumps-dir=${ASTER_PUBLIC}/mumps-${MUMPS_VER}_mpi  --with-metis-dir=${ASTER_PUBLIC}/metis-${METIS_VER}  --with-ptscotch-dir=${ASTER_PUBLIC}/ptscotch-${SCOTCH_VER} --download-hypre --download-ml  --LIBS="-lgomp" --prefix=${ASTER_PUBLIC}/petsc-${PETSC_VER}

make all && make install

cp ./arch-linux2-c-opt/lib/libpetsc.so ${ASTER_PUBLIC}/petsc-${PETSC_VER}/lib/

Possiamo ora prepararci a compilare Code_Aster in parallelo:

cd $DEV_DIR/
source ${ASTER_ROOT}/${ASTER_VER}/share/aster/profile_mfront.sh
export METISDIR=${ASTER_PUBLIC}/metis-${METIS_VER}
export TFELHOME=${ASTER_PUBLIC}/tfel-${MFRONT_VER}
export GMSH_BIN_DIR=${ASTER_PUBLIC}/gmsh-3.0.6-Linux64/bin
export HOMARD_ASTER_ROOT_DIR=${ASTER_PUBLIC}/homard-11.10

mkdir aster

tar xf $ASTER_FULLSRC_DIR/SRC/aster-${ASTER_VER}.0.tgz -C aster --strip-components 1

cd aster

echo >> $DEV_DIR/aster/wafcfg/Ubuntu_mpi.py << 'EOF'
def configure(self):
    self.env.append_value('LIB_METIS', ('parmetis'))
    self.env.append_value('LIB_SCOTCH', ('ptscotch', 'ptscotcherr', 'ptscotcherrexit'))
EOF

INCLUDES="${ASTER_PUBLIC}/hdf5-${HDF5_VER}/include ${ASTER_PUBLIC}/med-${MED_VER}/include ${ASTER_PUBLIC}/metis-${METIS_VER}/include ${ASTER_PUBLIC}/parmetis-${PARMETIS_VER}/include ${ASTER_PUBLIC}/ptscotch-${SCOTCH_VER}/include ${ASTER_PUBLIC}/mumps-${MUMPS_VER}_mpi/include ${ASTER_PUBLIC}/petsc-${PETSC_VER}/include ${ASTER_PUBLIC}/tfel-${MFRONT_VER}/include" LIBPATH="${ASTER_PUBLIC}/hdf5-${HDF5_VER}/lib ${ASTER_PUBLIC}/med-${MED_VER}/lib ${ASTER_PUBLIC}/metis-${METIS_VER}/lib ${ASTER_PUBLIC}/parmetis-${PARMETIS_VER}/lib ${ASTER_PUBLIC}/ptscotch-${SCOTCH_VER}/lib ${ASTER_PUBLIC}/scalapack-${SCALAPACK_VER}/lib ${ASTER_PUBLIC}/mumps-${MUMPS_VER}_mpi/lib ${ASTER_PUBLIC}/petsc-${PETSC_VER}/lib ${ASTER_PUBLIC}/tfel-${MFRONT_VER}/lib" ./waf configure --use-config=Ubuntu_mpi --prefix=${ASTER_ROOT}/${ASTER_VER}_mpi --install-tests --enable-mpi

./waf build && ./waf install

Dobbiamo registrare la nuova versione di Code_Aster per renderla disponibile e la macchina attuale come nodo MPI, inoltre occorre aggiungere i binari di Code_Aster nel PATH (eventualmente aggiungerli a ~/.bashrc):

echo "vers : testing_mpi:${ASTER_ROOT}/${ASTER_VER}_mpi/share/aster" >> ${ASTER_ROOT}/etc/codeaster/aster

echo "vers : ${ASTER_VER}_mpi:${ASTER_ROOT}/${ASTER_VER}_mpi/share/aster" >> ${ASTER_ROOT}/etc/codeaster/aster

echo "localhost" > ${ASTER_ROOT}/etc/codeaster/mpi_hostfile
export PATH=$ASTER_ROOT/bin:$PATH
as_run --info

Occorre anche modificare un file di configurazione di Code_Aster, che è configurato per Mpich, mentre questa procedura usa OpenMPI:

echo >> asrun_patch.diff << EOF
230c230,231
< mpi_get_procid_cmd : echo $PMI_RANK
---
> #mpi_get_procid_cmd : echo $PMI_RANK
> mpi_get_procid_cmd : echo $OMPI_COMM_WORLD_RANK
EOF 

patch ${ASTER_ROOT}/etc/codeaster/asrun < asrun_patch.diff

Eseguiamo un semplice test per provare l’installazione:

./waf test -n sslp114a

Per eseguire una validazione più completa, possiamo usare gli strumenti di sviluppo:

source $HOME/dev/codeaster/devtools/etc/env.sh
ln -s $DEV_DIR/aster/ $DEV_DIR/aster/src

run_testcases --root=$DEV_DIR/aster --builddir=build --testlist=verification --resutest=/tmp/resutest --force-mpi  --vers=${ASTER_ROOT}/${ASTER_VER}_mpi/share/aster

Questa procedura non è perfetta: si tratta di un punto di partenza su cui lavorare per far passare più test possibili e viene fornita per mostrare le varie tappe necessarie più che come risultato finale. Sarebbe inoltre utile in futuro modificarla per utilizzare di più le librerie di sistema (come i pacchetti “libscalapack-mpi-dev libmetis-dev libparmetis-dev libscotch-dev libptscotch-dev”) invece di ricompilare tutti i prerequisiti da zero. Un altro punto di miglioramento consisterebbe nel ricompilare i prerequisiti direttamente, invece di appoggiarsi su quelli della versione sequenziale.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.