Ejemplo n.º 1
0
 def test_check_correct_electronic_repeat(self):
     shutil.copy("vasprun.xml.electronic2", "vasprun.xml")
     h = UnconvergedErrorHandler()
     self.assertTrue(h.check())
     d = h.correct()
     self.assertEqual(d, {"errors": ["Unconverged"], "actions": None})
     os.remove("vasprun.xml")
Ejemplo n.º 2
0
 def test_check_correct_ionic(self):
     shutil.copy("vasprun.xml.ionic", "vasprun.xml")
     h = UnconvergedErrorHandler()
     self.assertTrue(h.check())
     d = h.correct()
     self.assertEqual(d["errors"], ['Unconverged'])
     os.remove("vasprun.xml")
Ejemplo n.º 3
0
 def test_check_correct_ionic(self):
     shutil.copy("vasprun.xml.ionic", "vasprun.xml")
     h = UnconvergedErrorHandler()
     self.assertTrue(h.check())
     d = h.correct()
     self.assertEqual(d["errors"], ['Unconverged'])
     os.remove("vasprun.xml")
Ejemplo n.º 4
0
 def test_check_correct_electronic_repeat(self):
     shutil.copy("vasprun.xml.electronic2", "vasprun.xml")
     h = UnconvergedErrorHandler()
     self.assertTrue(h.check())
     d = h.correct()
     self.assertEqual(d, {"errors": ["Unconverged"], "actions": None})
     os.remove("vasprun.xml")
Ejemplo n.º 5
0
 def test_check_correct_electronic_repeat(self):
     shutil.copy("vasprun.xml.electronic2", "vasprun.xml")
     h = UnconvergedErrorHandler()
     self.assertTrue(h.check())
     d = h.correct()
     self.assertEqual(d, {'actions': [{'action': {'_set': {'ALGO': 'All'}}, 'dict': 'INCAR'}],
                         'errors': ['Unconverged']})
     os.remove("vasprun.xml")
Ejemplo n.º 6
0
 def test_check_correct_scan(self):
     shutil.copy("vasprun.xml.scan", "vasprun.xml")
     h = UnconvergedErrorHandler()
     self.assertTrue(h.check())
     d = h.correct()
     self.assertEqual(d["errors"], ['Unconverged'])
     self.assertIn({"dict": "INCAR",
                        "action": {"_set": {"ALGO": "All"}}},d["actions"])
     os.remove("vasprun.xml")
Ejemplo n.º 7
0
 def test_check_correct_scan(self):
     shutil.copy("vasprun.xml.scan", "vasprun.xml")
     h = UnconvergedErrorHandler()
     self.assertTrue(h.check())
     d = h.correct()
     self.assertEqual(d["errors"], ['Unconverged'])
     self.assertIn({"dict": "INCAR",
                        "action": {"_set": {"ALGO": "All"}}},d["actions"])
     os.remove("vasprun.xml")
Ejemplo n.º 8
0
 def test_is_converged(self):
     import pymatgen
     print(pymatgen.__file__)
     print(pymatgen.__version__)
     import custodian
     print(custodian.__version__)
     path = os.path.join(TEST_PATH, self.path, 'unconverged', 'vasprun.xml')
     handler = UnconvergedErrorHandler(path)
     print(handler.check())
Ejemplo n.º 9
0
    def test_check_correct(self):
        subdir = os.path.join(test_dir, "unconverged")
        os.chdir(subdir)

        shutil.copy("INCAR", "INCAR.orig")
        shutil.copy("KPOINTS", "KPOINTS.orig")
        shutil.copy("POSCAR", "POSCAR.orig")
        shutil.copy("CONTCAR", "CONTCAR.orig")

        h = UnconvergedErrorHandler()
        self.assertTrue(h.check())
        d = h.correct()
        self.assertEqual(d["errors"], ['Unconverged'])

        os.remove(os.path.join(subdir, "error.1.tar.gz"))

        shutil.move("INCAR.orig", "INCAR")
        shutil.move("KPOINTS.orig", "KPOINTS")
        shutil.move("POSCAR.orig", "POSCAR")
        shutil.move("CONTCAR.orig", "CONTCAR")
