コード例 #1
0
def test_simplify_quantities():
    print "Testing simplification of quantities"
    from quantity import Constant, SpaceField, Quantities
    zero = Constant("zero", subfields=False, value=Value(0.0))
    C = Constant("C",
                 subfields=True,
                 value=Value("mat1", -1.25).set("mat2", -2.5))

    a = SpaceField("a", [3], subfields=True)
    b = SpaceField("b", [3])
    H_exch = SpaceField("H_exch", [3], subfields=True)
    rho = SpaceField("rho", [])
    M_sat = Constant("M_sat", [],
                     subfields=True,
                     value=Value("mat1", 1e6).set("mat2", 0.5e6))
    m = SpaceField("m", [3], subfields=True)
    qs = [C, a, b, H_exch, m, rho, M_sat]
    context = OpSimplifyContext(quantities=Quantities(qs),
                                material=["mat1", "mat2"],
                                is_periodic=True)

    # Testing the 'periodic' amendment
    pbc_in = \
        "C*<d/dxj H_exch(k)||d/dxj m(k)>; periodic:H_exch(k), j:1, k:3"
    # Expected result if context.is_periodic = True
    pbc_out_if_pbc = \
        ("  (-1.25)*<d/dxj H_exch_mat1(k)||d/dxj m_mat1(k)> "
         "+ (-2.5)*<d/dxj H_exch_mat2(k)||d/dxj m_mat2(k)>; "
         "periodic: H_exch_mat1(k); periodic: H_exch_mat2(k),"
         "j:1, k:3")
    # Expected result if context.is_periodic = False
    pbc_out_ifnot_pbc = \
        ("  (-1.25)*<d/dxj H_exch_mat1(k)||d/dxj m_mat1(k)> "
         "+ (-2.5)*<d/dxj H_exch_mat2(k)||d/dxj m_mat2(k)>, "
         "j:1, k:3")

    strings = {}
    strings[True] = \
        [("<a||b>", "<a_mat1||b> + <a_mat2||b>"),
         ("C*<d/dxj H_exch(k)||d/dxj m(k)>, j:1, k:3",
          "  (-1.25)*<d/dxj H_exch_mat1(k)||d/dxj m_mat1(k)> "
          "+ (-2.5)*<d/dxj H_exch_mat2(k)||d/dxj m_mat2(k)>,j:1, k:3"),
         ("M_sat*<rho||d/dxj m(j)> + M_sat*<rho||D/Dxj m(j)>, j:3",
          " 1000000.0*<rho||d/dxj m_mat1(j)> + "
          "1000000.0*<rho||D/Dxj m_mat1(j)> + "
          "500000.0*<rho||d/dxj m_mat2(j)> + "
          "500000.0*<rho||D/Dxj m_mat2(j)>, j:3"),
         (pbc_in, pbc_out_if_pbc)]

    strings[False] = [(pbc_in, pbc_out_ifnot_pbc)]

    for is_periodic in (False, True):
        context.is_periodic = is_periodic
        for string, result in strings[is_periodic]:
            parse_tree = parse(string).simplify(context=context)
            my_result = str(parse_tree)
            assert compare_strings(my_result, result), \
                ("Simplified of '%s' is '%s', but '%s' is expected."
                 % (string, my_result, result))
            print "passed"
