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"
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"
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 = {}
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"
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"
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"