示例#1
0
    def test_spbox_2d(self):
        """
        Check position of a given vertex in the deformed mesh.
        """
        mesh = Mesh.from_file(data_dir + '/meshes/2d/square_tri1.mesh')
        spb = SplineBox([[-1, 1], [-1, 0.6]], mesh.coors, nsg=[2, 1])
        spb.move_control_point(1, [0.1, -0.2])
        spb.move_control_point(2, [0.2, -0.3])
        spb.move_control_point(3, [0.0, -0.1])

        pt0 = mesh.coors[175, :].copy()
        mesh.cmesh.coors[:] = spb.evaluate()
        pt1 = mesh.coors[175, :]

        expected_distance = 0.165892726387
        actual_distance = nm.linalg.norm(pt0 - pt1)
        ok = nm.fabs(actual_distance - expected_distance)\
            / expected_distance < tolerance

        if not ok:
            self.report('expected distance:')
            self.report(expected_distance)
            self.report('actual distance:')
            self.report(actual_distance)

        return ok
示例#2
0
    def test_spbox_2d(self):
        """
        Check position of a given vertex in the deformed mesh.
        """
        mesh = Mesh.from_file(data_dir + '/meshes/2d/square_tri1.mesh')
        spb = SplineBox([[-1, 1], [-1, 0.6]], mesh.coors, nsg=[2,1])
        spb.move_control_point(1, [0.1, -0.2])
        spb.move_control_point(2, [0.2, -0.3])
        spb.move_control_point(3, [0.0, -0.1])

        pt0 = mesh.coors[175,:].copy()
        mesh.cmesh.coors[:] = spb.evaluate()
        pt1 = mesh.coors[175,:]

        expected_distance = 0.165892726387
        actual_distance = nm.linalg.norm(pt0 - pt1)
        ok = nm.fabs(actual_distance - expected_distance)\
            / expected_distance < tolerance

        if not ok:
            self.report('expected distance:')
            self.report(expected_distance)
            self.report('actual distance:')
            self.report(actual_distance)

        return ok
示例#3
0
    def test_spbox_3d(self):
        """
        Check volume change of the mesh which is deformed using
        the SplineBox functions.
        """
        from sfepy.discrete.fem import Mesh
        from sfepy.mesh.splinebox import SplineBox
        mesh = Mesh.from_file(data_dir + '/meshes/3d/cylinder.vtk')
        conn = mesh.get_conn('3_4')
        vol0 = tetravolume(conn, mesh.coors)

        bbox = nm.array(mesh.get_bounding_box()).T
        spbox = SplineBox(bbox, mesh.coors)
        cpoints0 = spbox.get_control_points(init=True)

        for ii in range(4):
            for jj in range(4):
                spbox.move_control_point((0, ii, jj), [-0.02, 0, 0])
        coors = spbox.evaluate()
        vol1 = tetravolume(conn, coors)
        mesh.coors[:] = coors

        spbox.set_control_points(cpoints0)
        coors = spbox.evaluate()
        vol2 = tetravolume(conn, coors)

        ok = True
        actual_volumes = (vol0, vol1, vol2)
        expected_volumes = (1.22460186e-4, 1.46950423e-4, 1.22460186e-4)

        for ii in range(3):
            relerr = abs(actual_volumes[ii] - expected_volumes[ii])\
                     / expected_volumes[ii]
            ok = ok and (relerr < tolerance)

        if not ok:
            self.report('expected volumes:')
            self.report(expected_volumes)
            self.report('actual volumes:')
            self.report(actual_volumes)

        return ok
