Exemplo n.º 1
0
def extract_statical_polarizability(label,rtol,atol,path,input_for_alpha,posinp,code,ref):

    # seek for the field convergence
    ints=[1e-2,5e-3,1e-3,5e-4,1e-4]
    alpha_field=D.Dataset(label=label+'(field)',run_dir=path)
    for f in ints:
        alpha_field.append_run(id={'f':f},runner=SP.build_alpha_dataset(input=input_for_alpha,\
        posinp=posinp,run_dir=path,runner=code,intensity=f))
    try:
        data_field=alpha_field.seek_convergence(rtol=rtol,atol=atol)
        intensity=data_field[0]['f']
    except:
        print ('Convergence in field not reached')
        intensity=ints[-1]

    # seek for the rmult convergence
    rmult_fine=input_for_alpha['dft']['rmult'][1]
    rmult_list=map(float,range(int(input_for_alpha['dft']['rmult'][0]),11))
    alpha_rmult=D.Dataset(label=label+'(domain)',run_dir=path)
    for rm in rmult_list:
        input_for_alpha.set_rmult(coarse=rm,fine=rmult_fine)
        alpha_rmult.append_run(id={'f':intensity,'rmult':rm},\
        runner=SP.build_alpha_dataset(input=input_for_alpha,posinp=posinp,run_dir=path,runner=code,intensity=intensity))
    try:
        import numpy as np
        data_final=alpha_rmult.seek_convergence(rtol=rtol,atol=atol)
        AuToA = 0.5291772085**3
        alpha_ref_ii = np.array(ref)/AuToA
        eps = 100.0 * (data_final[1]-alpha_ref_ii)/alpha_ref_ii
        print ('Relative difference in %',eps.tolist())
    except LookupError as e:
        print ('Convergence in domain not reached',e)
        data_final=None
    return {'alpha_convergence': data_final, 'dataset_field': alpha_field, 'dataset_rmult': alpha_rmult}
def extract_statical_polarizability_linearity(label,rtol,atol,path,input_for_alpha,posinp,code,ref):

    #ints=[1e-2,5e-3,1e-3,5e-4,1e-4]
    ints= [1e-3,2e-3,3e-3,4e-3,5e-3] #for comparison with the MWL plots

    results = {}
    results['alpha_values'] = {}
    rmult_fine=input_for_alpha['dft']['rmult'][1]
    rmult_list=map(float,range(int(input_for_alpha['dft']['rmult'][0]),15))
    for intensity in ints:

        # seek for the rmult convergence
        alpha_rmult=D.Dataset(label=label+'(domain)',run_dir=path)
        for rm in rmult_list:
            input_for_alpha.set_rmult(coarse=rm,fine=rmult_fine)
            alpha_rmult.append_run(id={'f':intensity,'rmult':rm},\
            runner=SP.build_alpha_dataset(input=input_for_alpha,posinp=posinp,run_dir=path,runner=code,intensity=intensity))

        try:
            import numpy as np
            data_final=alpha_rmult.seek_convergence(rtol=rtol,atol=atol)
            AuToA = 0.5291772085**3
            alpha_ref_ii = np.array(ref)/AuToA
            eps = 100.0 * (data_final[1]-alpha_ref_ii)/alpha_ref_ii
            print ('Relative difference in %',eps.tolist())
        except LookupError as e:
            print ('Convergence in domain not reached',e)
            data_final=None

        results['alpha_values'][intensity] = {'alpha_convergence': data_final, 'dataset_rmult': alpha_rmult}
    return results
Exemplo n.º 3
0
def find_gs_domain(label,rtol,atol,path,input,posinp,code):
    """
    Use the seek_convergence method of Dataset to perform a convergence procedure on
    the rmult value for a gs computation.
    """
    crmult=input['dft']['rmult'][0]
    rmult_fine=input['dft']['rmult'][1]
    rmult_list=map(float,range(int(crmult),11))
    seek_for_rmult = D.Dataset(label=label+'(GS)',run_dir=path,posinp=posinp)
    for rm in rmult_list:
        input.set_rmult(coarse=rm,fine=rmult_fine)
        seek_for_rmult.append_run(id={'rmult':rm},runner=code,input=input)
    input_gs,log_gs=get_converged_input_energy(seek_for_rmult,rtol,atol)
    return {'input_gs':input_gs, 'dataset_gs': seek_for_rmult,'log_gs':log_gs}
