示例#1
0
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
示例#2
0
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
示例#3
0
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
示例#4
0
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
示例#5
0
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
示例#6
0
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