示例#4
0
    def test_spbox_3d(self):
        """
        Check volume change of the mesh which is deformed using
        the SplineBox functions.
        """
        from sfepy.discrete.fem import Mesh
        from sfepy.mesh.splinebox import SplineBox
        mesh = Mesh.from_file(data_dir + '/meshes/3d/cylinder.vtk')
        conn = mesh.get_conn('3_4')
        vol0 = tetravolume(conn, mesh.coors)

        bbox = nm.array(mesh.get_bounding_box()).T
        spbox = SplineBox(bbox, mesh.coors)
        cpoints0 = spbox.get_control_points(init=True)

        for ii in range(4):
            for jj in range(4):
                spbox.move_control_point((0, ii, jj), [-0.02, 0, 0])
        coors = spbox.evaluate()
        vol1 = tetravolume(conn, coors)
        mesh.coors[:] = coors

        spbox.set_control_points(cpoints0)
        coors = spbox.evaluate()
        vol2 = tetravolume(conn, coors)

        ok = True
        actual_volumes = (vol0, vol1, vol2)
        expected_volumes = (1.22460186e-4, 1.46950423e-4, 1.22460186e-4)

        for ii in range(3):
            relerr = abs(actual_volumes[ii] - expected_volumes[ii])\
                     / expected_volumes[ii]
            ok = ok and (relerr < tolerance)

        if not ok:
            self.report('expected volumes:')
            self.report(expected_volumes)
            self.report('actual volumes:')
            self.report(actual_volumes)

        return ok
示例#5
0
    def test_spbox_field(self):
        """
        'Field' vs. 'coors'.
        """
        mesh = Mesh.from_file(data_dir + '/meshes/2d/its2D.mesh')
        coors = mesh.coors.copy()
        bbox = nm.vstack((nm.amin(coors, 0), nm.amax(coors, 0))).T

        coors_1 = coors.copy()

        alpha = coors[:, 0]
        spbox = SplineBox(bbox, coors, nsg=[1, 2], field=alpha)
        dv1 = spbox.evaluate_derivative(6, 1)
        spbox.move_control_point(6, -0.2)
        c1 = spbox.evaluate()
        coors_1[:, 0] = c1[:, 0]

        alpha = coors[:, 1]
        spbox = SplineBox(bbox, coors, nsg=[1, 2], field=alpha)
        dv2 = spbox.evaluate_derivative(6, 1)
        spbox.move_control_point(6, 0.2)
        c2 = spbox.evaluate()
        coors_1[:, 1] = c2[:, 0]

        spbox = SplineBox(bbox, coors, nsg=[1, 2])
        dv = spbox.evaluate_derivative(6, [1, 1])
        spbox.move_control_point(6, [-0.2, 0.2])
        coors_2 = spbox.evaluate()

        rel_coor_dist = nm.linalg.norm(coors_2 - coors_1)\
            / nm.linalg.norm(coors_2)
        ok = rel_coor_dist < tolerance
        rel_dvel_dist = nm.linalg.norm(dv - nm.hstack([dv1, dv2]))\
            / nm.linalg.norm(dv)
        ok = ok and rel_dvel_dist < tolerance

        if not ok:
            self.report('modified coordinates do not match, relative error:')
            self.report(rel_coor_dist)
            self.report('derivatives do not match, relative error:')
            self.report(rel_dvel_dist)

        return ok
