text: # Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
  # Spack Project Developers. See the top-level COPYRIGHT file for details.
  #
  # SPDX-License-Identifier: (Apache-2.0 OR MIT)
  
  from spack.package import *
  
  
  class Comd(MakefilePackage):
      """CoMD is a reference implementation of classical molecular dynamics
      algorithms and workloads as used in materials science. It is created and
      maintained by The Exascale Co-Design Center for Materials in Extreme
      Environments (ExMatEx). The code is intended to serve as a vehicle for
      co-design by allowing others to extend and/or reimplement it as needed to
      test performance of new architectures, programming models, etc. New
      versions of CoMD will be released to incorporate the lessons learned from
      the co-design process."""
  
      tags = ['proxy-app']
  
      homepage = "http://www.exmatex.org/comd.html"
      url      = "https://github.com/ECP-copa/CoMD/archive/v1.1.tar.gz"
      git      = "https://github.com/ECP-copa/CoMD.git"
  
      version('develop', branch='master')
      version('1.1', sha256='4e85f86f043681a1ef72940fc24a4c71356a36afa45446f7cfe776abad6aa252')
  
      variant('mpi', default=True, description='Build with MPI support')
      variant('openmp', default=False, description='Build with OpenMP support')
      variant('precision', default=True, description='Toggle Precesion Options')
      variant('graphs', default=False, description='Enable graph visuals')
  
      depends_on('mpi', when='+mpi')
      depends_on('graphviz', when='+graphs')
  
      conflicts('+openmp', when='+mpi')
  
      def edit(self, spec, prefix):
          with working_dir('src-mpi') or working_dir('src-openmp'):
              copy('Makefile.vanilla', 'Makefile')
  
      @property
      def build_targets(self):
          targets = []
          cflags = ' -std=c99 '
          optflags = ' -g -O5 '
          clib = ' -lm '
          comd_variant = 'CoMD'
          cc = spack_cc
  
          if '+openmp' in self.spec:
              targets.append('--directory=src-openmp')
              comd_variant += '-openmp'
              cflags += ' -fopenmp '
              if '+mpi' in self.spec:
                  comd_variant += '-mpi'
                  targets.append('CC = {0}'.format(self.spec['mpi'].mpicc))
              else:
                  targets.append('CC = {0}'.format('spack_cc'))
  
          else:
              targets.append('--directory=src-mpi')
              if '~mpi' in self.spec:
                  comd_variant += '-serial'
                  targets.append('CC = {0}'.format(cc))
              else:
                  comd_variant += '-mpi'
                  targets.append('CC = {0}'.format(self.spec['mpi'].mpicc))
          if '+mpi' in self.spec:
              cflags += '-DDO_MPI'
              targets.append(
                  'INCLUDES = {0}'.format(self.spec['mpi'].prefix.include))
  
          if '+precision' in self.spec:
              cflags += ' -DDOUBLE '
          else:
              cflags += ' -DSINGLE '
  
          targets.append('CoMD_VARIANT = {0}'.format(comd_variant))
          targets.append('CFLAGS = {0}'.format(cflags))
          targets.append('OPTFLAGS = {0}'.format(optflags))
          targets.append('C_LIB = {0}'.format(clib))
  
          return targets
  
      def install(self, spec, prefix):
          install_tree('bin', prefix.bin)
          install_tree('examples', prefix.examples)
          install_tree('pots', prefix.pots)
          mkdirp(prefix.doc)
          install('README.md', prefix.doc)
          install('LICENSE.md', prefix.doc)
  