import glob
import os
import re
import dpgen.auto_test.lib.abacus as abacus
[docs]
def make_refine(init_from_suffix, output_suffix, path_to_work):
cwd = os.getcwd()
init_from = re.sub(
output_suffix[::-1], init_from_suffix[::-1], path_to_work[::-1], count=1
)[::-1]
if not os.path.exists(init_from):
raise FileNotFoundError("the initial directory does not exist for refine")
output = path_to_work
init_from_task_tot = glob.glob(os.path.join(init_from, "task.[0-9]*[0-9]"))
task_num = len(init_from_task_tot)
task_list = []
for ii in range(task_num):
output_task = os.path.join(output, "task.%06d" % ii)
os.makedirs(output_task, exist_ok=True)
os.chdir(output_task)
for jj in [
"INCAR",
"POTCAR",
"POSCAR.orig",
"POSCAR",
"conf.lmp",
"in.lammps",
"STRU",
]:
if os.path.exists(jj):
os.remove(jj)
task_list.append(output_task)
init_from_task = os.path.join(init_from, "task.%06d" % ii)
if not os.path.exists(init_from_task):
raise FileNotFoundError(
"the initial task directory does not exist for refine"
)
if os.path.isfile(os.path.join(init_from_task, "INPUT")) and os.path.isfile(
os.path.join(init_from_task, "STRU")
):
# if there has INPUT and STRU files in this path, we believe this is a ABACUS job
CONTCAR = abacus.final_stru(init_from_task)
POSCAR = "STRU"
else:
CONTCAR = "CONTCAR"
POSCAR = "POSCAR"
contcar = os.path.join(init_from_task, CONTCAR)
init_poscar = os.path.join(init_from_task, POSCAR)
if os.path.exists(contcar):
os.symlink(os.path.relpath(contcar), POSCAR)
elif os.path.exists(init_poscar):
os.symlink(os.path.relpath(init_poscar), POSCAR)
else:
raise FileNotFoundError(
f"no {CONTCAR} or {POSCAR} in the init_from directory"
)
os.chdir(cwd)
return task_list