Ejemplo n.º 10
0
 def test_check_correct_electronic_repeat(self):
     shutil.copy("vasprun.xml.electronic2", "vasprun.xml")
     h = UnconvergedErrorHandler()
     self.assertTrue(h.check())
     d = h.correct()
     self.assertEqual(
         d,
         {
             "actions": [{
                 "action": {
                     "_set": {
                         "ALGO": "All"
                     }
                 },
                 "dict": "INCAR"
             }],
             "errors": ["Unconverged"],
         },
     )
     os.remove("vasprun.xml")
Ejemplo n.º 11
0
    def test_check_correct(self):
        subdir = os.path.join(test_dir, "unconverged")
        os.chdir(subdir)

        shutil.copy("INCAR", "INCAR.orig")
        shutil.copy("KPOINTS", "KPOINTS.orig")
        shutil.copy("POSCAR", "POSCAR.orig")
        shutil.copy("CONTCAR", "CONTCAR.orig")

        h = UnconvergedErrorHandler()
        self.assertTrue(h.check())
        d = h.correct()
        self.assertEqual(d["errors"], ['Unconverged'])

        os.remove(os.path.join(subdir, "error.1.tar.gz"))

        shutil.move("INCAR.orig", "INCAR")
        shutil.move("KPOINTS.orig", "KPOINTS")
        shutil.move("POSCAR.orig", "POSCAR")
        shutil.move("CONTCAR.orig", "CONTCAR")
Ejemplo n.º 12
0
    def test_check_correct_electronic(self):
        shutil.copy("vasprun.xml.electronic", "vasprun.xml")
        h = UnconvergedErrorHandler()
        self.assertTrue(h.check())
        d = h.correct()
        self.assertEqual(d["errors"], ["Unconverged"])
        self.assertEqual(
            d,
            {
                "actions": [{
                    "action": {
                        "_set": {
                            "ALGO": "Normal"
                        }
                    },
                    "dict": "INCAR"
                }],
                "errors": ["Unconverged"],
            },
        )

        shutil.copy("vasprun.xml.electronic_veryfast", "vasprun.xml")
        h = UnconvergedErrorHandler()
        self.assertTrue(h.check())
        d = h.correct()
        self.assertEqual(d["errors"], ["Unconverged"])
        self.assertEqual(
            d,
            {
                "actions": [{
                    "action": {
                        "_set": {
                            "ALGO": "Fast"
                        }
                    },
                    "dict": "INCAR"
                }],
                "errors": ["Unconverged"],
            },
        )

        shutil.copy("vasprun.xml.electronic_normal", "vasprun.xml")
        h = UnconvergedErrorHandler()
        self.assertTrue(h.check())
        d = h.correct()
        self.assertEqual(d["errors"], ["Unconverged"])
        self.assertEqual(
            d,
            {
                "actions": [{
                    "action": {
                        "_set": {
                            "ALGO": "All"
                        }
                    },
                    "dict": "INCAR"
                }],
                "errors": ["Unconverged"],
            },
        )

        shutil.copy("vasprun.xml.electronic_metagga_fast", "vasprun.xml")
        h = UnconvergedErrorHandler()
        self.assertTrue(h.check())
        d = h.correct()
        self.assertEqual(d["errors"], ["Unconverged"])
        self.assertEqual(
            d,
            {
                "actions": [{
                    "action": {
                        "_set": {
                            "ALGO": "All"
                        }
                    },
                    "dict": "INCAR"
                }],
                "errors": ["Unconverged"],
            },
        )

        shutil.copy("vasprun.xml.electronic_hybrid_fast", "vasprun.xml")
        h = UnconvergedErrorHandler()
        self.assertTrue(h.check())
        d = h.correct()
        self.assertEqual(d["errors"], ["Unconverged"])
        self.assertEqual(
            d,
            {
                "actions": [{
                    "action": {
                        "_set": {
                            "ALGO": "All"
                        }
                    },
                    "dict": "INCAR"
                }],
                "errors": ["Unconverged"],
            },
        )

        os.remove("vasprun.xml")
