# Copyright 2013-2021 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 import *
class PpopenApplFdm(MakefilePackage):
"""
ppOpen-APPL/FDM is a application software for the FDM simulation of
seismic wave propagation in elastic media in 2D and 3D.
The 2D application is prepared for a single-CPU (sequential) calculation
and the 3D application use MPI and OpenMP for parallel computing.
"""
homepage = "http://ppopenhpc.cc.u-tokyo.ac.jp/ppopenhpc/"
git = "https://github.com/Post-Peta-Crest/ppOpenHPC.git"
version('master', branch='APPL/FDM')
# remove unused variable definition
patch('unused.patch')
# remove iargc external definition
# iargc is intrinsic in gfortran
patch('gfortran_iargc.patch', when='%gcc')
# Fixed a problem that 'iargc' was not declared in advance
patch('iargc_definition.patch', when='%fj')
depends_on('ppopen-math-vis', type='link')
depends_on('mpi')
parallel = False
def edit(self, spec, prefix):
makefile_in = FileFilter('Makefile.in')
makefile_in.filter('PREFIX += .*$', 'PREFIX = {0}'.format(prefix))
makefile_in.filter(
'LIBDIR = .*$',
'LIBDIR = {0}'.format(prefix)
)
makefile_in.filter(
'CC += .*$',
'CC = {0}'.format(spec['mpi'].mpicc)
)
makefile_in.filter('COPTFLAGS += .*$', 'COPTFLAGS = -O3')
makefile_in.filter(
'CXX += .*$',
'CXX = {0}'.format(spec['mpi'].mpicxx)
)
makefile_in.filter('CXXOPTFLAGS = .*$', 'CXXOPTFLAGS = -O3')
makefile_in.filter(
'FC += .*$',
'FC = {0}'.format(spec['mpi'].mpifc)
)
makefile_in.filter('FOPTFLAGS += .*$', 'FOPTFLAGS = -O3')
makefile_in.filter(
'F90 += .*$',
'F90 = {0}'.format(spec['mpi'].mpifc)
)
makefile_in.filter('F90OPTFLAGS += .*$', 'F90OPTFLAGS = -O3')
makefile_opt = FileFilter(join_path(
'src', 'seismic_2D', 'makefile.option')
)
makefile_opt.filter('FC = .*$', 'FC = {0}'.format(spack_fc))
makefile_opt.filter('FFLAGS = .*$', 'FFLAGS = -O3')
makefile = FileFilter(join_path(
'src', 'seismic_3D', '1.ppohFDM-ppohVIS', 'Makefile')
)
makefile.filter('LIBS += .*$', 'LIBS = ')
makefile.filter(
'FLDFLAGS += .*$',
'FLDFLAGS = ' + spec['ppopen-math-vis'].libs.ld_flags
)
makefile_opt = FileFilter(join_path(
'src', 'seismic_3D', '3.parallel', 'Makefile.option')
)
makefile_opt.filter('FC = .*$', 'FC = {0}'.format(spec['mpi'].mpifc))
makefile_opt.filter(
'FFLAGS = .*$',
'FFLAGS = -O3 {0}'.format(self.compiler.openmp_flag)
)
copy(
join_path('examples', 'seismic_3D-example', 'm_param.f90'),
join_path('src', 'seismic_3D', '1.ppohFDM-ppohVIS')
)
copy(
join_path('examples', 'seismic_3D-example', 'm_param.f90'),
join_path('src', 'seismic_3D', '3.parallel')
)
for makefile in find('tools', 'makefile', recursive=True):
fflags = ['-O3', '-I.']
m = FileFilter(makefile)
m.filter('^FC =.*$', 'FC = {0}'.format(spack_fc))
m.filter(
'^FFLAGS =.*$',
'FFLAGS = {0}'.format(' '.join(fflags))
)
def build(self, spec, prefix):
make('seism2d', 'seism3d-ppohVIS', 'seism3d-parallel')
for d in ['seismic_2D-tools', 'seismic_3D-tools']:
with working_dir(join_path('tools', d)):
make('all')
def install(self, spec, prefix):
commands = [
join_path('src', 'seismic_2D', 'seism2d_psv'),
join_path('src', 'seismic_3D', '3.parallel', 'seism3d3n'),
join_path('src', 'seismic_3D', '1.ppohFDM-ppohVIS', 'seism3d3n'),
join_path('tools', 'seismic_2D-tools', 'pmxy2d'),
join_path('tools', 'seismic_2D-tools', 'rwav2d'),
join_path('tools', 'seismic_3D-tools', 'catsnap'),
join_path('tools', 'seismic_3D-tools', 'catwav'),
join_path('tools', 'seismic_3D-tools', 'ppmxy3d3'),
join_path('tools', 'seismic_3D-tools', 'rwav3d'),
]
mkdir(prefix.bin)
for command in commands:
copy(command, prefix.bin)
install_tree('examples', prefix.examples)
install_tree('doc', prefix.doc)
install_tree('src', prefix.src)
copy('Makefile.in', prefix)
clean_dir = [
join_path(prefix.src, 'seismic_2D'),
join_path(prefix.src, 'seismic_3D', '1.ppohFDM-ppohVIS'),
join_path(prefix.src, 'seismic_3D', '3.parallel'),
]
for d in clean_dir:
with working_dir(d):
make('clean')
force_remove(join_path(prefix, 'Makefile.in'))