Changes between Initial Version and Version 1 of eis


Ignore:
Timestamp:
10/26/22 01:44:46 (2 years ago)
Author:
jdquinn
Comment:

Initial page creation

Legend:

Unmodified
Added
Removed
Modified
  • eis

    v1 v1  
     1= Installation on SMCE head node (external packages, binaries only)
     2- Added the following to `~/.bashrc`,
     3{{{
     4# Spack Modules
     5source /shared/spack/share/spack/setup-env.sh
     6module load intelmpi
     7#module load python-3.8.12-gcc-9.4.0-uyaszn4
     8module load subversion-1.14.0-gcc-11.1.0-evgneyf
     9
     10###################
     11### Environment ###
     12###################
     13export CC=/opt/intel/mpi/2021.4.0/bin/mpicc
     14export GCC=/opt/intel/mpi/2021.4.0/bin/mpicxx
     15export FC=/opt/intel/mpi/2021.4.0/bin/mpifc
     16
     17export MPI_HOME=/opt/intel/mpi/2021.4.0
     18
     19######################
     20### Path Variables ###
     21######################
     22
     23# ISSM
     24export ISSM_DIR="/efs/issm/binaries/repos/trunk-jpl-working"
     25export ISSM_EXT_DIR="/efs/issm/binaries/ext"
     26}}}
     27
     28- Checked out a copy of the ISSM development repository with,
     29{{{
     30mkdir -p /efs/issm/binaries/repos
     31svn co https://issm.ess.uci.edu/svn/issm/issm/trunk-jpl $ISSM_DIR
     32}}}
     33
     34- Copied `$ISSM_DIR/jenkins/ross-debian_linux-full` to `$ISSM_DIR/jenkins/eis-smce-binaries`
     35- Modified `$ISSM_DIR/jenkins/eis-smce-binaries` with,
     36{{{
     37#--------------------#
     38# ISSM Configuration #
     39#--------------------#
     40
     41ISSM_CONFIG='\
     42        --prefix="${ISSM_DIR}" \
     43        --disable-static \
     44        --with-wrappers=no \
     45        --enable-development \
     46        --enable-debugging \
     47        --with-numthreads=48 \
     48        --with-fortran-lib="-L/usr/lib/gcc/x86_64-linux-gnu/9 -lgfortran" \
     49        --with-mpi-include="/opt/intel/mpi/2021.4.0/include" \
     50        --with-mpi-libflags="-L/opt/intel/mpi/2021.4.0/lib -lmpi -lmpicxx -lmpifort" \
     51        --with-blas-lapack-dir="${ISSM_EXT_DIR}/petsc/install" \
     52        --with-metis-dir="${ISSM_EXT_DIR}/petsc/install" \
     53        --with-parmetis-dir="${ISSM_EXT_DIR}/petsc/install" \
     54        --with-scalapack-dir="${ISSM_EXT_DIR}/petsc/install" \
     55        --with-mumps-dir="${ISSM_EXT_DIR}/petsc/install" \
     56        --with-hdf5-dir="${ISSM_EXT_DIR}/petsc/install" \
     57        --with-petsc-dir="${ISSM_EXT_DIR}/petsc/install" \
     58        --with-gsl-dir="${ISSM_EXT_DIR}/gsl/install" \
     59        --with-boost-dir="${ISSM_EXT_DIR}/boost/install" \
     60        --with-dakota-dir="${ISSM_EXT_DIR}/dakota/install" \
     61        --with-proj-dir="${ISSM_EXT_DIR}/proj/install" \
     62        --with-triangle-dir="${ISSM_EXT_DIR}/triangle/install" \
     63        --with-chaco-dir="${ISSM_EXT_DIR}/chaco/install" \
     64        --with-m1qn3-dir="${ISSM_EXT_DIR}/m1qn3/install" \
     65        --with-semic-dir="${ISSM_EXT_DIR}/semic/install"
     66'
     67
     68#-------------------#
     69# External Packages #
     70#-------------------#
     71
     72EXTERNALPACKAGES="
     73        autotools       install-linux.sh
     74        cmake           install.sh
     75        petsc           install-3.12-linux.sh
     76        gsl                     install.sh
     77        boost           install-1.7-linux.sh
     78        dakota          install-6.2-linux.sh
     79        curl            install-7-linux.sh
     80        netcdf          install-4.7-parallel.sh
     81        sqlite          install.sh
     82        proj            install-6.sh
     83        gdal            install-3.sh
     84        gshhg           install.sh
     85        gmt                     install-6-linux.sh
     86        gmsh            install-4-linux.sh
     87        triangle        install-linux.sh
     88        chaco           install.sh
     89        m1qn3           install.sh
     90        semic           install.sh
     91"
     92}}}
     93- Committed `$ISSM_DIR/jenkins/eis-smce-head-node-binaries` to repo
     94- Installed each of the external packages in `$ISSM_DIR/jenkins/eis-daskhub-python-modules`, after changing each of the installation paths with,
     95{{{
     96PREFIX=${ISSM_EXT_DIR}/<pkg>/install
     97}}}
     98  and making the following modifications,
     99  - Modified `$ISSM_DIR/externalpackages/petsc/install-3.12-linux.sh` by,
     100    - removing,
     101    {{{
     102--download-mpich=1
     103    }}}
     104    - adding,
     105    {{{
     106    --with-mpi-dir=/opt/intel/mpi/2021.4.0
     107    --known-mpi-shared-libraries=1
     108    }}}
     109  - `$ISSM_DIR/externalpackages/dakota/install-6.2-linux.sh` requires Python 2 to build, so either (1) cannot load Spack module for Python 3, or, (2) have to figure out how to override this in the install script (perhaps with `alias python=/usr/bin/python`)
     110  - Modified `$ISSM_DIR/externalpackages/gdal/install-3.sh` with,
     111  {{{
     112--with-curl="${CURL_ROOT}/bin/curl-config"
     113  }}}
     114
     115= Installation on MATLAB node (MATLAB modules)
     116TO BE ADDED AFTER FURTHER INSTALLATION AND DEBUGGING
     117
     118= Installation on Daskhub (Python modules)
     119== NOTE: Binaries are also compiled as we do not have a good way of disabling them. We could ignore them, remove them, or let users know that they're available for smaller test runs.
     120- Added the following to ~/.bash_profile,
     121{{{
     122# File system modifications that are not currently part of image
     123#
     124
     125# Create a link to gl.h so that the CMake configuration can find it.
     126# Note that we need to add it here because it does not persist.
     127if [ ! -f /srv/conda/envs/notebook/include/GL/gl.h ]; then
     128        ln -s /srv/conda/envs/notebook/include/gstreamer-1.0/gst/gl/gl.h  /srv/conda/envs/notebook/include/GL/gl.h
     129fi
     130
     131# Set permissions on private key
     132chmod 400 ~/.ssh/eis-nasa-smce-head-node
     133
     134
     135## Environment
     136#
     137export OPENSSL_ROOT_DIR="/srv/conda/envs/notebook"
     138
     139
     140## Path Variables
     141#
     142
     143# ISSM
     144export ISSM_DIR="/efs/issm/python-modules/repos/trunk-jpl-working"
     145export ISSM_EXT_DIR="/efs/issm/python-modules/ext"
     146
     147
     148## Aliases
     149#
     150alias issm-python-dev-env="source "\${ISSM_DIR}"/etc/environment.sh; export PYTHONPATH="\${ISSM_DIR}"/src/m/dev; export PYTHONSTARTUP="\${PYTHONPATH}"/devpath.py; export PYTHONUNBUFFERED=1; cd "\${ISSM_DIR}"/test/NightlyRun; LD_PRELOAD=/srv/conda/envs/notebook/lib/libpython3.9.so.1.0:"\${ISSM_EXT_DIR}"/petsc/install/lib/libmpifort.so.12 python" # Then run ./runme.py <options>
     151}}}
     152
     153- Checked out a copy of the ISSM development repository with,
     154{{{
     155mkdir -p /efs/issm/python-modules/repos
     156svn co https://issm.ess.uci.edu/svn/issm/issm/trunk-jpl $ISSM_DIR
     157}}}
     158
     159- Copied `$ISSM_DIR/jenkins/ross-debian_linux-full` to `$ISSM_DIR/jenkins/eis-daskhub-python-modules`
     160- Modified `$ISSM_DIR/jenkins/eis-daskhub-python-modules` with,
     161{{{
     162#--------------------#
     163# ISSM Configuration #
     164#--------------------#
     165
     166ISSM_CONFIG='\
     167        --prefix="${ISSM_DIR}" \
     168        --disable-static \
     169        --enable-development \
     170        --enable-debugging \
     171        --with-numthreads=4 \
     172        --with-python-dir="/srv/conda/envs/notebook" \
     173        --with-python-version="3.9" \
     174        --with-python-numpy-dir="/srv/conda/envs/notebook/lib/python3.9/site-packages/numpy/core/include/numpy" \
     175        --with-fortran-lib="-L/usr/lib/x86_64-linux-gnu -lgfortran" \
     176        --with-mpi-include="${ISSM_EXT_DIR}/petsc/install/include" \
     177        --with-mpi-libflags="-L${ISSM_EXT_DIR}/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
     178        --with-blas-lapack-dir="${ISSM_EXT_DIR}/petsc/install" \
     179        --with-metis-dir="${ISSM_EXT_DIR}/petsc/install" \
     180        --with-parmetis-dir="${ISSM_EXT_DIR}/petsc/install" \
     181        --with-scalapack-dir="${ISSM_EXT_DIR}/petsc/install" \
     182        --with-mumps-dir="${ISSM_EXT_DIR}/petsc/install" \
     183        --with-hdf5-dir="${ISSM_EXT_DIR}/petsc/install" \
     184        --with-petsc-dir="${ISSM_EXT_DIR}/petsc/install" \
     185        --with-gsl-dir="${ISSM_EXT_DIR}/gsl/install" \
     186        --with-boost-dir="${ISSM_EXT_DIR}/boost/install" \
     187        --with-dakota-dir="${ISSM_EXT_DIR}/dakota/install" \
     188        --with-proj-dir="${ISSM_EXT_DIR}/proj/install" \
     189        --with-triangle-dir="${ISSM_EXT_DIR}/triangle/install" \
     190        --with-chaco-dir="${ISSM_EXT_DIR}/chaco/install" \
     191        --with-m1qn3-dir="${ISSM_EXT_DIR}/m1qn3/install" \
     192        --with-semic-dir="${ISSM_EXT_DIR}/semic/install" \
     193'
     194
     195#-------------------#
     196# External Packages #
     197#-------------------#
     198
     199EXTERNALPACKAGES="
     200        autotools       install-linux.sh
     201        cmake           install.sh
     202        petsc           install-3.16-linux.sh
     203        gsl                     install.sh
     204        boost           install-1.7-linux.sh
     205        dakota          install-6.2-linux.sh
     206        curl            install-7-linux.sh
     207        netcdf          install-4.7-parallel.sh
     208        sqlite          install.sh
     209        proj            install-6.sh
     210        gdal            install-3-python.sh
     211        gshhg           install.sh
     212        gmt                     install-6-linux.sh
     213        gmsh            install-4-linux.sh
     214        triangle        install-linux.sh
     215        chaco           install.sh
     216        m1qn3           install.sh
     217        semic           install.sh
     218"
     219}}}
     220
     221- Committed `$ISSM_DIR/jenkins/eis-daskhub-python-modules` to repo
     222- Before installing any of the external packages, needed to disable the Conda environment with `conda deactivate`
     223- Installed each of the external packages in `$ISSM_DIR/jenkins/eis-daskhub-python-modules`, after changing each of the installation paths with,
     224{{{
     225PREFIX=${ISSM_EXT_DIR}/<pkg>/install
     226}}}
     227  and making the following modifications
     228  - Needed to remove,
     229{{{
     230--FFLAGS="-fallow-argument-mismatch"
     231}}}
     232    from `$ISSM_DIR/externalpackages/petsc/install-3.16-petsc.sh`
     233  - Needed to modify `$ISSM_DIR/externalpackages/gdal/install-3-python.sh` with,
     234{{{
     235export CPATH="${CPATH}:/srv/conda/envs/notebook/include"
     236export LDFLAGS="-L${NETCDF_ROOT}/lib -lnetcdf"
     237export LIBRARY_PATH="${LIBRARY_PATH}:/srv/conda/envs/notebook/lib"
     238export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/srv/conda/envs/notebook/lib"
     239}}}
     240    and,
     241{{{
     242--with-sqlite3="${SQLITE_ROOT}" \
     243--with-libjson-c="/srv/conda/envs/notebook"
     244}}}
     245
     246  - Needed to modify `$ISSM_DIR/externalpackages/gmt/install-6-linux.sh` with,
     247{{{
     248export CC=mpicc
     249export CPATH="${CPATH}:/srv/conda/envs/notebook/include"
     250export LIBRARY_PATH="${LIBRARY_PATH}:/srv/conda/envs/notebook/lib"
     251export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/srv/conda/envs/notebook/lib"
     252}}}
     253
     254- With Conda environment still disabled, ran,
     255{{{
     256alias envsubst="/srv/conda/envs/notebook/bin/envsubst"
     257jenkins/jenkins.sh jenkins/eis-daskhub-python-modules
     258}}}
     259
     260- Ran,
     261{{{
     262mkdir ~/.ssh
     263ssh-keygen -f ~/.ssh/eis-nasa-smce
     264}}}
     265  then gave contents of public key to SMCE team to add to SMCE head node
     266- Ran,
     267{{{
     268chmod 400 ~/.ssh/eis-nasa-smce
     269}}}
     270
     271- Created `$ISSM_DIR/src/m/classes/clusters/eis_nasa_smce.py` with contents,
     272{{{
     273import os
     274import shutil
     275import subprocess
     276
     277try:
     278    from eis_nasa_smce_settings import eis_nasa_smce_settings
     279except ImportError:
     280    print('You need eis_nasa_smce_settings.py to proceed, check presence and sys.path')
     281from fielddisplay import fielddisplay
     282from helpers import *
     283from IssmConfig import IssmConfig
     284from issmssh import issmssh
     285from MatlabFuncs import *
     286from pairoptions import pairoptions
     287
     288class eis_nasa_smce(object):
     289    """EIS_NASA_SMCE cluster class definition
     290
     291    Usage:
     292        cluster = eis_nasa_smce()
     293        cluster = eis_nasa_smce('np', 3)
     294        cluster = eis_nasa_scme('np', 3, 'login', 'username')
     295    """
     296
     297    def __init__(self, *args):  # {{{
     298        self.name = '52.10.233.96'
     299        self.login = 'jdquinn1'
     300        self.idfile = '~/.ssh/eis-nasa-smce'
     301        self.modules = ['intelmpi']
     302        self.numnodes = 4
     303        self.cpuspernode = 1
     304        self.port = 0
     305        self.time = 12 * 60 * 60
     306        self.processor = 'skylake'
     307        self.partition = 'sealevel-c5xl-spot'
     308        self.srcpath = '/efs/issm-new/binaries/repos/trunk-jpl-working'
     309        self.extpkgpath = '/efs/issm-new/binaries/ext'
     310        self.codepath = '/efs/issm-new/binaries/repos/trunk-jpl-working/bin'
     311        self.executionpath = '~/issm-exec'
     312        self.interactive = 0
     313        self.numstreams = 1
     314        self.hyperthreading = 0
     315        self.email = ''
     316
     317        # Use provided options to change fields
     318        options = pairoptions(*args)
     319
     320        # Initialize cluster using user settings if provided
     321        try:
     322            self = eis_nasa_smce_settings(self)
     323        except NameError:
     324            print('eis_nasa_smce_settings.py not found, using default settings')
     325
     326        # OK get other fields
     327        self = options.AssignObjectFields(self)
     328    # }}}
     329
     330    def __repr__(self):  # {{{
     331        # Display the object
     332        s = 'class eis_nasa_smce object\n'
     333        s += '    name: {}\n'.format(self.name)
     334        s += '    login: {}\n'.format(self.login)
     335        s += '    idfile: {}\n'.format(self.idfile)
     336        s += '    modules: {}\n'.format(strjoin(self.modules, ', '))
     337        s += '    numnodes: {}\n'.format(self.numnodes)
     338        s += '    cpuspernode: {}\n'.format(self.cpuspernode)
     339        s += '    np: {}\n'.format(self.nprocs())
     340        s += '    port: {}\n'.format(self.port)
     341        s += '    time: {}\n'.format(self.time)
     342        s += '    processor: {}\n'.format(self.processor)
     343        s += '    partition: {}\n'.format(self.partition)
     344        s += '    srcpath: {}\n'.format(self.srcpath)
     345        s += '    extpkgpath: {}\n'.format(self.extpkgpath)
     346        s += '    codepath: {}\n'.format(self.codepath)
     347        s += '    executionpath: {}\n'.format(self.executionpath)
     348        s += '    interactive: {}\n'.format(self.interactive)
     349        s += '    numstreams: {}\n'.format(self.numstreams)
     350        s += '    hyperthreading: {}\n'.format(self.hyperthreading)
     351        return s
     352    # }}}
     353
     354    def nprocs(self):  # {{{
     355        return self.numnodes * self.cpuspernode
     356    # }}}
     357
     358    def checkconsistency(self, md, solution, analyses):  # {{{
     359        # Now, check cluster.cpuspernode according to processor type
     360        if self.processor == 'skylake':
     361            if self.cpuspernode > 14 or self.cpuspernode < 1:
     362                md = md.checkmessage('cpuspernode should be between 1 and 14 for \'skyw\' processors in hyperthreading mode')
     363        else:
     364            md = md.checkmessage('unknown processor type, should be \'skylake\'')
     365
     366        # Miscellaneous
     367        if not self.login:
     368            md = md.checkmessage('login empty')
     369        if self.port:
     370            md = md.checkmessage('port must be set to 0 as we do not have an SSH tunnel')
     371        if not self.codepath:
     372            md = md.checkmessage('codepath empty')
     373        if not self.executionpath:
     374            md = md.checkmessage('executionpath empty')
     375
     376        return self
     377    # }}}
     378
     379    def BuildQueueScript(self, dirname, modelname, solution, io_gather, isvalgrind, isgprof, isdakota, isoceancoupling):  # {{{
     380        if isgprof:
     381            print('gprof not supported by cluster, ignoring...')
     382
     383        issmexec = 'issm.exe'
     384        mpiexec = 'mpiexec' # Set to alternative mpiexec if desired
     385
     386        if isdakota:
     387            version = IssmConfig('_DAKOTA_VERSION_')[0:2]
     388            version = float(str(version[0]))
     389            if version >= 6:
     390                issmexec = 'issm_dakota.exe'
     391        if isoceancoupling:
     392            issmexec = 'issm_ocean.exe'
     393
     394        # Write queuing script
     395        fid = open(modelname + '.queue', 'w')
     396
     397        fid.write('#!/bin/bash\n')
     398        fid.write('#SBATCH --partition={} \n'.format(self.partition))
     399        fid.write('#SBATCH -J {} \n'.format(modelname))
     400        fid.write('#SBATCH -o {}.outlog \n'.format(modelname))
     401        fid.write('#SBATCH -e {}.errlog \n'.format(modelname))
     402        fid.write('#SBATCH --nodes={} \n'.format(self.numnodes))
     403        fid.write('#SBATCH --ntasks-per-node={} \n'.format(self.cpuspernode))
     404        fid.write('#SBATCH --cpus-per-task={} \n'.format(self.numstreams))
     405        fid.write('#SBATCH -t {:02d}:{:02d}:00 \n'.format(int(floor(self.time / 3600)), int(floor(self.time % 3600) / 60)))
     406        if (self.email.find('@')>-1):
     407            fid.write('#SBATCH --mail-user={} \n'.format(self.email))
     408            fid.write('#SBATCH --mail-type=BEGIN,END,FAIL \n\n')
     409        fid.write('source /etc/profile\n')
     410        fid.write('source /shared/spack/share/spack/setup-env.sh\n')
     411        for i in range(len(self.modules)):
     412             fid.write('module load {} &> /dev/null\n'.format(self.modules[i]))
     413        fid.write('export MPI_GROUP_MAX=64\n\n')
     414        fid.write('export MPI_UNBUFFERED_STDIO=true\n\n')
     415        fid.write('export PATH="$PATH:/opt/slurm/bin"\n')
     416        fid.write('export PATH="$PATH:."\n\n')
     417        fid.write('export ISSM_DIR="{}"\n'.format(self.srcpath))
     418        fid.write('export ISSM_EXT_DIR="{}"\n'.format(self.extpkgpath))
     419        fid.write('source $ISSM_DIR/etc/environment.sh\n')
     420        fid.write('cd {}/{}/\n\n'.format(self.executionpath, dirname))
     421        fid.write('{} -n {} {}/{} {} {}/{} {}\n'.format(mpiexec, self.nprocs(), self.codepath, issmexec, solution, self.executionpath, dirname, modelname))
     422
     423        if not io_gather: # concatenate the output files
     424            fid.write('cat {}.outbin.* > {}.outbin'.format(modelname, modelname))
     425        fid.close()
     426
     427        # In interactive mode, create a run file, and errlog and outlog file
     428        if self.interactive:
     429            fid = open(modelname + '.run', 'w')
     430            if not isvalgrind:
     431                fid.write('{} -np {} {}/{} {} {}/{} {}\n'.format(mpiexec, self.nprocs(), self.codepath, issmexec, solution, self.executionpath, dirname, modelname))
     432            else:
     433                fid.write('{} -np {} valgrind --leak-check=full {}/{} {} {}/{} {}\n'.format(mpiexec, self.nprocs(), self.codepath, issmexec, solution, self.executionpath, dirname, modelname))
     434            if not io_gather: # concatenate the output files
     435                fid.write('cat {}.outbin.* > {}.outbin'.format(modelname, modelname))
     436            fid.close()
     437            fid = open(modelname + '.errlog', 'w') # TODO: Change this to system call (touch <file>)?
     438            fid.close()
     439            fid = open(modelname + '.outlog', 'w') # TODO: Change this to system call (touch <file>)?
     440            fid.close()
     441    # }}}
     442
     443    def UploadQueueJob(self, modelname, dirname, filelist):  # {{{
     444        # Compress the files into one zip
     445        compressstring = 'tar -zcf {}.tar.gz'.format(dirname)
     446        for file in filelist:
     447            compressstring += ' {}'.format(file)
     448        if self.interactive:
     449            compressstring += ' {}.run {}.errlog {}.outlog'.format(modelname, modelname, modelname)
     450        subprocess.call(compressstring, shell=True)
     451
     452        print('uploading input file and queueing script')
     453        if self.interactive:
     454            directory = '{}/Interactive{}'.format(self.executionpath, self.interactive)
     455        else:
     456            directory = self.executionpath
     457
     458        # NOTE: Replacement for issmscpout(self.name, directory, self.login, self.port, ['{}.tar.gz'.format(dirname)])
     459        copystring = 'cp {}.tar.gz /efs/issm/tmp'.format(dirname)
     460        subprocess.call(copystring, shell=True)
     461    # }}}
     462
     463    def LaunchQueueJob(self, modelname, dirname, filelist, restart, batch):  # {{{
     464        if self.interactive:
     465            if not isempty(restart):
     466                launchcommand = 'cd {}/Interactive{}'.format(self.executionpath, self.interactive)
     467            else:
     468                launchcommand = 'cd {}/Interactive{} && tar -zxf {}.tar.gz'.format(self.executionpath, self.interactive, dirname)
     469        else:
     470            if not isempty(restart):
     471                launchcommand = 'cd {} && cd {} && sbatch {}.queue'.format(self.executionpath, dirname, modelname)
     472            else:
     473                launchcommand = 'cd {} && rm -rf {} && mkdir {} && cd {} && cp /efs/issm/tmp/{}.tar.gz . && tar -zxf {}.tar.gz && /opt/slurm/bin/sbatch {}.queue'.format(self.executionpath, dirname, dirname, dirname, dirname, dirname, modelname)
     474
     475        print('launching solution sequence on remote cluster')
     476
     477        # NOTE: Replacement for issmssh(self.name, self.login, self.port, launchcommand)
     478        subprocess.call('ssh -l {} -i {} {} "{}"'.format(self.login, self.idfile, self.name, launchcommand), shell=True)
     479    # }}}
     480
     481    def Download(self, dirname, filelist):  # {{{
     482        # Copy files from cluster to current directory
     483   
     484        # NOTE: Replacement for issmscpin(self.name, self.login, self.port, directory, filelist)
     485        directory = '{}/{}/'.format(self.executionpath, dirname)
     486        fileliststr = '{' + ','.join([str(x) for x in filelist]) + '}'
     487        downloadcommand = 'scp -i {} {}@{}:{} {}/.'.format(self.idfile, self.login, self.name, os.path.join(directory, fileliststr), os.getcwd())
     488        subprocess.call(downloadcommand, shell=True)
     489    # }}}
     490}}}
     491
     492- Committed `$ISSM_DIR/src/m/classes/clusters/eis_nasa_smce_head_node.py` to repo
     493
     494NOTE:
     495- It is important that the directory indicated by `self.executionpath` exists on SMCE head node before launch
     496- Either in `$ISSM_DIR/src/m/classes/clusters/eis_nasa_smce_head_node.py` or runme
     497  - `cluster.login` should be changed to your username
     498  - `cluster.executionpath` should be changed to desired execution path on SMCE head node
     499  - `cluster.partition` should be changed to desired AWS ECS instance type (discuss with SMCE team before changing)
     500
     501- Created `$ISSM_DIR/test/NightlyRun/test101eisnasasmce.py` with contents,
     502{{{
     503#Test Name: SquareShelfConstrainedStressSSA2d
     504from model import *
     505from socket import gethostname
     506from triangle import triangle
     507from setmask import setmask
     508from parameterize import parameterize
     509from setflowequation import setflowequation
     510from solve import solve
     511from massfluxatgate import massfluxatgate
     512from generic import generic
     513from eis_nasa_smce import eis_nasa_smce
     514
     515md = triangle(model(), '../Exp/Square.exp', 50000)
     516md = setmask(md, 'all', '')
     517md = parameterize(md, '../Par/SquareShelfConstrained.py')
     518md = setflowequation(md, 'SSA', 'all')
     519md.cluster = generic('name', gethostname(), 'np', 2)
     520
     521if True:
     522    cluster = eis_nasa_smce()
     523    cluster.partition = 'sealevel-c5xl-spot'
     524    md.cluster = cluster
     525
     526#outputs
     527md.stressbalance.requested_outputs = ['default', 'DeviatoricStressxx', 'DeviatoricStressyy', 'DeviatoricStressxy', 'MassFlux1', 'MassFlux2', 'MassFlux3', 'MassFlux4', 'MassFlux5', 'MassFlux6']
     528md.outputdefinition.definitions = [massfluxatgate('name', 'MassFlux1', 'profilename', '../Exp/MassFlux1.exp', 'definitionstring', 'Outputdefinition1'),
     529                                   massfluxatgate('name', 'MassFlux2', 'profilename', '../Exp/MassFlux2.exp', 'definitionstring', 'Outputdefinition2'),
     530                                   massfluxatgate('name', 'MassFlux3', 'profilename', '../Exp/MassFlux3.exp', 'definitionstring', 'Outputdefinition3'),
     531                                   massfluxatgate('name', 'MassFlux4', 'profilename', '../Exp/MassFlux4.exp', 'definitionstring', 'Outputdefinition4'),
     532                                   massfluxatgate('name', 'MassFlux5', 'profilename', '../Exp/MassFlux5.exp', 'definitionstring', 'Outputdefinition5'),
     533                                   massfluxatgate('name', 'MassFlux6', 'profilename', '../Exp/MassFlux6.exp', 'definitionstring', 'Outputdefinition6')]
     534
     535md = solve(md, 'Stressbalance')
     536
     537#Fields and tolerances to track changes
     538field_names = ['Vx', 'Vy', 'Vel', 'Pressure',
     539               'DeviatoricStressxx', 'DeviatoricStressyy', 'DeviatoricStressxy',
     540               'MassFlux1', 'MassFlux2', 'MassFlux3', 'MassFlux4', 'MassFlux5', 'MassFlux6']
     541field_tolerances = [3e-13, 1e-13, 1e-13, 1e-13,
     542                    2e-13, 1e-13, 2e-13,
     543                    1e-13, 1e-13, 1e-13,
     544                    1e-13, 1e-13, 1e-13]
     545field_values = [md.results.StressbalanceSolution.Vx,
     546                md.results.StressbalanceSolution.Vy,
     547                md.results.StressbalanceSolution.Vel,
     548                md.results.StressbalanceSolution.Pressure,
     549                md.results.StressbalanceSolution.DeviatoricStressxx,
     550                md.results.StressbalanceSolution.DeviatoricStressyy,
     551                md.results.StressbalanceSolution.DeviatoricStressxy,
     552                md.results.StressbalanceSolution.MassFlux1,
     553                md.results.StressbalanceSolution.MassFlux2,
     554                md.results.StressbalanceSolution.MassFlux3,
     555                md.results.StressbalanceSolution.MassFlux4,
     556                md.results.StressbalanceSolution.MassFlux5,
     557                md.results.StressbalanceSolution.MassFlux6]
     558}}}
     559
     560- Committed `$ISSM_DIR/test/NightlyRun/test101eisnasasmce.py` to repo
     561
     562= TODO
     563- When okayed by Denis, remove,
     564  - `/efs/issm`
     565  - `/issm/ext`
     566  - `/issm/repos`
     567  - `/shared/issm`
     568 
     569  then, move `/efs/issm-new` to `/efs/issm`
     570- Correct link to `libpython` on Daskhub (should not have to `LD_PRELOAD libpython3.9.so.1.0`)
     571- Correct link to `libproj` on Daskhub (see `ldd $ISSM_DIR/lib/IssmConfig_python.so`; there is a link to `libproj.so.25`)
     572- After SMCE team has created `issm` group, modify `$ISSM_DIR/src/m/classes/clusters/eis_nasa_smce.py::LaunchQueueJob` so that tarball is moved rather than copied (look at `/efs/issm/issm/trunk-jpl-denis/src/m/classes/clusters/generic.py` for examples of `cp` as opposed to `scp`)
     573
     574== For SMCE team
     575- Run,
     576{{{
     577ln -s /srv/conda/envs/notebook/include/gstreamer-1.0/gst/gl/gl.h  /srv/conda/envs/notebook/include/GL/gl.h
     578}}}
     579  on Daskhub and bake resulting symbolic link onto base image
     580- Create group `issm` on SMCE head node
     581- Change group ownership of `/efs/issm/tmp` to `issm` group
     582- Review `$ISSM_DIR/src/m/classes/clusters/eis_nasa_smce.py` on Daskhub, in particular
     583  - `self.processor`
     584  - `self.interactive`
     585  - `self.numstreams`
     586  - `self.hyperthreading`
     587- Can we support for `self.email`?