def profile(self, extra=False): """ Calculates the volume fraction profile Returns ------- z, vfp : np.ndarray Distance from the interface, volume fraction profile """ s = Structure() s |= SLD(0) m = SLD(1.) for i, slab in enumerate(self.left_slabs): layer = m(slab.thick.value, slab.rough.value) if not i: layer.rough.value = 0 layer.vfsolv.value = slab.vfsolv.value s |= layer polymer_slabs = self.slabs() offset = np.sum(s.slabs()[:, 0]) if polymer_slabs is not None: for i in range(np.size(polymer_slabs, 0)): layer = m(polymer_slabs[i, 0], polymer_slabs[i, 3]) layer.vfsolv.value = polymer_slabs[i, -1] s |= layer for i, slab in enumerate(self.right_slabs): layer = m(slab.thick.value, slab.rough.value) layer.vfsolv.value = 1 - slab.vfsolv.value s |= layer s |= SLD(0, 0) # now calculate the VFP. total_thickness = np.sum(s.slabs()[:, 0]) zed = np.linspace(0, total_thickness, total_thickness + 1) # SLD profile puts a very small roughness on the interfaces with zero # roughness. zed[0] = 0.01 z, s = s.sld_profile(z=zed) s[0] = s[1] # perhaps you'd like to plot the knot locations zeds = np.cumsum(self.dz) if np.sum(self.dz) > 1: zeds /= np.sum(self.dz) zeds = np.clip(zeds, 0, 1) zed_knots = zeds * float(self.extent) + offset if extra: return z, s, zed_knots, np.array(self.vf) else: return z, s
def test_stack(self): stk = Stack() slabs = stk.slabs(None) assert (slabs is None) si = SLD(2.07) sio2 = SLD(3.47) polymer = SLD(1.0) d2o = SLD(6.36) # check some initial stack properties stk.append(sio2(55, 4)) slabs = stk.slabs(None) assert (slabs.shape == (1, 5)) assert_equal(np.sum(slabs[:, 0]), 55) assert_equal(slabs[0, 1], 3.47) stk.repeats.value = 3.2 slabs = stk.slabs(None) assert (slabs.shape == (3, 5)) assert_equal(np.sum(slabs[:, 0]), 165) # ior a Stack and a Component stk |= polymer(110, 3.5) assert_equal(len(stk), 2) assert (isinstance(stk, Stack)) assert_almost_equal(stk.repeats, 3.2) slabs = stk.slabs() assert (slabs.shape == (6, 5)) assert_equal(np.sum(slabs[:, 0]), 495) # place a stack into a structure s = si | d2o(10, 3) | stk | d2o assert (isinstance(s, Structure)) slabs = s.slabs() assert_equal(slabs[:, 0], [0, 10, 55, 110, 55, 110, 55, 110, 0]) assert_equal(slabs[:, 1], [2.07, 6.36, 3.47, 1.0, 3.47, 1.0, 3.47, 1.0, 6.36]) assert_equal(slabs[:, 3], [0, 3, 4, 3.5, 4, 3.5, 4, 3.5, 0]) # what are the interfaces of the Stack assert_equal(len(stk.interfaces), len(stk.slabs())) assert_equal(len(list(flatten(s.interfaces))), len(s.slabs())) # ior a Structure and a Stack s = Structure(components=[si(), d2o(10, 3)]) s |= stk s |= d2o assert (isinstance(s, Structure)) assert_equal(s.slabs()[:, 0], [0, 10, 55, 110, 55, 110, 55, 110, 0]) assert_equal(s.slabs()[:, 1], [2.07, 6.36, 3.47, 1.0, 3.47, 1.0, 3.47, 1.0, 6.36]) q = repr(s) r = eval(q) assert_equal(r.slabs()[:, 0], [0, 10, 55, 110, 55, 110, 55, 110, 0]) assert_equal(r.slabs()[:, 1], [2.07, 6.36, 3.47, 1.0, 3.47, 1.0, 3.47, 1.0, 6.36]) s |= stk assert (isinstance(s.components[-1], Stack)) import pytest with pytest.raises(ValueError): s.slabs()