def test_expand(self): self.maxDiff = None spec = get_spec('GW') tests = SingleAbinitGWWork(structure, spec).convs tests_out = {'nscf_nbands': {'test_range': (40,), 'control': 'gap', 'method': 'set_bands', 'level': 'nscf'}, 'ecut': {'test_range': (52, 48, 44), 'control': 'e_ks_max', 'method': 'direct', 'level': 'scf'}, 'ecuteps': {'test_range': (4, 8, 12, 16, 20), 'control': 'gap', 'method': 'direct', 'level': 'sigma'}} self.assertEqual(expand(tests, 1), tests_out) spec.data['code'] = 'VASP' spec.update_code_interface() tests = GWG0W0VaspInputSet(structure, spec).convs tests_out = {'ENCUTGW': {'test_range': (200, 400, 600, 800), 'control': 'gap', 'method': 'incar_settings'}} self.assertEqual(expand(tests, 1), tests_out)
def test_expand(self): self.maxDiff = None spec = get_spec('GW') tests = SingleAbinitGWWork(structure, spec).convs tests_out = { 'nscf_nbands': { 'test_range': (40, ), 'control': 'gap', 'method': 'set_bands', 'level': 'nscf' }, 'ecut': { 'test_range': (50, 48, 46, 44), 'control': 'e_ks_max', 'method': 'direct', 'level': 'scf' }, 'ecuteps': { 'test_range': (4, 8, 12, 16, 20), 'control': 'gap', 'method': 'direct', 'level': 'sigma' } } self.assertEqual(expand(tests, 1), tests_out) spec.data['code'] = 'VASP' spec.update_code_interface() tests = GWG0W0VaspInputSet(structure, spec).convs tests_out = { 'ENCUTGW': { 'test_range': (200, 400, 600, 800), 'control': 'gap', 'method': 'incar_settings' } } self.assertEqual(expand(tests, 1), tests_out)
def excecute_flow(self, structure, spec_data): """ excecute spec prepare input/jobfiles or submit to fw for a given structure for vasp the different jobs are created into a flow todo this should actually create and excecute a VaspGWWorkFlow(GWWorkflow) """ ### general part for the base class grid = 0 all_done = False converged = is_converged(False, structure) try: grid = read_grid_from_file(s_name(structure)+".full_res")['grid'] all_done = read_grid_from_file(s_name(structure)+".full_res")['all_done'] except (IOError, OSError): pass if all_done: print('| all is done for this material') return ### specific part if spec_data['mode'] == 'fw': fw_work_flow = VaspGWFWWorkFlow() else: fw_work_flow = [] if spec_data['test'] or spec_data['converge']: if spec_data['test']: tests_prep = GWscDFTPrepVaspInputSet(structure, spec_data).tests tests_prep.update(GWDFTDiagVaspInputSet(structure, spec_data).tests) elif spec_data['converge'] and converged: tests_prep = self.get_conv_res_test(spec_data, structure)['tests_prep'] else: tests_prep = GWscDFTPrepVaspInputSet(structure, spec_data).convs tests_prep.update(GWDFTDiagVaspInputSet(structure, spec_data).convs) if grid > 0: tests_prep = expand(tests=tests_prep, level=grid) print(tests_prep) for test_prep in tests_prep: print('setting up test for: ' + test_prep) for value_prep in tests_prep[test_prep]['test_range']: print("**" + str(value_prep) + "**") option = {'test_prep': test_prep, 'value_prep': value_prep} self.create_job(spec_data, structure, 'prep', fw_work_flow, converged, option) for job in spec_data['jobs'][1:]: if job == 'G0W0': if spec_data['test']: tests = GWG0W0VaspInputSet(structure, spec_data).tests elif spec_data['converge'] and converged: tests = self.get_conv_res_test(spec_data, structure)['tests'] else: tests = GWG0W0VaspInputSet(structure, spec_data).convs if grid > 0: tests = expand(tests=tests, level=grid) print(tests) if job in ['GW0', 'scGW0']: input_set = GWG0W0VaspInputSet(structure, spec_data) input_set.gw0_on() if spec_data['test']: tests = input_set.tests else: tests = input_set.tests for test in tests: print(' setting up test for: ' + test) for value in tests[test]['test_range']: print(" **" + str(value) + "**") option.update({'test': test, 'value': value}) self.create_job(spec_data, structure, job, fw_work_flow, converged, option)
def create(self): """ create single abinit G0W0 flow """ manager = 'slurm' if 'ceci' in self.spec['mode'] else 'shell' # an AbiStructure object has an overwritten version of get_sorted_structure that sorts according to Z # this could also be pulled into the constructor of Abistructure #abi_structure = self.structure.get_sorted_structure() from abipy import abilab item = copy.copy(self.structure.item) self.structure.__class__ = abilab.Structure self.structure = self.structure.get_sorted_structure_z() self.structure.item = item abi_structure = self.structure manager = TaskManager.from_user_config() # Initialize the flow. flow = Flow(self.work_dir, manager, pickle_protocol=0) # flow = Flow(self.work_dir, manager) # kpoint grid defined over density 40 > ~ 3 3 3 if self.spec['converge'] and not self.all_converged: # (2x2x2) gamma centered mesh for the convergence test on nbands and ecuteps # if kp_in is present in the specs a kp_in X kp_in x kp_in mesh is used for the convergence studie if 'kp_in' in self.spec.keys(): if self.spec['kp_in'] > 9: print('WARNING:\nkp_in should be < 10 to generate an n x n x n mesh\nfor larger values a grid with ' 'density kp_in will be generated') scf_kppa = self.spec['kp_in'] else: scf_kppa = 2 else: # use the specified density for the final calculation with the converged nbands and ecuteps of other # stand alone calculations scf_kppa = self.spec['kp_grid_dens'] gamma = True # 'standard' parameters for stand alone calculation nb = self.get_bands(self.structure) nscf_nband = [10 * nb] nksmall = None ecuteps = [8] ecutsigx = 44 extra_abivars = dict( paral_kgb=1, inclvkb=2, ecut=44, pawecutdg=88, gwmem='10', getden=-1, istwfk="*1", timopt=-1, nbdbuf=8 ) # read user defined extra abivars from file 'extra_abivars' should be dictionary extra_abivars.update(read_extra_abivars()) #self.bands_fac = 0.5 if 'gwcomp' in extra_abivars.keys() else 1 #self.convs['nscf_nbands']['test_range'] = tuple([self.bands_fac*x for x in self.convs['nscf_nbands']['test_range']]) response_models = ['godby'] if 'ppmodel' in extra_abivars.keys(): response_models = [extra_abivars.pop('ppmodel')] if self.option is not None: for k in self.option.keys(): if k in ['ecuteps', 'nscf_nbands']: pass else: extra_abivars.update({k: self.option[k]}) if k == 'ecut': extra_abivars.update({'pawecutdg': self.option[k]*2}) try: grid = read_grid_from_file(s_name(self.structure)+".full_res")['grid'] all_done = read_grid_from_file(s_name(self.structure)+".full_res")['all_done'] workdir = os.path.join(s_name(self.structure), 'w'+str(grid)) except (IOError, OSError): grid = 0 all_done = False workdir = None if not all_done: if (self.spec['test'] or self.spec['converge']) and not self.all_converged: if self.spec['test']: print('| setting test calculation') tests = SingleAbinitGWWork(self.structure, self.spec).tests response_models = [] else: if grid == 0: print('| setting convergence calculations for grid 0') #tests = SingleAbinitGWWorkFlow(self.structure, self.spec).convs tests = self.convs else: print('| extending grid') #tests = expand(SingleAbinitGWWorkFlow(self.structure, self.spec).convs, grid) tests = expand(self.convs, grid) ecuteps = [] nscf_nband = [] for test in tests: if tests[test]['level'] == 'scf': if self.option is None: extra_abivars.update({test + '_s': tests[test]['test_range']}) elif test in self.option: extra_abivars.update({test: self.option[test]}) else: extra_abivars.update({test + '_s': tests[test]['test_range']}) else: for value in tests[test]['test_range']: if test == 'nscf_nbands': nscf_nband.append(value * self.get_bands(self.structure)) #scr_nband takes nscf_nbands if not specified #sigma_nband takes scr_nbands if not specified if test == 'ecuteps': ecuteps.append(value) if test == 'response_model': response_models.append(value) elif self.all_converged: print('| setting up for testing the converged values at the high kp grid ') # add a bandstructure and dos calculation nksmall = 30 # in this case a convergence study has already been performed. # The resulting parameters are passed as option ecuteps = [self.option['ecuteps'], self.option['ecuteps'] + self.convs['ecuteps']['test_range'][1] - self.convs['ecuteps']['test_range'][0]] nscf_nband = [self.option['nscf_nbands'], self.option['nscf_nbands'] + self.convs['nscf_nbands'][ 'test_range'][1] - self.convs['nscf_nbands']['test_range'][0]] # for option in self.option: # if option not in ['ecuteps', 'nscf_nband']: # extra_abivars.update({option + '_s': self.option[option]}) else: print('| all is done for this material') return logger.info('ecuteps : ', ecuteps) logger.info('extra : ', extra_abivars) logger.info('nscf_nb : ', nscf_nband) work = g0w0_extended_work(abi_structure, self.pseudo_table, scf_kppa, nscf_nband, ecuteps, ecutsigx, accuracy="normal", spin_mode="unpolarized", smearing=None, response_models=response_models, charge=0.0, sigma_nband=None, scr_nband=None, gamma=gamma, nksmall=nksmall, **extra_abivars) flow.register_work(work, workdir=workdir) return flow.allocate()
def excecute_flow(self, structure, spec_data): """ excecute spec prepare input/jobfiles or submit to fw for a given structure for vasp the different jobs are created into a flow todo this should actually create and excecute a VaspGWWorkFlow(GWWorkflow) """ ### general part for the base class grid = 0 all_done = False converged = is_converged(False, structure) try: grid = read_grid_from_file(s_name(structure) + ".full_res")['grid'] all_done = read_grid_from_file(s_name(structure) + ".full_res")['all_done'] except (IOError, OSError): pass if all_done: print('| all is done for this material') return ### specific part if spec_data['mode'] == 'fw': fw_work_flow = VaspGWFWWorkFlow() else: fw_work_flow = [] if spec_data['test'] or spec_data['converge']: if spec_data['test']: tests_prep = GWscDFTPrepVaspInputSet(structure, spec_data).tests tests_prep.update( GWDFTDiagVaspInputSet(structure, spec_data).tests) elif spec_data['converge'] and converged: tests_prep = self.get_conv_res_test(spec_data, structure)['tests_prep'] else: tests_prep = GWscDFTPrepVaspInputSet(structure, spec_data).convs tests_prep.update( GWDFTDiagVaspInputSet(structure, spec_data).convs) if grid > 0: tests_prep = expand(tests=tests_prep, level=grid) print(tests_prep) for test_prep in tests_prep: print('setting up test for: ' + test_prep) for value_prep in tests_prep[test_prep]['test_range']: print("**" + str(value_prep) + "**") option = {'test_prep': test_prep, 'value_prep': value_prep} self.create_job(spec_data, structure, 'prep', fw_work_flow, converged, option) for job in spec_data['jobs'][1:]: if job == 'G0W0': if spec_data['test']: tests = GWG0W0VaspInputSet( structure, spec_data).tests elif spec_data['converge'] and converged: tests = self.get_conv_res_test( spec_data, structure)['tests'] else: tests = GWG0W0VaspInputSet( structure, spec_data).convs if grid > 0: tests = expand(tests=tests, level=grid) print(tests) if job in ['GW0', 'scGW0']: input_set = GWG0W0VaspInputSet( structure, spec_data) input_set.gw0_on() if spec_data['test']: tests = input_set.tests else: tests = input_set.tests for test in tests: print(' setting up test for: ' + test) for value in tests[test]['test_range']: print(" **" + str(value) + "**") option.update({'test': test, 'value': value}) self.create_job(spec_data, structure, job, fw_work_flow, converged, option)
def create(self): """ create single abinit G0W0 flow """ manager = 'slurm' if 'ceci' in self.spec['mode'] else 'shell' # an AbiStructure object has an overwritten version of get_sorted_structure that sorts according to Z # this could also be pulled into the constructor of Abistructure #abi_structure = self.structure.get_sorted_structure() from abipy import abilab item = copy.copy(self.structure.item) self.structure.__class__ = abilab.Structure self.structure = self.structure.get_sorted_structure_z() self.structure.item = item abi_structure = self.structure manager = TaskManager.from_user_config() # Initialize the flow. flow = Flow(self.work_dir, manager, pickle_protocol=0) # flow = Flow(self.work_dir, manager) # kpoint grid defined over density 40 > ~ 3 3 3 if self.spec['converge'] and not self.all_converged: # (2x2x2) gamma centered mesh for the convergence test on nbands and ecuteps # if kp_in is present in the specs a kp_in X kp_in x kp_in mesh is used for the convergence studie if 'kp_in' in self.spec.keys(): if self.spec['kp_in'] > 9: print( 'WARNING:\nkp_in should be < 10 to generate an n x n x n mesh\nfor larger values a grid with ' 'density kp_in will be generated') scf_kppa = self.spec['kp_in'] else: scf_kppa = 2 else: # use the specified density for the final calculation with the converged nbands and ecuteps of other # stand alone calculations scf_kppa = self.spec['kp_grid_dens'] gamma = True # 'standard' parameters for stand alone calculation scf_nband = self.get_bands(self.structure) nscf_nband = [10 * scf_nband] nksmall = None ecuteps = [8] ecutsigx = 44 extra_abivars = dict(paral_kgb=1, inclvkb=2, ecut=44, pawecutdg=88, gwmem='10', getden=-1, istwfk="*1", timopt=-1, nbdbuf=8, prtsuscep=0) # read user defined extra abivars from file 'extra_abivars' should be dictionary extra_abivars.update(read_extra_abivars()) #self.bands_fac = 0.5 if 'gwcomp' in extra_abivars.keys() else 1 #self.convs['nscf_nbands']['test_range'] = tuple([self.bands_fac*x for x in self.convs['nscf_nbands']['test_range']]) response_models = ['godby'] if 'ppmodel' in extra_abivars.keys(): response_models = [extra_abivars.pop('ppmodel')] if self.option is not None: for k in self.option.keys(): if k in ['ecuteps', 'nscf_nbands']: pass else: extra_abivars.update({k: self.option[k]}) if k == 'ecut': extra_abivars.update({'pawecutdg': self.option[k] * 2}) try: grid = read_grid_from_file(s_name(self.structure) + ".full_res")['grid'] all_done = read_grid_from_file( s_name(self.structure) + ".full_res")['all_done'] workdir = os.path.join(s_name(self.structure), 'w' + str(grid)) except (IOError, OSError): grid = 0 all_done = False workdir = None if not all_done: if (self.spec['test'] or self.spec['converge']) and not self.all_converged: if self.spec['test']: print('| setting test calculation') tests = SingleAbinitGWWork(self.structure, self.spec).tests response_models = [] else: if grid == 0: print('| setting convergence calculations for grid 0') #tests = SingleAbinitGWWorkFlow(self.structure, self.spec).convs tests = self.convs else: print('| extending grid') #tests = expand(SingleAbinitGWWorkFlow(self.structure, self.spec).convs, grid) tests = expand(self.convs, grid) ecuteps = [] nscf_nband = [] for test in tests: if tests[test]['level'] == 'scf': if self.option is None: extra_abivars.update( {test + '_s': tests[test]['test_range']}) elif test in self.option: extra_abivars.update({test: self.option[test]}) else: extra_abivars.update( {test + '_s': tests[test]['test_range']}) else: for value in tests[test]['test_range']: if test == 'nscf_nbands': nscf_nband.append( value * self.get_bands(self.structure)) #scr_nband takes nscf_nbands if not specified #sigma_nband takes scr_nbands if not specified if test == 'ecuteps': ecuteps.append(value) if test == 'response_model': response_models.append(value) elif self.all_converged: print( '| setting up for testing the converged values at the high kp grid ' ) # add a bandstructure and dos calculation if os.path.isfile('bands'): nksmall = -30 #negative value > only bandstructure else: nksmall = 30 # in this case a convergence study has already been performed. # The resulting parameters are passed as option ecuteps = [ self.option['ecuteps'], self.option['ecuteps'] + self.convs['ecuteps']['test_range'][1] - self.convs['ecuteps']['test_range'][0] ] nscf_nband = [ self.option['nscf_nbands'], self.option['nscf_nbands'] + self.convs['nscf_nbands']['test_range'][1] - self.convs['nscf_nbands']['test_range'][0] ] # for option in self.option: # if option not in ['ecuteps', 'nscf_nband']: # extra_abivars.update({option + '_s': self.option[option]}) else: print('| all is done for this material') return logger.info('ecuteps : ', ecuteps) logger.info('extra : ', extra_abivars) logger.info('nscf_nb : ', nscf_nband) work = g0w0_extended_work(abi_structure, self.pseudo_table, scf_kppa, nscf_nband, ecuteps, ecutsigx, scf_nband, accuracy="normal", spin_mode="unpolarized", smearing=None, response_models=response_models, charge=0.0, sigma_nband=None, scr_nband=None, gamma=gamma, nksmall=nksmall, **extra_abivars) flow.register_work(work, workdir=workdir) return flow.allocate()