Ejemplo n.º 13
0
    def run_task(self, fw_spec):
        if '_fizzled_parents' in fw_spec and not 'prev_vasp_dir' in fw_spec:
            prev_dir = get_loc(
                fw_spec['_fizzled_parents'][0]['launches'][0]['launch_dir'])
            update_spec = {}  # add this later when creating new FW
            fizzled_parent = True
            parse_dos = False
        else:
            prev_dir = get_loc(fw_spec['prev_vasp_dir'])
            update_spec = {
                'prev_vasp_dir': prev_dir,
                'prev_task_type': fw_spec['prev_task_type'],
                'run_tags': fw_spec['run_tags'],
                'parameters': fw_spec.get('parameters')
            }
            fizzled_parent = False
            parse_dos = 'Uniform' in fw_spec['prev_task_type']
        if 'run_tags' in fw_spec:
            self.additional_fields['run_tags'] = fw_spec['run_tags']
        else:
            self.additional_fields['run_tags'] = fw_spec['_fizzled_parents'][
                0]['spec']['run_tags']

        if MOVE_TO_GARDEN_DEV:
            prev_dir = move_to_garden(prev_dir, prod=False)

        elif MOVE_TO_GARDEN_PROD:
            prev_dir = move_to_garden(prev_dir, prod=True)

        # get the directory containing the db file
        db_dir = os.environ['DB_LOC']
        db_path = os.path.join(db_dir, 'tasks_db.json')

        logging.basicConfig(level=logging.INFO)
        logger = logging.getLogger('MPVaspDrone')
        logger.setLevel(logging.INFO)
        sh = logging.StreamHandler(stream=sys.stdout)
        sh.setLevel(getattr(logging, 'INFO'))
        logger.addHandler(sh)
        with open(db_path) as f:
            db_creds = json.load(f)
            drone = MPVaspDrone(host=db_creds['host'],
                                port=db_creds['port'],
                                database=db_creds['database'],
                                user=db_creds['admin_user'],
                                password=db_creds['admin_password'],
                                collection=db_creds['collection'],
                                parse_dos=parse_dos,
                                additional_fields=self.additional_fields,
                                update_duplicates=self.update_duplicates)
            t_id, d = drone.assimilate(
                prev_dir, launches_coll=LaunchPad.auto_load().launches)

        mpsnl = d['snl_final'] if 'snl_final' in d else d['snl']
        snlgroup_id = d['snlgroup_id_final'] if 'snlgroup_id_final' in d else d[
            'snlgroup_id']
        update_spec.update({'mpsnl': mpsnl, 'snlgroup_id': snlgroup_id})

        print 'ENTERED task id:', t_id
        stored_data = {'task_id': t_id}
        if d['state'] == 'successful':
            update_spec['analysis'] = d['analysis']
            update_spec['output'] = d['output']
            update_spec['vasp'] = {
                'incar': d['calculations'][-1]['input']['incar'],
                'kpoints': d['calculations'][-1]['input']['kpoints']
            }
            update_spec["task_id"] = t_id
            return FWAction(stored_data=stored_data, update_spec=update_spec)

        # not successful - first test to see if UnconvergedHandler is needed
        if not fizzled_parent:
            unconverged_tag = 'unconverged_handler--{}'.format(
                fw_spec['prev_task_type'])
            output_dir = last_relax(os.path.join(prev_dir, 'vasprun.xml'))
            ueh = UnconvergedErrorHandler(output_filename=output_dir)
            # TODO: make this a little more flexible
            if ueh.check() and unconverged_tag not in fw_spec['run_tags']:
                print 'Unconverged run! Creating dynamic FW...'

                spec = {
                    'prev_vasp_dir': prev_dir,
                    'prev_task_type': fw_spec['task_type'],
                    'mpsnl': mpsnl,
                    'snlgroup_id': snlgroup_id,
                    'task_type': fw_spec['prev_task_type'],
                    'run_tags': list(fw_spec['run_tags']),
                    'parameters': fw_spec.get('parameters'),
                    '_dupefinder': DupeFinderVasp().to_dict(),
                    '_priority': fw_spec['_priority']
                }
                # Pass elastic tensor spec
                if 'deformation_matrix' in fw_spec.keys():
                    spec['deformation_matrix'] = fw_spec['deformation_matrix']
                    spec['original_task_id'] = fw_spec['original_task_id']
                snl = StructureNL.from_dict(spec['mpsnl'])
                spec['run_tags'].append(unconverged_tag)
                spec['_queueadapter'] = QA_VASP

                fws = []
                connections = {}

                f = Composition(snl.structure.composition.reduced_formula
                                ).alphabetical_formula

                fws.append(
                    Firework([
                        VaspCopyTask({
                            'files': [
                                'INCAR', 'KPOINTS', 'POSCAR', 'POTCAR',
                                'CONTCAR'
                            ],
                            'use_CONTCAR':
                            False
                        }),
                        SetupUnconvergedHandlerTask(),
                        get_custodian_task(spec)
                    ],
                             spec,
                             name=get_slug(f + '--' + spec['task_type']),
                             fw_id=-2))

                spec = {
                    'task_type': 'VASP db insertion',
                    '_allow_fizzled_parents': True,
                    '_priority': fw_spec['_priority'],
                    '_queueadapter': QA_DB,
                    'run_tags': list(fw_spec['run_tags'])
                }
                if 'deformation_matrix' in fw_spec.keys():
                    spec['deformation_matrix'] = fw_spec['deformation_matrix']
                    spec['original_task_id'] = fw_spec['original_task_id']
                spec['run_tags'].append(unconverged_tag)
                fws.append(
                    Firework([VaspToDBTask()],
                             spec,
                             name=get_slug(f + '--' + spec['task_type']),
                             fw_id=-1))
                connections[-2] = -1

                wf = Workflow(fws, connections)

                return FWAction(detours=wf)

        # not successful and not due to convergence problem - FIZZLE
        raise ValueError("DB insertion successful, but don't know how to \
                         fix this Firework! Can't continue with workflow...")
