Coverage for /builds/ase/ase/ase/io/vasp_parsers/incar_writer.py: 96.67%

30 statements  

« prev     ^ index     » next       coverage.py v7.5.3, created at 2025-08-02 00:12 +0000

1# fmt: off 

2 

3from collections.abc import Iterable 

4 

5 

6def write_incar(directory, parameters, header=None): 

7 incar_string = generate_incar_lines(parameters) 

8 with open(f"{directory}/INCAR", "w") as incar: 

9 if header is not None: 

10 incar.write(header + "\n") 

11 incar.write(incar_string) 

12 

13 

14def generate_incar_lines(parameters): 

15 if isinstance(parameters, str): 

16 return parameters 

17 elif parameters is None: 

18 return "" 

19 else: 

20 incar_lines = [] 

21 for item in parameters.items(): 

22 incar_lines += list(generate_line(*item)) 

23 # Adding a newline at the end of the file 

24 return "\n".join(incar_lines) + "\n" 

25 

26 

27def generate_line(key, value, num_spaces=0): 

28 indent = " " * num_spaces 

29 if isinstance(value, str): 

30 if value.find("\n") != -1: 

31 value = '"' + value + '"' 

32 yield indent + f"{key.upper()} = {value}" 

33 elif isinstance(value, dict): 

34 yield indent + f"{key.upper()} {{" 

35 for item in value.items(): 

36 yield from generate_line(*item, num_spaces + 4) 

37 yield indent + "}" 

38 elif isinstance(value, Iterable): 

39 yield indent + f"{key.upper()} = {' '.join(str(x) for x in value)}" 

40 else: 

41 yield indent + f"{key.upper()} = {value}"