def build_alpha_dataset(**kwargs):
    """
    Create the dataset and append the runs needed to compute the statical polarizability
    for a specific choice of the input parameters. Set also a postprocessing function
    to extract the value of alpha. The postprocessing function is set to the :py:func:`eval_alpha` function

    Args:
        kwargs['run_dir']   : th run_dir
        kwargs['intensity'] : the intensity of the field
        kwargs['input']     : the input file
        kwargs['posinp']    : the posinp
        kwargs['runner']    : the instance of SystemCalculator
    """
    from BigDFT import InputActions as A, Datasets as D
    lbl = 'alpha_' + str(kwargs['intensity'])
    study = D.Dataset(label=lbl, **kwargs)
    study.set_postprocessing_function(eval_alpha)
    #study.set_postprocessing_function(eval_alpha_from_energy)

    f = kwargs['intensity']
    inp = kwargs['input']
    hgrids = inp['dft']['hgrids']
    gnrm_cv = inp['dft']['gnrm_cv']
    for ind, sign in enumerate(['+', '-']):
        for idir, coord in enumerate(['x', 'y', 'z']):
            el = np.zeros(3)
            el[idir] = (1 - 2 * ind) * f
            inp.apply_electric_field(el.tolist())
            idd = {
                'hgrids': hgrids,
                'gnrm_cv': gnrm_cv,
                'rmult': inp['dft']['rmult'][0],
                'dir': coord,
                'sign': sign,
                'F': f
            }
            study.append_run(process_id_default_values(idd),
                             runner=kwargs['runner'],
                             input=inp)
    return study
Exemplo n.º 5
0
def build_alpha_dataset(**kwargs):
    """
    Create the dataset and append the runs needed to compute the statical polarizability
    for a specific choice of the input parameters. Set also a postprocessing function
    to extract the value of alpha.

    Args:
        kwargs['run_dir']   : th run_dir
        kwargs['intensity'] : the intensity of the field
        kwargs['input']     : the input file
        kwargs['posinp']    : the posinp
        kwargs['ppf']       : the postprocessing function
        kwargs['runner']    : the instance of SystemCalculator
    """
    lbl = 'alpha_' + str(kwargs['intensity'])
    study = D.Dataset(label=lbl,
                      run_dir=kwargs['run_dir'],
                      intensity=kwargs['intensity'],
                      posinp=kwargs['posinp'])
    study.set_postprocessing_function(kwargs['ppf'])

    f = kwargs['intensity']
    inp = kwargs['input']
    for ind, sign in enumerate(['+', '-']):
        for idir, coord in enumerate(['x', 'y', 'z']):
            el = np.zeros(3)
            el[idir] = (1 - 2 * ind) * f
            inp.apply_electric_field(el.tolist())
            idd = {
                'rmult': inp['dft']['rmult'][0],
                'dir': coord,
                'sign': sign,
                'F': f
            }
            study.append_run(id=idd, runner=kwargs['runner'], input=inp)

    return study
Exemplo n.º 6
0
def nsp_workflow(alpha_conv=1.0e-2,wf_convergence=1.0e-6,hgrids=0.3,\
                 rmult_fine=9.0,term_verb=True,data_folder='Data',**kwargs):
    """
    Perform the complete nsp workflow to compute the statical polarizability
    of a molecule in a specific study(xc+psp)

    Args:
        kwargs['molecule']  : the molecule type
        kwargs['study']     : the tuple (xc,psp)
        kwargs['code']      : the instance of SystemCalculator
    """
    molecule = kwargs['molecule']
    study = kwargs['study']
    code = kwargs['code']
    code.update_global_options(verbose=term_verb)

    results = {}

    if not os.path.isdir(data_folder): os.mkdir(data_folder)
    os.chdir(data_folder)
    if not os.path.isdir(molecule): os.mkdir(molecule)
    os.chdir(molecule)
    path = study[0] + '-' + study[1]
    if not os.path.isdir(path): os.mkdir(path)

    print 'Compute alpha for : ', molecule, study[0], study[1]

    posinp = Molecules.Molecule(molecule)

    #rel tol for the gs convergence (using the total energy as control quantity)
    gs_rtol = 10 * wf_convergence

    inp = I.Inputfile()
    inp.set_hgrid(hgrids)
    set_xc[study](inp, molecule)
    inp.set_wavefunction_convergence(wf_convergence)

    if term_verb: print 'Seek for gs convergence'

    rmult_coarse = [1.0 * i for i in range(3, 12)]
    data = []
    for r in rmult_coarse:
        gs_study = D.Dataset(label=molecule + '_GS',
                             run_dir=path,
                             posinp=posinp)
        gs_study.set_postprocessing_function(SP.get_energy)
        inp.set_rmult(coarse=r, fine=rmult_fine)
        idd = {'rmult': r}
        gs_study.append_run(id=idd, runner=code, input=inp)
        data.append(gs_study)

    results['gs_conv'] = SP.seek_convergence(rt=gs_rtol,term_verb=term_verb,\
                       label='rmult',values=rmult_coarse,data=data)

    if term_verb: print 'Seek for alpha convergence'

    # field intensity convergence
    gs_conv = results['gs_conv']['converged_value']
    inp.set_rmult(coarse=gs_conv, fine=rmult_fine)
    if term_verb: print 'Convergence on the field intensity'
    results['field_conv']=SP.perform_field_convergence(term_verb=term_verb,rt=alpha_conv,\
    run_dir=path,input=inp,runner=code,posinp=posinp,ppf=SP.eval_alpha)
    f = results['field_conv']['converged_value']

    # rmult convergence
    rmult_list = SP.build_rmult_list([gs_conv, rmult_fine])
    if term_verb: print 'Convergence on rmult'
    results['rmult_conv']=SP.perform_rmult_convergence(term_verb=term_verb,\
    rt=alpha_conv,run_dir=path,intensity=f,rmult=rmult_list,input=inp,\
    runner=code,posinp=posinp,ppf=SP.eval_alpha)

    os.chdir('../../')
    return results