示例#6
0
    def test_sensitivity(self):
        from sfepy.discrete import Variables
        from sfepy.mesh.splinebox import SplineBox

        tolerance = 1e-4
        ok = True
        pb = self.problem

        variables = Variables.from_conf(self.conf.variables, pb.fields)

        for var_name in variables.names:
            var = variables[var_name]
            n_dof = var.field.n_nod * var.field.shape[0]
            aux = nm.arange(n_dof, dtype=nm.float64)
            var.set_data(aux)

        mesh = pb.domain.mesh
        bbox = nm.array(mesh.get_bounding_box()).T
        spbox = SplineBox(bbox, mesh.coors)

        dvel_modes = [
            # expand inner cylinder, no volume change
            [([20, 21, 22, 23], (-1, -1, 0)),
             ([24, 25, 26, 27], (-1, 1, 0)),
             ([36, 37, 38, 39], (1, -1, 0)),
             ([40, 41, 42, 43], (1, 1, 0))],
            # volume change
            [(range(16, 32), (0.2, 0, 0)),
             (range(32, 48), (0.4, 0, 0)),
             (range(48, 52), (0.6, 0.2, 0.2)),
             (range(52, 56), (0.8, 0.2, 0.3)),
             (range(56, 60), (1.0, 0.2, 0.4)),
             (range(60, 64), (1.2, 0.2, 0.5))],
        ]

        r4 = range(4)
        cp_pos = {i*16 + j*4 + k: (i, j, k)
            for k in r4 for j in r4 for i in r4}

        # compute design velocities
        dvels = []
        for dv_mode in dvel_modes:
            dvel = 0
            for pts, dir in dv_mode:
                for pt in pts:
                    dvel += spbox.evaluate_derivative(cp_pos[pt], dir)
            dvels.append(dvel)

        for tname_sa, tname, rname, mat, var1, var2 in test_terms:
            args = [] if mat is None else [mat]
            args += [var1] if var2 is None else [var1, var2]
            term = '%s.i.%s(%s)' % (tname, rname, ', '.join(args))
            term_sa = '%s.i.%s(%s)' % (tname_sa, rname, ', '.join(args + ['V']))

            val = pb.evaluate(term, var_dict=variables.as_dict())
            self.report('%s: %s' % (tname, val))

            dt = 1e-6
            for ii, dvel in enumerate(dvels):
                val = pb.evaluate(term, var_dict=variables.as_dict())
                variables['V'].set_data(dvel)
                val_sa = pb.evaluate(term_sa, var_dict=variables.as_dict())
                self.report('%s - mesh_velocity mode %d' % (tname_sa, ii))
                # mesh perturbation +
                new_coors = modify_mesh(dt/2., spbox, dvel_modes[ii], cp_pos)
                pb.set_mesh_coors(new_coors, update_fields=True)
                val1 = pb.evaluate(term, var_dict=variables.as_dict())

                # mesh perturbation -
                new_coors = modify_mesh(-dt/2., spbox, dvel_modes[ii], cp_pos)
                pb.set_mesh_coors(new_coors, update_fields=True)
                val2 = pb.evaluate(term, var_dict=variables.as_dict())

                val_fd = (val1 - val2) / dt
                err = nm.abs(val_sa - val_fd) / nm.linalg.norm(val_sa)
                self.report('term:               %s' % val)
                self.report('sensitivity term:   %s' % val_sa)
                self.report('finite differences: %s' % val_fd)
                self.report('relative error:     %s' % err)

                _ok = err < tolerance

                ok = ok and _ok

        return ok
    def test_spbox_field(self):
        """
        'Field' vs. 'coors'.
        """
        mesh = Mesh.from_file(data_dir + '/meshes/2d/its2D.mesh')
        coors = mesh.coors.copy()
        bbox = nm.vstack((nm.amin(coors, 0), nm.amax(coors, 0))).T

        coors_1 = coors.copy()

        alpha = coors[:, 0]
        spbox = SplineBox(bbox, coors, nsg=[1, 2], field=alpha)
        dv1 = spbox.evaluate_derivative(6, 1)
        spbox.move_control_point(6, -0.2)
        c1 = spbox.evaluate()
        coors_1[:, 0] = c1[:, 0]

        alpha = coors[:, 1]
        spbox = SplineBox(bbox, coors, nsg=[1, 2], field=alpha)
        dv2 = spbox.evaluate_derivative(6, 1)
        spbox.move_control_point(6, 0.2)
        c2 = spbox.evaluate()
        coors_1[:, 1] = c2[:, 0]

        spbox = SplineBox(bbox, coors, nsg=[1, 2])
        dv = spbox.evaluate_derivative(6, [1, 1])
        spbox.move_control_point(6, [-0.2, 0.2])
        coors_2 = spbox.evaluate()

        rel_coor_dist = nm.linalg.norm(coors_2 - coors_1)\
            / nm.linalg.norm(coors_2)
        ok = rel_coor_dist < tolerance
        rel_dvel_dist = nm.linalg.norm(dv - nm.hstack([dv1, dv2]))\
            / nm.linalg.norm(dv)
        ok = ok and rel_dvel_dist < tolerance

        if not ok:
            self.report('modified coordinates do not match, relative error:')
            self.report(rel_coor_dist)
            self.report('derivatives do not match, relative error:')
            self.report(rel_dvel_dist)

        return ok