コード例 #2
0
ファイル: test_eqparser_cc.py プロジェクト: anyint/nmag-src
def test_llg():
    print "Testing LLG single material"
    from quantity import Constant, SpaceField, Quantities
    C1 = Constant("C1", subfields=False, value=Value(-0.125))
    C2 = Constant("C2", subfields=False, value=Value(-0.0625))
    C3 = Constant("C3", subfields=False, value=Value(0.25))
    C4 = Constant("C4", subfields=False, value=Value(0.0))
    C5 = Constant("C5", subfields=False, value=Value(0.0))
    m = SpaceField("m", [3], subfields=True)
    dmdt = SpaceField("dmdt", [3], subfields=True)
    dm_dcurrent = SpaceField("dm_dcurrent", [3], subfields=False)
    pin = SpaceField("pin", subfields=False)
    H_total = SpaceField("H_total", [3], subfields=True)
    quantities = Quantities([C1, C2, C3, C4, C5, m, dmdt, dm_dcurrent, pin,
                             H_total])

    eq_rhs = """
      %range i:3;
      (dmdt(i) <-
         (  C1 * (eps(i,j,k) * m(j) * H_total(k))_(j:3,k:3)
          + C2 * (  eps(i,j,k) * m(j)
                  * eps(k,p,q) * m(p) * H_total(q))_(j:3,k:3,p:3,q:3)
          + C3 * (1.0 - (m(j)*m(j))_(j:3)) * m(i)
          + C4 * (  eps(i,j,k) * m(j)
                  * eps(k,p,q) * m(p) * dm_dcurrent(q))_(j:3,k:3,p:3,q:3)
          + C5 * (eps(i,j,k) * m(j) * dm_dcurrent(k))_(j:3,k:3))*pin)_(i:3);"""

    #eq_rhs = """dmdt(0) <- (-m(i))_(i:3);"""

    eq_ccode = """
    if (have_dmdt_a) {
      dmdt_a(0) = (-0.125*(m_a(1)*H_total_a(2) + -1.0*m_a(2)*H_total_a(1)) + -0.0625*(m_a(1)*m_a(0)*H_total_a(1) + -1.0*m_a(1)*m_a(1)*H_total_a(0) + m_a(2)*m_a(0)*H_total_a(2) + -1.0*m_a(2)*m_a(2)*H_total_a(0)) + 0.25*(1.0 - (m_a(0)*m_a(0) + m_a(1)*m_a(1) + m_a(2)*m_a(2)))*m_a(0))*pin;
    };
    if (have_dmdt_a) {
      dmdt_a(1) = (-0.125*(-1.0*m_a(0)*H_total_a(2) + m_a(2)*H_total_a(0)) + -0.0625*(-1.0*m_a(0)*m_a(0)*H_total_a(1) + m_a(0)*m_a(1)*H_total_a(0) + m_a(2)*m_a(1)*H_total_a(2) + -1.0*m_a(2)*m_a(2)*H_total_a(1)) + 0.25*(1.0 - (m_a(0)*m_a(0) + m_a(1)*m_a(1) + m_a(2)*m_a(2)))*m_a(1))*pin;
    };
    if (have_dmdt_a) {
      dmdt_a(2) = (-0.125*(m_a(0)*H_total_a(1) + -1.0*m_a(1)*H_total_a(0)) + -0.0625*(-1.0*m_a(0)*m_a(0)*H_total_a(2) + m_a(0)*m_a(2)*H_total_a(0) + -1.0*m_a(1)*m_a(1)*H_total_a(2) + m_a(1)*m_a(2)*H_total_a(1)) + 0.25*(1.0 - (m_a(0)*m_a(0) + m_a(1)*m_a(1) + m_a(2)*m_a(2)))*m_a(2))*pin;
    };"""

    context = EqSimplifyContext(quantities=quantities, material='a')
    context.expand_indices = True
    parse_tree = parse(eq_rhs).simplify(context=context)
    my_result = parse_tree.get_ccode() #.replace("\n", "")
    assert compare_strings(my_result, eq_ccode), \
     ("Simplified of '%s' is '%s', but '%s' is expected."
      % (eq_rhs, my_result, eq_ccode))
    print "passed"
コード例 #3
0
    def __init__(self, name, mesh, mesh_unit, region_materials,
                 min_region=-1):
        """
        :Parameters:
          `region_materials` : list of list of string

            region_materials[region_nr] is a list of names (strings) of field
            components (like "mat1", "mat2") available in the mesh region
            with number 'region_nr'. For example, for a mesh with three
            regions and region_materials=[["one", "two"], ["one", "three"],
            ["one"]], a field 'f' defined 'per-material' will have three
            sub-fields 'f_one', 'f_two' and 'f_three' with: 'f_one' defined
            everywhere, 'f_two' defined in region 0 and 'f_three' defined in
            region 1.
        """
        # Just save the relevant stuff
        self.name = name
        self.mesh = mesh
        self.mesh_unit = mesh_unit
        self.dim = mesh.dim
        self.region_materials = region_materials
        self.min_region = min_region

        self.regions = \
          MeshRegions(region_materials, min_region=min_region)

        # Things that get constructed when the object is "used"
        self.computations = Computations()
        self.quantities = Quantities()
        self.timesteppers = Timesteppers()

        # Initialise some members
        self.quantities.primary = None
        self.quantities.derived = None
        self.quantities.dependencies = None
        self.targets = []

        self.intensive_params = []

        self.elems_by_field = {}     # For each field: list of elems ordered
                                     # per region
        self.prototype_elems = []    # List of the prototype elements
        self.sibling_elems = {}
        self.mwes = {}               # All the MWEs
        self.lam = None
        self._built = {}