Exemplo n.º 7
0
def single_study_workflow(alpha_conv=1.0e-2,
                          wf_convergence=1.0e-6,
                          hgrids=0.3,
                          rmult_fine=9.0,
                          term_verb=True,
                          **kwargs):
    """
    Perform the complete workflow to compute the statical polarizability
    of a specific study(molecule+xc+psp)

    Args:
        kwargs['molecule']  : the molecule type
        kwargs['xc']        : the xc functional
        kwargs['psp']       : the pseudopotential
    """
    molecule = kwargs['molecule']
    xc = kwargs['xc']
    psp = kwargs['psp']

    study = {}

    if not os.path.isdir(molecule): os.mkdir(molecule)
    os.chdir(molecule)
    path = xc + '-' + psp
    if not os.path.isdir(path): os.mkdir(path)

    print ''
    print 'Compute alpha for : ', molecule, xc, psp

    posinp = Molecules.Molecule(molecule)

    gs_rtol = 10 * wf_convergence  #rel tol for the gs convergence (using the total energy as control quantity)

    inp = I.Inputfile()
    inp.set_hgrid(hgrids)
    inp.set_xc(xc.upper())
    inp.set_wavefunction_convergence(wf_convergence)

    #gs convergence
    rmult_coarse = [1.0 * i for i in range(3, 12)]
    data = []
    code = C.SystemCalculator(skip=True, verbose=False)
    for r in rmult_coarse:
        gs_study = D.Dataset(label=molecule + '_GS',
                             run_dir=path,
                             posinp=posinp)
        gs_study.set_postprocessing_function(SP.get_energy)
        inp.set_rmult(coarse=r, fine=rmult_fine)
        idd = {'rmult': r}
        gs_study.append_run(id=idd, runner=code, input=inp)
        data.append(gs_study)
    if term_verb: print 'Seek for gs convergence'
    study['gs_conv'] = SP.seek_convergence(rt=gs_rtol,
                                           term_verb=term_verb,
                                           label='rmult',
                                           values=rmult_coarse,
                                           data=data)

    if term_verb: print 'Seek for alpha convergence'
    # alpha field intensity convergence
    conv_val = study['gs_conv']['converged_value']
    gslog = 'log-' + data[rmult_coarse.index(conv_val)].names[0] + '.yaml'
    gs = lf.Logfile(path + os.sep + gslog)
    inp.set_rmult(gs.log['dft']['rmult'])
    if term_verb: 'Convergence on the field intensity'
    study['field_conv'] = SP.perform_field_convergence(term_verb=term_verb,
                                                       rt=alpha_conv,
                                                       run_dir=path,
                                                       input=inp,
                                                       runner=code,
                                                       posinp=posinp,
                                                       ppf=SP.eval_alpha)
    f = study['field_conv']['converged_value']
    # alpha rmult convergence
    rmult_list = SP.build_rmult_list(gs)
    if term_verb: 'Convergence on rmult'
    study['rmult_conv'] = SP.perform_rmult_convergence(term_verb=term_verb,
                                                       rt=alpha_conv,
                                                       run_dir=path,
                                                       intensity=f,
                                                       rmult=rmult_list,
                                                       input=inp,
                                                       runner=code,
                                                       posinp=posinp,
                                                       ppf=SP.eval_alpha)

    os.chdir('../')
    return study