dpdata icon indicating copy to clipboard operation
dpdata copied to clipboard

[BUG] multi dirs including with OUTCAR(single-point calc mode) can not be converted into deepmd_data together by dpdata

Open WhiteCrosstheRiver opened this issue 4 months ago • 2 comments

Bug summary

I have one dir containing with multi single point calculation files,I wish I could use one command to convert such files into one deepmd format file with dpdata ,however it gives me a error report after I run this command dpdata ./Datasets/dataset00/ -i vasp/outcar -o deepmd/npy -O deepmd_dataset00 -m



### dpdata Version

0.2.25

### Input Files, Running Commands, Error Log, etc.

(ovito) [ime001@master DeepMD]$ tree -d -L 3
.
└── Datasets
    └── dataset00
        ├── Bond_calc
        └── heating

4 directories
(ovito) [ime001@master DeepMD]$ dpdata ./Datasets/dataset00/ -i vasp/outcar -o deepmd/npy -O deepmd_dataset00 -m
Traceback (most recent call last):
  File "/vol02/hdd1/ime001/software/anaconda3/envs/ovito/bin/dpdata", line 8, in <module>
    sys.exit(dpdata_cli())
             ^^^^^^^^^^^^
  File "/vol02/hdd1/ime001/software/anaconda3/envs/ovito/lib/python3.11/site-packages/dpdata/cli.py", line 56, in dpdata_cli
    convert(**vars(parsed_args))
  File "/vol02/hdd1/ime001/software/anaconda3/envs/ovito/lib/python3.11/site-packages/dpdata/cli.py", line 92, in convert
    s = MultiSystems.from_file(
        ^^^^^^^^^^^^^^^^^^^^^^^
  File "/vol02/hdd1/ime001/software/anaconda3/envs/ovito/lib/python3.11/site-packages/dpdata/system.py", line 1469, in from_file
    multi_systems.load_systems_from_file(file_name=file_name, fmt=fmt, **kwargs)
  File "/vol02/hdd1/ime001/software/anaconda3/envs/ovito/lib/python3.11/site-packages/dpdata/system.py", line 1493, in load_systems_from_file
    return self.from_fmt_obj(load_format(fmt), file_name, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/vol02/hdd1/ime001/software/anaconda3/envs/ovito/lib/python3.11/site-packages/dpdata/system.py", line 1382, in from_fmt_obj
    for dd in fmtobj.from_multi_systems(directory, **kwargs):
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/vol02/hdd1/ime001/software/anaconda3/envs/ovito/lib/python3.11/site-packages/dpdata/format.py", line 317, in from_multi_systems
    raise NotImplementedError(
NotImplementedError: VASPOutcarFormat doesn't support MultiSystems.from

Steps to Reproduce

You can unzip issue_reported.zip file and cd into such dir and use command such like this as dpdata . -i vasp/outcar -o deepmd/npy -O deepmd_data -m ,then it can also give you the same error information.

Further Information, Files, and Links

No response

WhiteCrosstheRiver avatar Sep 11 '25 03:09 WhiteCrosstheRiver

This is not supported.

you may convert all the OUTCARs by a python script like

import os
import dpdata

def find_outcar_files(root_dir):
    """
    Recursively find all files named OUTCAR in the root directory.

    Parameters:
    root_dir (str): The root directory to start searching from.

    Returns:
    list: A list of paths to the OUTCAR files.
    """
    outcar_files = []
    for dirpath, _, filenames in os.walk(root_dir):
        for filename in filenames:
            if filename == 'OUTCAR':
                full_path = os.path.join(dirpath, filename)
                outcar_files.append(full_path)
    return outcar_files


def convert_outcar_to_multisystem(outcar_files):
    """
    Convert OUTCAR files to dpdata's MultiSystem data structure.

    Parameters:
    outcar_files (list): List of paths to the OUTCAR files.
    Returns:
    MultiSystem: MultiSystem objects.
    """
    multisystem = dpdata.MultiSystems()
    for outcar_file in outcar_files:
        try:
            # Initialize the MultiSystem from OUTCAR file
            system = dpdata.LabeledSystem(outcar_file, fmt='vasp/OUTCAR')
            multisystem.append(system)
            print(f"Converted {outcar_file} to MultiSystem.")
        except Exception as e:
            print(f"Failed to convert {outcar_file}: {e}")
    return multisystem

def main():
    root_directory = './'  # Change this to your root directory path
    outcar_files = find_outcar_files(root_directory)
    print(outcar_files)
    multisystems = convert_outcar_to_multisystem(outcar_files)
    print(multisystems)
    multisystems.to('deepmd/npy', "tmp.output" )

main()

wanghan-iapcm avatar Sep 15 '25 10:09 wanghan-iapcm

Got this! Thank you ALL! Using this script ,I can also obtain a multi-systems dataset.

WhiteCrosstheRiver avatar Sep 19 '25 02:09 WhiteCrosstheRiver