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
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
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
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