diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cba8d4c8e012f47421127ab5eb2484a3f6e86782..0be96814d8b2b438630a9b2889d484ec1e8072c9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -39,10 +39,13 @@ stages: # to be implemented ... # pkkprime stages - build_pkkprime - # run and verift stages not defined yet + # run and verify stages not defined yet # rhoq stages - 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: - tests/gitlab-ci/build_pkkprime.yml - tests/gitlab-ci/build_voronoi.yml - tests/gitlab-ci/build_rhoq.yml + - tests/gitlab-ci/build_kkrnano.yml ### 2. run tests ### - tests/gitlab-ci/run_kkrhost.yml - tests/gitlab-ci/run_kkrimp.yml #- tests/gitlab-ci/run_kkrsusc.yml #- tests/gitlab-ci/run_pkkprime.yml - tests/gitlab-ci/run_voronoi.yml + - tests/gitlab-ci/run_kkrnano.yml ### 3. verify results ### - tests/gitlab-ci/verify_kkrhost.yml - tests/gitlab-ci/verify_kkrimp.yml diff --git a/source/KKRnano/regtests/tests.py b/source/KKRnano/regtests/tests.py index 96d2a4386e54834b0ab57213c57915deee2c6e67..1181e5170c343e667f96aad4839abe1a514f2da9 100755 --- a/source/KKRnano/regtests/tests.py +++ b/source/KKRnano/regtests/tests.py @@ -12,7 +12,7 @@ TESTDIR = os.getcwd() ### perform the calculation in the current working directo DECIMALS = 6 ### 8=all digits, 6 should be enough DEFAULT_lmax = 3 DEFAULT_nranks = 1 -DEFAULT_nthreads = 1 +DEFAULT_nthreads = 4 direct = 4 ## iterative = 3 ## DEFAULT_solver = iterative @@ -21,10 +21,14 @@ ShowMD5 = True AllMPIs = 1 # 1=Yes, 0=No HighLmax = True testNocoSOC = True +verbose = False +MPIEXEC = 'mpirun' # 'srun' def run_it(cmd): """Run cmd, suppressing output. Returns output from stdout and exit code""" 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) out, err = proc.communicate() end_time = time.time() @@ -42,9 +46,11 @@ def get_energy(string): else: 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""" - #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") global ShowMD5 @@ -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 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 - 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 total_energy = get_energy(out) 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 out, err, tim = run_it("./clearfiles.sh") return total_energy +###################################################################################### + class Test_alloys(unittest.TestCase): def test_Fe8Co8(self): """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] 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): def test_Cu4_lmax(self): """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] self.assertAlmostEqual(KKRnano("Cu4", solver=direct, nranks=2**r), Etot, DECIMALS) if HighLmax: - self.assertAlmostEqual(KKRnano("Cu4", solver=direct, lmax=4), -13219.71809004, DECIMALS) - self.assertAlmostEqual(KKRnano("Cu4", solver=direct, lmax=5), -13219.60358021, 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=4, nranks=4), -13219.716163, DECIMALS) + self.assertAlmostEqual(KKRnano("Cu4", solver=direct, lmax=5, nranks=4), -13219.6016203, DECIMALS) # about 30 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): """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: - self.assertAlmostEqual(KKRnano("Cu1", solver=direct, lmax=4), -3308.26672862, 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=6), -3308.15897626, DECIMALS) # about 16 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, nranks=1), -3308.22046659, DECIMALS) # about 8 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): def test_GaN(self): """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] self.assertAlmostEqual(KKRnano("GaN", solver=direct, nranks=2**(2-r)), Etot, DECIMALS) # about 80 seconds + # total time ~4.6min def test_Si(self): """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] self.assertAlmostEqual(KKRnano("Si", solver=direct, nranks=2**r), Etot, DECIMALS) # about a minute - -# def test_ZnO(self): -# """Test semiconductor in wurzite structure with 4 vacancy cells and voro_weights""" -# Etot = -7405.77074357 ## test iterative solver (solver=3, default) without and with MPI -# 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] -# self.assertAlmostEqual(KKRnano("ZnO", solver=direct, nranks=2**r), Etot, DECIMALS) -# ### Lloyd formula -# self.assertAlmostEqual(KKRnano("ZnO", solver=direct, nranks=8, Lly=1), -7405.74826372, DECIMALS) -# self.assertAlmostEqual(KKRnano("ZnO", nranks=8, Lly=1), -7405.74826372, DECIMALS) + # total time ~1.5min + + def test_ZnO(self): + """Test semiconductor in wurzite structure with 4 vacancy cells and voro_weights""" + Etot = -7405.77043939 ## test iterative solver (solver=3, default) without and with MPI + for r in range(0, AllMPIs*3+1): # nranks=[1, 2, 4, 8] + 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", solver=direct, nranks=2**r), Etot, DECIMALS) + ### Lloyd formula + # broken because of error message "Lloyd's formula and num_local_atoms > 1 not supported." + # 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): def test_MnGeB20(self): """Test chiral magnet MnGe B20 structure (8 atoms in unit cell)""" - Etot = -26017.23757851 + Etot = -26017.1505286 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 + # total time ~6min unittest.main() diff --git a/tests/gitlab-ci/build_kkrnano.yml b/tests/gitlab-ci/build_kkrnano.yml new file mode 100644 index 0000000000000000000000000000000000000000..93c488f1c13cf363a3895cf8cbfbaaab43f61607 --- /dev/null +++ b/tests/gitlab-ci/build_kkrnano.yml @@ -0,0 +1,21 @@ +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 diff --git a/tests/gitlab-ci/run_kkrnano.yml b/tests/gitlab-ci/run_kkrnano.yml new file mode 100644 index 0000000000000000000000000000000000000000..5036bddea468ff80caee49cd261b97e54e4cc930 --- /dev/null +++ b/tests/gitlab-ci/run_kkrnano.yml @@ -0,0 +1,127 @@ +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