コード例 #4
0
ファイル: test_eqparser.py プロジェクト: anyint/nmag-src
def test_simplify_quantities():
    print "Testing simplification of quantities"
    from quantity import Constant, SpaceField, Quantities
    zero = Constant("zero", subfields=False, value=Value(0.0))
    gamma = Constant("gamma", subfields=False, value=Value(1.23))

    m = SpaceField("m", [3], subfields=True)
    H_ext = SpaceField("H_ext", [3])
    context = \
      EqSimplifyContext(quantities=Quantities([gamma, m, H_ext, zero]))
    strings = [("m(0) <- -zero*(m(1)*H_ext(2) - m(2)*H_ext(1));",
                "m(0) <- 0.0;")]
    for string, result in strings:
        parse_tree = parse(string).simplify(context=context)
        my_result = str(parse_tree).replace("\n", "")
        assert my_result == result, ("Simplified of '%s' is '%s', but '%s' "
                                     "is expected." %
                                     (string, my_result, result))
        print "passed"
コード例 #5
0
ファイル: test_eqparser.py プロジェクト: anyint/nmag-src
def test_llg_multimaterial():
    print "Testing LLG multi-material"
    from quantity import Constant, SpaceField, Quantities
    C1 = Constant("C1", subfields=False, value=Value(-0.125))
    C2 = Constant("C2", subfields=False, value=Value(-0.0625))
    C3 = Constant("C3", subfields=False, value=Value(0.25))
    C4 = Constant("C4", subfields=False, value=Value(0.0))
    C5 = Constant("C5", subfields=False, value=Value(0.0))
    m = SpaceField("m", [3], subfields=True)
    dmdt = SpaceField("dmdt", [3], subfields=True)
    dm_dcurrent = SpaceField("dm_dcurrent", [3], subfields=False)
    pin = SpaceField("pin", subfields=False)
    H_total = SpaceField("H_total", [3], subfields=True)
    quantities = Quantities(
        [C1, C2, C3, C4, C5, m, dmdt, dm_dcurrent, pin, H_total])

    eq_rhs = """%range i:3, j:3, k:3, p:3, q:3;
      dmdt(i) <- C1 * eps(i,j,k) * m(j) * H_total(k) * pin
               + C2 * eps(i,j,k) * m(j) * eps(k,p,q) * m(p) * H_total(q) * pin
               + C3 * (1.0 - m(j)*m(j)) * m(i) * pin
               + C4 * eps(i,j,k) * m(j) * eps(k,p,q) * m(p) * dm_dcurrent(q) * pin
               + C5 * eps(i,j,k) * m(j) * dm_dcurrent(k) * pin;"""

    result = condensed_string("""%range i:3, j:3, k:3, p:3, q:3;
      dmdt_Py(i) <-
          -0.125*eps(i,j,k)*m_Py(j)*H_total_Py(k)*pin
        + -0.0625*eps(i,j,k)*m_Py(j)*eps(k,p,q)*m_Py(p)*H_total_Py(q)*pin
        + 0.25*(1.0 - m_Py(j)*m_Py(j))*m_Py(i)*pin;

      dmdt_Co(i) <-
          -0.125*eps(i,j,k)*m_Co(j)*H_total_Co(k)*pin
        + -0.0625*eps(i,j,k)*m_Co(j)*eps(k,p,q)*m_Co(p)*H_total_Co(q)*pin
        + 0.25*(1.0 - m_Co(j)*m_Co(j))*m_Co(i)*pin;""")

    context = EqSimplifyContext(quantities=quantities, material=['Py', 'Co'])
    parse_tree = parse(eq_rhs).simplify(context=context)
    my_result = condensed_string(str(parse_tree))
    assert compare_strings(my_result, result), \
     ("Simplified of '%s' is '%s', but '%s' is expected."
      % (eq_rhs, my_result, result))
    print "passed"
コード例 #6
0
ファイル: test_eqparser.py プロジェクト: anyint/nmag-src
def test_multimaterial():
    print "Testing multimaterial simplification"
    from quantity import Constant, SpaceField, Quantities
    C1 = Constant("C1", subfields=False, value=Value(-0.17688))
    C2 = Constant("C2", subfields=True, value=Value(-0.08844))
    m = SpaceField("m", [3], subfields=True)
    dmdt = SpaceField("dmdt", [3], subfields=True)
    quantities = Quantities([C1, C2, m, dmdt])

    strings = [
        ("%range i:3; m <- 0;", "%range i:3; m_Py <- 0.0; m_Co <- 0.0;"),
    ]

    context = EqSimplifyContext(quantities=quantities, material=['Py', 'Co'])
    for string, result in strings:
        my_result = \
          str(parse(string).simplify(context=context)).replace("\n", "")
        assert compare_strings(my_result, result), \
          ("Simplified of '%s' is '%s', but '%s' is expected."
           % (string, my_result, result))
        print "passed"