Beispiel #1
0
    def assign_variable(self, u, var):
        r"""
		Manually assign the values from ``var`` to ``u``.  The parameter ``var``
		may be a string pointing to the location of an :class:`~dolfin.cpp.io.XDMFFile`,
		:class:`~dolfin.cpp.io.HDF5File`, or an xml file.

		:param u:        FEniCS :class:`~dolfin.functions.function.Function` assigning to
		:param var:      value assigning from
		:param annotate: allow ``dolfin_adjoint`` annotation
		:type var:       float, int, :class:`~dolfin.functions.expression.Expression`, :class:`~dolfin.functions.constant.Constant`, :class:`~dolfin.cpp.la.GenericVector`, string, :class:`~dolfin.cpp.io.HDF5File`, :class:`~numpy.ndarray`
		:type u:         :class:`~dolfin.functions.function.Function`, :class:`~dolfin.cpp.la.GenericVector`, :class:`~dolfin.Constant`, float, int
		"""
        # if this is a list, convert it to a numpy array :
        if type(var) == list:
            var = np.array(var)
        if isinstance(var, float) or isinstance(var, int):
            if isinstance(u, dl.GenericVector) or isinstance(u, dl.Function):
                u.vector()[:] = var
            elif isinstance(u, dl.Constant):
                u.assign(var)
            elif isinstance(u, float) or isinstance(u, int):
                u = var

        elif isinstance(var, np.ndarray):
            if var.dtype != np.float64:
                var = var.astype(np.float64)
            u.vector().set_local(var)
            u.vector().apply('insert')

        elif isinstance(var, dl.Expression) \
         or isinstance(var, dl.Constant)  \
         or isinstance(var, dl.Function) \
         or isinstance(var, dl.GenericVector):
            u.assign(var)
            #u.interpolate(var, annotate=annotate)

        #elif isinstance(var, GenericVector):
        #  self.assign_variable(u, var.array(), annotate=annotate)

        elif isinstance(var, str):
            File(var) >> u

        elif isinstance(var, dl.HDF5File):
            var.read(u, u.name())

        else:
            s =  "*************************************************************\n" + \
                 "assign_variable() function requires a Function, array, float,\n" + \
                 " int, Vector, Expression, Constant, or string path to .xml,\n"   + \
                 "not %s."                                                         + \
                 "*************************************************************"
            print_text(s % type(var), 'red', 1)
        if self.verbose:
            print_min_max(u, u.name())
Beispiel #2
0
    def update_mass(self, m):
        r"""
		Update the grid mass :math:`m_i`, ``self.m`` to parameter ``m``.

		:param m: grid mass
		:type m: :class:`~dolfin.functions.function.Function`,
		"""
        # assign the mass to the model variable :
        self.assm.assign(self.m, m)
        if self.verbose:
            print_min_max(self.m, 'GridModel.m')
Beispiel #3
0
    def update_internal_force_vector(self, f_int):
        r"""
		Update the grid acceleration :math:`\mathbf{f}_i^{\mathrm{int}} = [f_x^{\mathrm{int}}\ f_y^{\mathrm{int}}\ f_z^{\mathrm{int}}]^{\intercal}` to paramter ``f_int``.

		:param f_int: grid internal force
		:type f_int: list of :class:`~dolfin.functions.function.Function`\s
		"""
        # assign the variables to the functions :
        self.assf_int_x.assign(self.f_int_x, f_int[0])
        self.assf_int_y.assign(self.f_int_y, f_int[1])
        if self.verbose:
            print_min_max(f_int[0], 'GridModel.f_int_x')
            print_min_max(f_int[1], 'GridModel.f_int_y')
Beispiel #4
0
    def update_acceleration(self, a):
        r"""
		Update the grid acceleration :math:`\mathbf{a}_i = [a_x\ a_y\ a_z]^{\intercal}`, ``self.a3`` to parameter ``a``.

		:param a: grid acceleration
		:type a: list of :class:`~dolfin.functions.function.Function`\s
		"""
        # assign the variables to the functions :
        self.assa_x.assign(self.a_x, a[0])
        self.assa_y.assign(self.a_y, a[1])
        if self.verbose:
            print_min_max(a[0], 'GridModel.a_x')
            print_min_max(a[1], 'GridModel.a_y')
Beispiel #5
0
    def update_velocity(self, U):
        r"""
		Update the grid velocity :math:`\mathbf{u}_i = [u\ v\ w]^{\intercal}`, ``self.U3`` to parameter ``U``.

		:param U: grid velocity
		:type U: list of :class:`~dolfin.functions.function.Function`\s
		"""
        # assign the variables to the functions :
        assign(self.u, U[0])
        assign(self.v, U[1])
        if self.verbose:
            print_min_max(U[0], 'GridModel.u')
            print_min_max(U[1], 'GridModel.v')
Beispiel #6
0
    def retrieve_cpp_material_properties(self):
        """
    Transfer material properties from C++ back to python for further analysis
    with PyLab.
    """
        # iterate through all materials :
        for M in self.materials:
            M.retrieve_cpp_vrt()
            M.retrieve_cpp_phi()
            M.retrieve_cpp_grad_phi()
            M.retrieve_cpp_grad_u()
            M.retrieve_cpp_x()
            M.retrieve_cpp_u()
            M.retrieve_cpp_a()
            M.retrieve_cpp_F()
            M.retrieve_cpp_epsilon()
            M.retrieve_cpp_sigma()
            M.retrieve_cpp_rho()
            M.retrieve_cpp_V()
            M.retrieve_cpp_V0()

            if self.verbose:
                print_min_max(M.grad_u, 'M.grad_u')
                print_min_max(M.x, 'M.x')
                print_min_max(M.u, 'M.u')
                print_min_max(M.a, 'M.a')
                print_min_max(M.F, 'M.F_0')
                print_min_max(M.epsilon, 'M.epsilon_0')
                print_min_max(M.sigma, 'M.sigma_0')
                print_min_max(M.rho, 'M.rho_0')
                print_min_max(M.V, 'M.V')
                print_min_max(M.V0, 'M.V_0')