Skip to content
Snippets Groups Projects
Commit 4b33a2f2 authored by Philipp Rüssmann's avatar Philipp Rüssmann
Browse files

Merge branch 'kkrnano-activate-tests' into 'kkrnano-chebyshev-tfQMRgpu'

Activate running regression tests for KKRnano

See merge request kkr/jukkr!8
parents 9be76d3e 248868b5
No related branches found
No related tags found
No related merge requests found
...@@ -39,10 +39,13 @@ stages: ...@@ -39,10 +39,13 @@ stages:
# to be implemented ... # to be implemented ...
# pkkprime stages # pkkprime stages
- build_pkkprime - build_pkkprime
# run and verift stages not defined yet # run and verify stages not defined yet
# rhoq stages # rhoq stages
- build_rhoq - build_rhoq
# run and verift stages not defined yet # run and verify stages not defined yet
# kkrnano stages
- build_kkrnano
- run_kkrnano
############################################################################### ###############################################################################
...@@ -72,12 +75,14 @@ include: ...@@ -72,12 +75,14 @@ include:
- tests/gitlab-ci/build_pkkprime.yml - tests/gitlab-ci/build_pkkprime.yml
- tests/gitlab-ci/build_voronoi.yml - tests/gitlab-ci/build_voronoi.yml
- tests/gitlab-ci/build_rhoq.yml - tests/gitlab-ci/build_rhoq.yml
- tests/gitlab-ci/build_kkrnano.yml
### 2. run tests ### ### 2. run tests ###
- tests/gitlab-ci/run_kkrhost.yml - tests/gitlab-ci/run_kkrhost.yml
- tests/gitlab-ci/run_kkrimp.yml - tests/gitlab-ci/run_kkrimp.yml
#- tests/gitlab-ci/run_kkrsusc.yml #- tests/gitlab-ci/run_kkrsusc.yml
#- tests/gitlab-ci/run_pkkprime.yml #- tests/gitlab-ci/run_pkkprime.yml
- tests/gitlab-ci/run_voronoi.yml - tests/gitlab-ci/run_voronoi.yml
- tests/gitlab-ci/run_kkrnano.yml
### 3. verify results ### ### 3. verify results ###
- tests/gitlab-ci/verify_kkrhost.yml - tests/gitlab-ci/verify_kkrhost.yml
- tests/gitlab-ci/verify_kkrimp.yml - tests/gitlab-ci/verify_kkrimp.yml
......
...@@ -12,7 +12,7 @@ TESTDIR = os.getcwd() ### perform the calculation in the current working directo ...@@ -12,7 +12,7 @@ TESTDIR = os.getcwd() ### perform the calculation in the current working directo
DECIMALS = 6 ### 8=all digits, 6 should be enough DECIMALS = 6 ### 8=all digits, 6 should be enough
DEFAULT_lmax = 3 DEFAULT_lmax = 3
DEFAULT_nranks = 1 DEFAULT_nranks = 1
DEFAULT_nthreads = 1 DEFAULT_nthreads = 4
direct = 4 ## direct = 4 ##
iterative = 3 ## iterative = 3 ##
DEFAULT_solver = iterative DEFAULT_solver = iterative
...@@ -21,10 +21,14 @@ ShowMD5 = True ...@@ -21,10 +21,14 @@ ShowMD5 = True
AllMPIs = 1 # 1=Yes, 0=No AllMPIs = 1 # 1=Yes, 0=No
HighLmax = True HighLmax = True
testNocoSOC = True testNocoSOC = True
verbose = False
MPIEXEC = 'mpirun' # 'srun'
def run_it(cmd): def run_it(cmd):
"""Run cmd, suppressing output. Returns output from stdout and exit code""" """Run cmd, suppressing output. Returns output from stdout and exit code"""
start_time = time.time() start_time = time.time()
if verbose:
print 'Run command "{0}"'.format(cmd)
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, close_fds=True, preexec_fn=os.setsid, shell=True) proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, close_fds=True, preexec_fn=os.setsid, shell=True)
out, err = proc.communicate() out, err = proc.communicate()
end_time = time.time() end_time = time.time()
...@@ -42,9 +46,11 @@ def get_energy(string): ...@@ -42,9 +46,11 @@ def get_energy(string):
else: else:
raise ArgumentError raise ArgumentError
def KKRnano(inputdir, nranks=DEFAULT_nranks, nthreads=DEFAULT_nthreads, solver=DEFAULT_solver, lmax=DEFAULT_lmax, Lly=DEFAULT_Lly): def KKRnano(inputdir, nranks=DEFAULT_nranks, nthreads=DEFAULT_nthreads, solver=DEFAULT_solver, lmax=DEFAULT_lmax, Lly=DEFAULT_Lly, **kwargs):
"""Run KKR-calculation with input from 'inputdir' and returns the total energy""" """Run KKR-calculation with input from 'inputdir' and returns the total energy"""
#print "start KKR for", inputdir, "with lmax=",lmax, ", solver=",solver, ", nthreads=",nthreads, "nranks=",nranks if verbose:
print "start KKR for", inputdir, "with lmax=",lmax, ", solver=",solver, ", nthreads=",nthreads, "nranks=",nranks
print 'test dir:', TESTDIR
out, err, tim = run_it("./clearfiles.sh") out, err, tim = run_it("./clearfiles.sh")
global ShowMD5 global ShowMD5
...@@ -66,9 +72,24 @@ def KKRnano(inputdir, nranks=DEFAULT_nranks, nthreads=DEFAULT_nthreads, solver=D ...@@ -66,9 +72,24 @@ def KKRnano(inputdir, nranks=DEFAULT_nranks, nthreads=DEFAULT_nthreads, solver=D
with open("input.conf", "a") as myfile: ## append to file with open("input.conf", "a") as myfile: ## append to file
myfile.write("LLY = {0}\n".format(int(Lly))) myfile.write("LLY = {0}\n".format(int(Lly)))
out, err, tim = run_it("./kkr.exe --prepare") ### start from JM-formatted potential file # add other inputs
for key, val in kwargs.items():
with open("input.conf", "a") as myfile: ## append to file
myfile.write("{0} = {1}\n".format(key, val))
mpirun = ''
if MPIEXEC=='srun':
mpirun = 'srun -n 1 '
out, err, tim = run_it(mpirun + "./kkr.exe --prepare") ### start from JM-formatted potential file
## execute the code ## execute the code
out, err, tim = run_it("OMP_STACKSIZE=80M OMP_NUM_THREADS={0} mpiexec -np {1} kkr.exe".format(int(nthreads), int(nranks))) mpirun = 'mpirun -np'
if MPIEXEC=='srun':
mpirun = 'srun -n'
out, err, tim = run_it("OMP_STACKSIZE=80M OMP_NUM_THREADS={0} ".format(int(nthreads)) + mpirun + " {0} ./kkr.exe".format(int(nranks)))
if verbose:
print 'out', out
print 'err', err
print 'tim', tim
### grep the result ### grep the result
total_energy = get_energy(out) total_energy = get_energy(out)
print "KKR for",inputdir," with lmax=",lmax," gives",total_energy,"Ryd", print "KKR for",inputdir," with lmax=",lmax," gives",total_energy,"Ryd",
...@@ -84,65 +105,77 @@ def KKRnano(inputdir, nranks=DEFAULT_nranks, nthreads=DEFAULT_nthreads, solver=D ...@@ -84,65 +105,77 @@ def KKRnano(inputdir, nranks=DEFAULT_nranks, nthreads=DEFAULT_nthreads, solver=D
out, err, tim = run_it("./clearfiles.sh") out, err, tim = run_it("./clearfiles.sh")
return total_energy return total_energy
######################################################################################
class Test_alloys(unittest.TestCase): class Test_alloys(unittest.TestCase):
def test_Fe8Co8(self): def test_Fe8Co8(self):
"""Test random alloy of 16 atoms""" """Test random alloy of 16 atoms"""
Etot = -42561.17620828 Etot = -42561.325157
for r in range(0, AllMPIs*4+1): # nranks=[1, 2, 4, 8, 16] for r in range(0, AllMPIs*4+1): # nranks=[1, 2, 4, 8, 16]
self.assertAlmostEqual(KKRnano("Fe8Co8", solver=direct, nranks=2**r), Etot, DECIMALS) # about 30 seconds for nranks=1 self.assertAlmostEqual(KKRnano("Fe8Co8", solver=direct, nranks=2**r), Etot, DECIMALS) # about 30 seconds for nranks=1
# total time ~2.2min
class Test_copper(unittest.TestCase): class Test_copper(unittest.TestCase):
def test_Cu4_lmax(self): def test_Cu4_lmax(self):
"""Test with high lmax. Works only with -heap-arrays on ifort, 4 Cu atoms in the cubic unit cell""" """Test with high lmax. Works only with -heap-arrays on ifort, 4 Cu atoms in the cubic unit cell"""
Etot = -13219.36420827 Etot = -13219.3620641
for r in range(0, AllMPIs*2+1): # nranks=[1, 2, 4] for r in range(0, AllMPIs*2+1): # nranks=[1, 2, 4]
self.assertAlmostEqual(KKRnano("Cu4", solver=direct, nranks=2**r), Etot, DECIMALS) self.assertAlmostEqual(KKRnano("Cu4", solver=direct, nranks=2**r), Etot, DECIMALS)
if HighLmax: if HighLmax:
self.assertAlmostEqual(KKRnano("Cu4", solver=direct, lmax=4), -13219.71809004, DECIMALS) self.assertAlmostEqual(KKRnano("Cu4", solver=direct, lmax=4, nranks=4), -13219.716163, DECIMALS)
self.assertAlmostEqual(KKRnano("Cu4", solver=direct, lmax=5), -13219.60358021, DECIMALS) # about 30 seconds self.assertAlmostEqual(KKRnano("Cu4", solver=direct, lmax=5, nranks=4), -13219.6016203, DECIMALS) # about 30 seconds
self.assertAlmostEqual(KKRnano("Cu4", solver=direct, lmax=6), -13219.5622359, DECIMALS) # about 60 seconds self.assertAlmostEqual(KKRnano("Cu4", solver=direct, lmax=6, nranks=4), -13219.5603038, DECIMALS) # about 60 seconds
# total time ~1.6min
def test_Cu1_lmax(self): def test_Cu1_lmax(self):
"""Test with high lmax. Works only with -heap-arrays on ifort, 1 Cu atoms in the FCC unit cell""" """Test with high lmax. Works only with -heap-arrays on ifort, 1 Cu atoms in the FCC unit cell"""
self.assertAlmostEqual(KKRnano("Cu1", solver=direct), -3308.16564382, DECIMALS) # about 2 seconds self.assertAlmostEqual(KKRnano("Cu1", solver=direct, nranks=1), -3308.14107181, DECIMALS) # about 2 seconds
if HighLmax: if HighLmax:
self.assertAlmostEqual(KKRnano("Cu1", solver=direct, lmax=4), -3308.26672862, DECIMALS) # about 4 seconds self.assertAlmostEqual(KKRnano("Cu1", solver=direct, lmax=4, nranks=1), -3308.26072261, DECIMALS) # about 4 seconds
self.assertAlmostEqual(KKRnano("Cu1", solver=direct, lmax=5), -3308.23074153, DECIMALS) # about 8 seconds self.assertAlmostEqual(KKRnano("Cu1", solver=direct, lmax=5, nranks=1), -3308.22046659, DECIMALS) # about 8 seconds
self.assertAlmostEqual(KKRnano("Cu1", solver=direct, lmax=6), -3308.15897626, DECIMALS) # about 16 seconds self.assertAlmostEqual(KKRnano("Cu1", solver=direct, lmax=6, nranks=1), -3308.15010032, DECIMALS) # about 16 seconds
# total time ~1min
class Test_semiconductors(unittest.TestCase): class Test_semiconductors(unittest.TestCase):
def test_GaN(self): def test_GaN(self):
"""Test semiconductor in zincblende structure with 2 vacancy cells""" """Test semiconductor in zincblende structure with 2 vacancy cells"""
Etot = -3990.85752538 Etot = -3990.8515006
for r in range(0, AllMPIs*2+1): # nranks=[4, 2, 1] for r in range(0, AllMPIs*2+1): # nranks=[4, 2, 1]
self.assertAlmostEqual(KKRnano("GaN", solver=direct, nranks=2**(2-r)), Etot, DECIMALS) # about 80 seconds self.assertAlmostEqual(KKRnano("GaN", solver=direct, nranks=2**(2-r)), Etot, DECIMALS) # about 80 seconds
# total time ~4.6min
def test_Si(self): def test_Si(self):
"""Test semiconductor in diamond structure with 2 vacancy cells""" """Test semiconductor in diamond structure with 2 vacancy cells"""
Etot = -1155.68470407 Etot = -1155.68952256
for r in range(0, AllMPIs*2+1): # nranks=[1, 2, 4] for r in range(0, AllMPIs*2+1): # nranks=[1, 2, 4]
self.assertAlmostEqual(KKRnano("Si", solver=direct, nranks=2**r), Etot, DECIMALS) # about a minute self.assertAlmostEqual(KKRnano("Si", solver=direct, nranks=2**r), Etot, DECIMALS) # about a minute
# total time ~1.5min
# def test_ZnO(self):
# """Test semiconductor in wurzite structure with 4 vacancy cells and voro_weights""" def test_ZnO(self):
# Etot = -7405.77074357 ## test iterative solver (solver=3, default) without and with MPI """Test semiconductor in wurzite structure with 4 vacancy cells and voro_weights"""
# for r in range(0, AllMPIs*3+1): # nranks=[1, 2, 4, 8] Etot = -7405.77043939 ## test iterative solver (solver=3, default) without and with MPI
# self.assertAlmostEqual(KKRnano("ZnO", nranks=2**r), Etot, DECIMALS) for r in range(0, AllMPIs*3+1): # nranks=[1, 2, 4, 8]
# self.assertAlmostEqual(KKRnano("ZnO", nranks=2**r), Etot, DECIMALS)
# Etot = -7405.77074351
# for r in range(0, AllMPIs*3+1): # nranks=[1, 2, 4, 8] for r in range(0, AllMPIs*3+1): # nranks=[1, 2, 4, 8]
# self.assertAlmostEqual(KKRnano("ZnO", solver=direct, nranks=2**r), Etot, DECIMALS) self.assertAlmostEqual(KKRnano("ZnO", solver=direct, nranks=2**r), Etot, DECIMALS)
# ### Lloyd formula ### Lloyd formula
# self.assertAlmostEqual(KKRnano("ZnO", solver=direct, nranks=8, Lly=1), -7405.74826372, DECIMALS) # broken because of error message "Lloyd's formula and num_local_atoms > 1 not supported."
# self.assertAlmostEqual(KKRnano("ZnO", nranks=8, Lly=1), -7405.74826372, DECIMALS) # this seems to work only if we have one MPI rank per atom
# i.e. put "num_atom_procs = 8" into the input.conf
Etot = -7405.75215722
self.assertAlmostEqual(KKRnano("ZnO", solver=direct, nranks=8, Lly=1, num_atom_procs=8), Etot, DECIMALS)
self.assertAlmostEqual(KKRnano("ZnO", nranks=8, Lly=1, num_atom_procs=8), Etot, DECIMALS)
# total time ~1.5min
class Test_nocosocmaterials(unittest.TestCase): class Test_nocosocmaterials(unittest.TestCase):
def test_MnGeB20(self): def test_MnGeB20(self):
"""Test chiral magnet MnGe B20 structure (8 atoms in unit cell)""" """Test chiral magnet MnGe B20 structure (8 atoms in unit cell)"""
Etot = -26017.23757851 Etot = -26017.1505286
if testNocoSOC: if testNocoSOC:
self.assertAlmostEqual(KKRnano("MnGeB20", solver=direct, nranks=8), Etot, DECIMALS) # takes longer than other tests self.assertAlmostEqual(KKRnano("MnGeB20", solver=direct, nranks=8), Etot, DECIMALS) # takes longer than other tests, ~3 mins
self.assertAlmostEqual(KKRnano("MnGeB20", solver=iterative, nranks=4), Etot, DECIMALS) # takes longer than other tests self.assertAlmostEqual(KKRnano("MnGeB20", solver=iterative, nranks=4), Etot, DECIMALS) # takes longer than other tests
# total time ~6min
unittest.main() unittest.main()
build_kkrnano:intel:hybrid:
stage: build_kkrnano
tags:
- docker-executor
script:
# compile code
- cd source/KKRnano/source && mkdir -p build
- make -j4 PLATFORM=ifort SMP=openmp
- cp kkr.exe ../regtests/kkr.exe
artifacts:
paths:
- source/KKRnano/regtests/kkr.exe
expire_in: 1 day
only:
- schedules
- triggers
- web
- master
- develop
- kkrnano-activate-tests
- kkrnano-chebyshev-tfQMRgpu
run_kkrnano:intel:Cu1:
stage: run_kkrnano
tags:
- docker-executor
script:
- cd source/KKRnano/regtests
- mkdir -p test_Cu1; cd test_Cu1; ln -s ../* .
- ls -la
- ls -la ..
- python2.7 ./tests.py Test_copper.test_Cu1_lmax
artifacts:
paths:
- source/KKRnano/regtests/test_Cu1
expire_in: 1 day
only:
- schedules
- triggers
- web
- master
- develop
- kkrnano-activate-tests
- kkrnano-chebyshev-tfQMRgpu
run_kkrnano:intel:Cu4:
stage: run_kkrnano
tags:
- docker-executor
script:
- cd source/KKRnano/regtests
- mkdir -p test_Cu4; cd test_Cu4; ln -s ../* .
- python2.7 ./tests.py Test_copper.test_Cu4_lmax
artifacts:
paths:
- source/KKRnano/regtests/test_Cu4
expire_in: 1 day
only:
- schedules
- triggers
- web
- master
- develop
- kkrnano-activate-tests
- kkrnano-chebyshev-tfQMRgpu
run_kkrnano:intel:GaN:
stage: run_kkrnano
tags:
- docker-executor
script:
- cd source/KKRnano/regtests
- mkdir -p test_GaN; cd test_GaN; ln -s ../* .
- python2.7 ./tests.py Test_semiconductors.test_GaN
artifacts:
paths:
- source/KKRnano/regtests/test_GaN
expire_in: 1 day
only:
- schedules
- triggers
- web
- master
- develop
- kkrnano-activate-tests
- kkrnano-chebyshev-tfQMRgpu
run_kkrnano:intel:Si:
stage: run_kkrnano
tags:
- docker-executor
script:
- cd source/KKRnano/regtests
- mkdir -p test_Si; cd test_Si; ln -s ../* .
- python2.7 ./tests.py Test_semiconductors.test_Si
artifacts:
paths:
- source/KKRnano/regtests/test_Si
expire_in: 1 day
only:
- schedules
- triggers
- web
- master
- develop
- kkrnano-activate-tests
- kkrnano-chebyshev-tfQMRgpu
run_kkrnano:intel:ZnO:
stage: run_kkrnano
tags:
- docker-executor
script:
- cd source/KKRnano/regtests
- mkdir -p test_ZnO; cd test_ZnO; ln -s ../* .
- python2.7 ./tests.py Test_semiconductors.test_ZnO
artifacts:
paths:
- source/KKRnano/regtests/test_ZnO
expire_in: 1 day
only:
- schedules
- triggers
- web
- master
- develop
- kkrnano-activate-tests
- kkrnano-chebyshev-tfQMRgpu
run_kkrnano:intel:MnGeB20:
stage: run_kkrnano
tags:
- docker-executor
script:
- cd source/KKRnano/regtests
- mkdir -p test_MnGeB20; cd test_MnGeB20; ln -s ../* .
- python2.7 ./tests.py Test_nocosocmaterials.test_MnGeB20
artifacts:
paths:
- source/KKRnano/regtests/test_MnGeB20
expire_in: 1 day
only:
- schedules
- triggers
- web
- master
- develop
- kkrnano-activate-tests
- kkrnano-chebyshev-tfQMRgpu
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment