예제 #1
0
def _parse_args(**kwargs):
    """ Parses input arguments for stev2norm() and norm2stev().
    """
    # Some definitions
    Blms = ['B20', 'B21', 'B22', 'B40', 'B41', 'B42', 'B43', 'B44', 'B60', 'B61', 'B62', 'B63', 'B64', 'B65', 'B66']
    # Some Error checking
    if 'Ion' not in kwargs.keys() and 'IonNum' not in kwargs.keys():
        raise NameError('You must specify the ion using either the ''Ion'', ''IonNum'' keywords')
    if 'Ion' in kwargs.keys():
        nre = ionname2Nre(kwargs['Ion'])
    else:
        nre = kwargs['IonNum']
    # Now parses the list of input crystal field parameters
    par_names = []
    Blm = {}
    for pname in Blms:
        if pname in kwargs.keys():
            par_names.append(pname)
            Blm[pname] = kwargs[pname]
    if not par_names:
        if 'B' in kwargs.keys():
            for ind, pname in enumerate(Blms):
                par_names.append(pname)
                Blm[pname] = kwargs['B'][ind]
        else:
            raise NameError('You must specify at least one input Blm parameter')
    return nre, par_names, Blm
예제 #2
0
def _parse_args(**kwargs):
    """ Parses input arguments for stev2norm() and norm2stev().
    """
    # Some definitions
    Blms = [
        'B20', 'B21', 'B22', 'B40', 'B41', 'B42', 'B43', 'B44', 'B60', 'B61',
        'B62', 'B63', 'B64', 'B65', 'B66'
    ]
    # Some Error checking
    if 'Ion' not in kwargs.keys() and 'IonNum' not in kwargs.keys():
        raise NameError('You must specify the ion using either the '
                        'Ion'
                        ', '
                        'IonNum'
                        ' keywords')
    if 'Ion' in kwargs.keys():
        nre = ionname2Nre(kwargs['Ion'])
    else:
        nre = kwargs['IonNum']
    # Now parses the list of input crystal field parameters
    par_names = []
    Blm = {}
    for pname in Blms:
        if pname in kwargs.keys():
            par_names.append(pname)
            Blm[pname] = kwargs[pname]
    if not par_names:
        if 'B' in kwargs.keys():
            for ind, pname in enumerate(Blms):
                par_names.append(pname)
                Blm[pname] = kwargs['B'][ind]
        else:
            raise NameError(
                'You must specify at least one input Blm parameter')
    return nre, par_names, Blm
예제 #3
0
def split2range(*args, **kwargs):
    """ Calculates the ranges of (Stevens) crystal field parameters to give energy splittings
        around a specified a desired energy splitting

        ranges = split2range(ionname, energy_splitting, bnames)
        ranges = split2range(Ion=ionname, EnergySplitting=energy_splitting, Parameters=bnames)
        ranges = split2range(IonNum=ionnumber, EnergySplitting=energy_splitting, Parameters=bnames)
        ranges = split2range(PointGroup=point_group, EnergySplitting=energy_splitting, 'B20', 'B22', ...)
        ranges = split2range(PointGroup=point_group, EnergySplitting=energy_splitting, B20=_, B22=_, ...)
        ranges = split2range(..., Output='dictionary')
        constraint_string = split2range(..., Output='constraints')

        Inputs:
            ionname - name of the (tripositive) rare earth ion, e.g. 'Ce', 'Pr'.
            ionnumber - the number index of the rare earth ion:
                1=Ce 2=Pr 3=Nd 4=Pm 5=Sm 6=Eu 7=Gd 8=Tb 9=Dy 10=Ho 11=Er 12=Tm 13=Yb
            energy_splitting - the desired energy splitting (difference between the energies of the
                highest and lowest crystal field energy levels) in meV
            bnames - a list of names of the crystal field parameters to give the range for
            'B20', etc - the names of the parameters can be given as individual arguments or
                keyword arguments. In the case of keyword arguments, only the key names will be used

        Output:
            ranges - a dictionary of the ranges such that sampling uniformly in |Blm|<range[bnames]
                will produce crystal field splittings distributed normally around the input
                energy_splitting.
            constraint_string - a string of the form '-[range]<Blm<[range]' where [range] is the
                calculated range for that parameter.
            By default, the Output keyword is set to "dictionary".

        Note: ionname or ionnumber must be specified.
    """
    argin = {}
    argnames = ['Ion', 'EnergySplitting', 'Parameters', 'Output', 'IonNum']
    # Set default values.
    argin['Output'] = 'dictionary'
    argin['Parameters'] = []
    # Parses the non-keyword arguments
    for ia in range(3 if len(args)>3 else len(args)):
        argin[argnames[ia]] = args[ia]
    # Further arguments beyond the first 3 are treated as crystal field parameter names
    for ia in range(3, len(args)):
        if isinstance(args[ia], string_types) and args[ia].startswith('B'):
            argin['Parameters'].append(args[ia])
    # Parses the keyword arguments
    for key, value in iteritems(kwargs):
        for ia in range(len(argnames)):
            if key == argnames[ia]:
                argin[key] = value
                break
        if key.startswith('B'):
            argin['Parameters'].append(key)

    # Error checking
    if 'Ion' not in argin.keys() and 'IonNum' not in argin.keys():
        raise NameError('You must specify the ion using either the ''Ion'', ''IonNum'' keywords')
    if 'Ion' in argin.keys():
        nre = ionname2Nre(kwargs['Ion'])
    else:
        nre = argin['IonNum']
    if 'EnergySplitting' not in argin.keys():
        raise NameError('You must specify the desired energy splitting')
    if not argin['Parameters']:
        raise NameError('You must specify at least one crystal field parameter name')

    Nlm = {}
    for bname in set(argin['Parameters']):
        Nlm[bname] = 1
    Blm = norm2stev(IonNum=nre, **Nlm)
    ee, vv, ham = CFEnergy(nre, **Blm)
    # Factor of 2 is needed to get the Gaussian centred on the desired energy splitting.
    splitting_factor = 2 * argin['EnergySplitting'] / (np.max(ee-np.min(ee)))
    Nlm = {}
    for bname in Blm.keys():
        Nlm[bname] = splitting_factor
    ranges = norm2stev(IonNum=nre, **Nlm)

    if argin['Output'].lower() is 'constraints':
        constr = ''
        for bname in ranges.keys():
            constr += '%.4g<%s<%.4g,' % (-ranges[bname], bname, ranges[bname])
        return constr[:-1]
    else:
        return ranges
예제 #4
0
def split2range(*args, **kwargs):
    """ Calculates the ranges of (Stevens) crystal field parameters to give energy splittings
        around a specified a desired energy splitting

        ranges = split2range(ionname, energy_splitting, bnames)
        ranges = split2range(Ion=ionname, EnergySplitting=energy_splitting, Parameters=bnames)
        ranges = split2range(IonNum=ionnumber, EnergySplitting=energy_splitting, Parameters=bnames)
        ranges = split2range(PointGroup=point_group, EnergySplitting=energy_splitting, 'B20', 'B22', ...)
        ranges = split2range(PointGroup=point_group, EnergySplitting=energy_splitting, B20=_, B22=_, ...)
        ranges = split2range(..., Output='dictionary')
        constraint_string = split2range(..., Output='constraints')

        Inputs:
            ionname - name of the (tripositive) rare earth ion, e.g. 'Ce', 'Pr'.
            ionnumber - the number index of the rare earth ion:
                1=Ce 2=Pr 3=Nd 4=Pm 5=Sm 6=Eu 7=Gd 8=Tb 9=Dy 10=Ho 11=Er 12=Tm 13=Yb
            energy_splitting - the desired energy splitting (difference between the energies of the
                highest and lowest crystal field energy levels) in meV
            bnames - a list of names of the crystal field parameters to give the range for
            'B20', etc - the names of the parameters can be given as individual arguments or
                keyword arguments. In the case of keyword arguments, only the key names will be used

        Output:
            ranges - a dictionary of the ranges such that sampling uniformly in |Blm|<range[bnames]
                will produce crystal field splittings distributed normally around the input
                energy_splitting.
            constraint_string - a string of the form '-[range]<Blm<[range]' where [range] is the
                calculated range for that parameter.
            By default, the Output keyword is set to "dictionary".

        Note: ionname or ionnumber must be specified.
    """
    argin = {}
    argnames = ['Ion', 'EnergySplitting', 'Parameters', 'Output', 'IonNum']
    # Set default values.
    argin['Output'] = 'dictionary'
    argin['Parameters'] = []
    # Parses the non-keyword arguments
    for ia in range(3 if len(args) > 3 else len(args)):
        argin[argnames[ia]] = args[ia]
    # Further arguments beyond the first 3 are treated as crystal field parameter names
    for ia in range(3, len(args)):
        if isinstance(args[ia], str) and args[ia].startswith('B'):
            argin['Parameters'].append(args[ia])
    # Parses the keyword arguments
    for key, value in kwargs.items():
        for ia in range(len(argnames)):
            if key == argnames[ia]:
                argin[key] = value
                break
        if key.startswith('B'):
            argin['Parameters'].append(key)

    # Error checking
    if 'Ion' not in argin.keys() and 'IonNum' not in argin.keys():
        raise NameError('You must specify the ion using either the '
                        'Ion'
                        ', '
                        'IonNum'
                        ' keywords')
    if 'Ion' in argin.keys():
        nre = ionname2Nre(kwargs['Ion'])
    else:
        nre = argin['IonNum']
    if 'EnergySplitting' not in argin.keys():
        raise NameError('You must specify the desired energy splitting')
    if not argin['Parameters']:
        raise NameError(
            'You must specify at least one crystal field parameter name')

    Nlm = {}
    for bname in set(argin['Parameters']):
        Nlm[bname] = 1
    Blm = norm2stev(IonNum=nre, **Nlm)
    ee, vv, ham = CFEnergy(nre, **Blm)
    # Factor of 2 is needed to get the Gaussian centred on the desired energy splitting.
    splitting_factor = 2 * argin['EnergySplitting'] / (np.max(ee - np.min(ee)))
    Nlm = {}
    for bname in Blm.keys():
        Nlm[bname] = splitting_factor
    ranges = norm2stev(IonNum=nre, **Nlm)

    if argin['Output'].lower() == 'constraints':
        constr = ''
        for bname in ranges.keys():
            constr += '%.4g<%s<%.4g,' % (-ranges[bname], bname, ranges[bname])
        return constr[:-1]
    else:
        return ranges