def itest_relaxation_with_target_dilatmx(fwp, tvars): """Test structural relaxations with automatic restart from DEN files.""" # Build the flow flow = flowtk.Flow(fwp.workdir, manager=fwp.manager) # Use small value for ntime to trigger restart, then disable the output of the WFK file. ion_input, ioncell_input = make_ion_ioncell_inputs(tvars, dilatmx=1.05) target_dilatmx = 1.03 relax_work = flowtk.RelaxWork(ion_input, ioncell_input, target_dilatmx=target_dilatmx) flow.register_work(relax_work) assert flow.make_scheduler().start() == 0 flow.show_status() assert all(work.finalized for work in flow) assert flow.all_ok #assert relax_work.last_dilatmx <= target_dilatmx # we should have (0, 1) restarts for i, task in enumerate(relax_work): assert task.status == task.S_OK assert task.num_restarts == i assert task.num_corrections == 0 assert relax_work[1].input["dilatmx"] == 1.03 flow.rmtree()
def itest_relaxation_with_restart_from_den(fwp, tvars): """Test structural relaxations with automatic restart from DEN files.""" # Build the flow flow = flowtk.Flow(fwp.workdir, manager=fwp.manager) # Use small value for ntime to trigger restart, then disable the output of the WFK file. ion_input, ioncell_input = make_ion_ioncell_inputs(tvars, dilatmx=1.1, ntime=3) ion_input.set_vars(prtwf=0) ioncell_input.set_vars(prtwf=0) relax_work = flowtk.RelaxWork(ion_input, ioncell_input) flow.register_work(relax_work) assert flow.make_scheduler().start() == 0 flow.show_status() assert all(work.finalized for work in flow) assert flow.all_ok # we should have (0, 1) restarts and no WFK file in outdir. for i, task in enumerate(relax_work): assert task.status == task.S_OK assert task.num_restarts == i assert task.num_corrections == 0 assert not task.outdir.has_abiext("WFK") if has_matplotlib: assert relax_work.plot_ion_relaxation(show=False) is not None assert relax_work.plot_ioncell_relaxation(show=False) is not None flow.rmtree()
def build_flow(options): # Working directory (default is the name of the script with '.py' removed and "run_" replaced by "flow_") if not options.workdir: if os.getenv("READTHEDOCS", False): __file__ = os.path.join(os.getcwd(), "run_relax.py") options.workdir = os.path.basename(__file__).replace( ".py", "").replace("run_", "flow_") # Create the flow flow = flowtk.Flow(options.workdir, manager=options.manager) # Create a relaxation work and add it to the flow. ion_inp, ioncell_inp = make_ion_ioncell_inputs() relax_work = flowtk.RelaxWork(ion_inp, ioncell_inp) flow.register_work(relax_work) #bands_work = flowtk.BandStructureWork(scf_input, nscf_input) bands_work = flowtk.Work() deps = {relax_work[-1]: "@structure"} deps = { relax_work[-1]: ["DEN", "@structure"] } # --> This is not possible because the file ext is changed! #deps = {relax_work[-1]: ["WFK", "@structure"]} # --> This triggers an infamous bug in abinit bands_work.register_relax_task(ioncell_inp, deps=deps) flow.register_work(bands_work) return flow
def itest_relaxation_with_target_dilatmx(fwp, tvars): """Test structural relaxations with automatic restart from DEN files.""" # Build the flow flow = flowtk.Flow(fwp.workdir, manager=fwp.manager) # Use small value for ntime to trigger restart, then disable the output of the WFK file. ion_input, ioncell_input = make_ion_ioncell_inputs(tvars, dilatmx=1.05) target_dilatmx = 1.03 relax_work = flowtk.RelaxWork(ion_input, ioncell_input, target_dilatmx=target_dilatmx) flow.register_work(relax_work) assert flow.make_scheduler().start() == 0 flow.show_status() assert all(work.finalized for work in flow) if not flow.all_ok: flow.debug() raise RuntimeError() #assert relax_work.last_dilatmx <= target_dilatmx # we should have (0, 1) restarts for i, task in enumerate(relax_work): assert task.status == task.S_OK assert task.num_restarts == i assert task.num_corrections == 0 assert relax_work[1].input["dilatmx"] == 1.03 # check that when decreasing the dilatmx it actually takes the previously relaxed # structure and does not start from scratch again: the lattice should not be the same. assert not np.allclose(relax_work.ion_task.get_final_structure().lattice_vectors(), relax_work.ioncell_task.input.structure.lattice_vectors()) flow.rmtree()
def build_flow(options): # Working directory (default is the name of the script with '.py' removed and "run_" replaced by "flow_") if not options.workdir: if os.getenv("READTHEDOCS", False): __file__ = os.path.join(os.getcwd(), "run_relax_and_ebands.py") options.workdir = os.path.basename(__file__).replace( ".py", "").replace("run_", "flow_") # Create the flow flow = flowtk.Flow(options.workdir, manager=options.manager) paral_kgb = 1 #paral_kgb = 0 # This one is OK # Create a relaxation work and add it to the flow. ion_inp, ioncell_inp = make_ion_ioncell_inputs(paral_kgb=paral_kgb) relax_work = flowtk.RelaxWork(ion_inp, ioncell_inp) flow.register_work(relax_work) scf_inp, nscf_inp = make_scf_nscf_inputs(paral_kgb=paral_kgb) bands_work = flowtk.BandStructureWork(scf_inp, nscf_inp) # The scf task in bands work restarts from the DEN file of the last task in relax_work if paral_kgb == 0: # cg works fine if we restart from the WFK bands_work.scf_task.add_deps({relax_work[-1]: "WFK"}) else: # --> This triggers an infamous bug in abinit bands_work.scf_task.add_deps({relax_work[-1]: "WFK"}) # --> This is ok if we used fourier_interp to change the FFT mesh. #bands_work.scf_task.add_deps({relax_work[-1]: "DEN"}) # All task in bands_work will fetch the relaxed structure from the last task in relax_work for task in bands_work: task.add_deps({relax_work[-1]: "@structure"}) flow.register_work(bands_work) flow.allocate() flow.use_smartio() flow.set_garbage_collector() return flow