def add_scale(recipe: MyRecipe, gen: G, scale: bool = True) -> None: """Add the scale of the generator.""" if not scale: return recipe.addVar(gen.scale, value=0., name="{}_scale".format(gen.name), tags=["{}_scale".format(gen.name), "scale", gen.name]).boundRange(lb=0.) return
def add_lat(recipe: MyRecipe, gen: G, lat: tp.Union[str, None]) -> None: """Add the lattice parameters of the phase.""" if not lat: return if lat == "s": pars = gen.phase.sgpars.latpars elif lat == "a": pars = gen.phase.getLattice() else: raise ValueError("Unknown lat: {}. Allowed: sg, all.".format(lat)) for par in pars: recipe.addVar(par, name="{}_{}".format(gen.name, par.name), tags=["lat", gen.name, "{}_lat".format(gen.name)]).boundRange(lb=0.) return
def add_delta(recipe: MyRecipe, gen: G, delta: tp.Union[str, None]) -> None: """Add the delta parameter of the generator.""" if not delta: return if delta == "1": par = gen.delta1 elif delta == "2": par = gen.delta2 else: raise ValueError( "Unknown delta: {}. Allowed: delta1, delta2.".format(delta)) recipe.addVar(par, value=0., name="{}_{}".format(gen.name, par.name), tags=["{}_delta".format(gen.name), "delta", gen.name]).boundRange(lb=0.) return
def add_params(recipe: MyRecipe, con: MyContribution, params: tp.Union[None, str, tp.List[str]]) -> None: """Add contribution-level parameters in the contribution.""" if not params: return args = { arg.name: arg for eq in con.eqfactory.equations if eq.name == "eq" for arg in eq.args if arg.name != con.xname } if params == "a": pars = args.values() else: pars = [args[p] for p in params] for par in pars: recipe.addVar(par, tag=par.name.split("_")[0]) return
def add_adp( recipe: MyRecipe, gen: G, adp: tp.Union[str, None], symbols: tp.Tuple[str] = ("Biso", "B11", "B22", "B33") ) -> None: """Add the atomic displacement parameter of the phase.""" if not adp: return atoms = gen.phase.getScatterers() if adp == "e": elements = set((atom.element for atom in atoms)) dct = dict() for element in elements: dct[element] = recipe.newVar( "{}_{}_Biso".format(gen.name, bleach(element)), value=0.05, tags=["adp", gen.name, "{}_adp".format(gen.name)]) for atom in atoms: recipe.constrain(atom.Biso, dct[atom.element]) return if adp == "a": pars = [atom.Biso for atom in atoms] names = ["{}_Biso".format(bleach(atom.name)) for atom in atoms] elif adp == "s": pars = gen.phase.sgpars.adppars names = [ rename_by_atom(par.name, atoms) for par in pars if par.name.split("_")[0] in symbols ] else: raise ValueError( "Unknown adp: {}. Allowed: element, sg, all.".format(adp)) for par, name in zip(pars, names): recipe.addVar(par, name="{}_{}".format(gen.name, name), value=par.value if par.value != 0. else 0.05, tags=["adp", gen.name, "{}_adp".format(gen.name)]).boundRange(lb=0.) return
def add_xyz(recipe: MyRecipe, gen: G, xyz: tp.Union[str, None]) -> None: """Add the coordinates of the atoms in the phase.""" if not xyz: return atoms = gen.phase.getScatterers() if xyz == "s": pars = gen.phase.sgpars.xyzpars names = [rename_by_atom(par.name, atoms) for par in pars] elif xyz == "a": pars, names = list(), list() for atom in atoms: pars.append(atom.x) names.append("{}_x".format(atom.name)) pars.append(atom.y) names.append("{}_y".format(atom.name)) pars.append(atom.z) names.append("{}_z".format(atom.name)) else: raise ValueError("Unknown xyz: {}. Allowed: s, a.".format(xyz)) for par, name in zip(pars, names): recipe.addVar(par, name="{}_{}".format(gen.name, name), tags=["xyz", gen.name, "{}_xyz".format(gen.name)]) return