Ejemplo n.º 14
0
    def run_task(self, fw_spec):
        if '_fizzled_parents' in fw_spec and not 'prev_vasp_dir' in fw_spec:
            prev_dir = get_loc(fw_spec['_fizzled_parents'][0]['launches'][0]['launch_dir'])
            update_spec = {}  # add this later when creating new FW
            fizzled_parent = True
            parse_dos = False
        else:
            prev_dir = get_loc(fw_spec['prev_vasp_dir'])
            update_spec = {'prev_vasp_dir': prev_dir,
                           'prev_task_type': fw_spec['prev_task_type'],
                           'run_tags': fw_spec['run_tags'], 'parameters': fw_spec.get('parameters')}
            fizzled_parent = False
            parse_dos = 'Uniform' in fw_spec['prev_task_type']
        if 'run_tags' in fw_spec:
            self.additional_fields['run_tags'] = fw_spec['run_tags']
        else:
            self.additional_fields['run_tags'] = fw_spec['_fizzled_parents'][0]['spec']['run_tags']

        if MOVE_TO_GARDEN_DEV:
            prev_dir = move_to_garden(prev_dir, prod=False)

        elif MOVE_TO_GARDEN_PROD:
            prev_dir = move_to_garden(prev_dir, prod=True)

        # get the directory containing the db file
        db_dir = os.environ['DB_LOC']
        db_path = os.path.join(db_dir, 'tasks_db.json')

        logging.basicConfig(level=logging.INFO)
        logger = logging.getLogger('MPVaspDrone')
        logger.setLevel(logging.INFO)
        sh = logging.StreamHandler(stream=sys.stdout)
        sh.setLevel(getattr(logging, 'INFO'))
        logger.addHandler(sh)

        with open(db_path) as f:
            db_creds = json.load(f)
            drone = MPVaspDrone(
                host=db_creds['host'], port=db_creds['port'],
                database=db_creds['database'], user=db_creds['admin_user'],
                password=db_creds['admin_password'],
                collection=db_creds['collection'], parse_dos=parse_dos,
                additional_fields=self.additional_fields,
                update_duplicates=self.update_duplicates)
            t_id, d = drone.assimilate(prev_dir, launches_coll=LaunchPad.auto_load().launches)

        mpsnl = d['snl_final'] if 'snl_final' in d else d['snl']
        snlgroup_id = d['snlgroup_id_final'] if 'snlgroup_id_final' in d else d['snlgroup_id']
        update_spec.update({'mpsnl': mpsnl, 'snlgroup_id': snlgroup_id})

        print 'ENTERED task id:', t_id
        stored_data = {'task_id': t_id}
        if d['state'] == 'successful':
            update_spec['analysis'] = d['analysis']
            update_spec['output'] = d['output']
            return FWAction(stored_data=stored_data, update_spec=update_spec)

        # not successful - first test to see if UnconvergedHandler is needed
        if not fizzled_parent:
            unconverged_tag = 'unconverged_handler--{}'.format(fw_spec['prev_task_type'])
            output_dir = last_relax(os.path.join(prev_dir, 'vasprun.xml'))
            ueh = UnconvergedErrorHandler(output_filename=output_dir)
            if ueh.check() and unconverged_tag not in fw_spec['run_tags']:
                print 'Unconverged run! Creating dynamic FW...'

                spec = {'prev_vasp_dir': prev_dir,
                        'prev_task_type': fw_spec['task_type'],
                        'mpsnl': mpsnl, 'snlgroup_id': snlgroup_id,
                        'task_type': fw_spec['prev_task_type'],
                        'run_tags': list(fw_spec['run_tags']),
                        'parameters': fw_spec.get('parameters'),
                        '_dupefinder': DupeFinderVasp().to_dict(),
                        '_priority': fw_spec['_priority']}

                snl = StructureNL.from_dict(spec['mpsnl'])
                spec['run_tags'].append(unconverged_tag)
                spec['_queueadapter'] = QA_VASP

                fws = []
                connections = {}

                f = Composition.from_formula(
                    snl.structure.composition.reduced_formula).alphabetical_formula

                fws.append(FireWork(
                    [VaspCopyTask({'files': ['INCAR', 'KPOINTS', 'POSCAR', 'POTCAR', 'CONTCAR'],
                                   'use_CONTCAR': False}), SetupUnconvergedHandlerTask(),
                     get_custodian_task(spec)], spec, name=get_slug(f + '--' + spec['task_type']),
                    fw_id=-2))

                spec = {'task_type': 'VASP db insertion', '_allow_fizzled_parents': True,
                        '_priority': fw_spec['_priority'], '_queueadapter': QA_DB,
                        'run_tags': list(fw_spec['run_tags'])}
                spec['run_tags'].append(unconverged_tag)
                fws.append(
                    FireWork([VaspToDBTask()], spec, name=get_slug(f + '--' + spec['task_type']),
                             fw_id=-1))
                connections[-2] = -1

                wf = Workflow(fws, connections)

                return FWAction(detours=wf)

        # not successful and not due to convergence problem - FIZZLE
        raise ValueError("DB insertion successful, but don't know how to fix this FireWork! Can't continue with workflow...")