Source code for felupe.field._fields

# -*- coding: utf-8 -*-
"""
This file is part of FElupe.

FElupe is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

FElupe is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with FElupe.  If not, see <http://www.gnu.org/licenses/>.
"""

from ._axi import FieldAxisymmetric
from ._base import Field
from ._container import FieldContainer
from ._dual import FieldDual
from ._planestrain import FieldPlaneStrain


[docs] class FieldsMixed(FieldContainer): r"""A container with multiple (mixed) :class:`Fields <felupe.Field>` based on a :class:`Region`. Parameters ---------- region : RegionHexahedron, RegionQuad, RegionQuadraticQuad, RegionBiQuadraticQuad, RegionQuadraticHexahedron, RegionTriQuadraticHexahedron, RegionQuadraticTetra, RegionQuadraticTriangle, RegionTetraMINI, RegionTriangleMINI or RegionLagrange A template region. n : int, optional Number of fields where the first one is a vector field of mesh- dimension and the following fields are scalar-fields (default is 3). values : tuple of float or tuple of ndarray, optional Initial field values (default is (0.0, 0.0, 1.0, 0.0)). axisymmetric : bool, optional Flag to initiate a :class:`FieldAxisymmetric` as the first field (default is False). planestrain : bool, optional Flag to initiate a :class:`FieldPlaneStrain` as the first field (default is False). offset : int, optional Offset for cell connectivity of the dual mesh (default is 0). npoints : int or None, optional Specified number of mesh points for the dual mesh (default is None). mesh: Mesh or None, optional A mesh which is used for the dual region (default is None). If None, the mesh is taken from the region. Notes ----- The dual region is chosen automatically, i.e. for a :class:`RegionHexahedron` the dual region is :class:`RegionConstantHexahedron`. A total number of ``n`` fields are generated inside a :class:`FieldContainer`. For compatibility with :class:`~felupe.ThreeFieldVariation`, the third field is created with ones, all values of the other fields are initiated with zeros by default. See Also -------- felupe.FieldContainer : A container which holds one or multiple (mixed) fields. felupe.Field : Field on points of a :class:`~felupe.Region` with dimension ``dim`` and initial point ``values``. felupe.FieldDual : A dual field on points of a :class:`~felupe.Region` with dimension ``dim`` and initial point ``values``. felupe.FieldAxisymmetric : Axisymmetric field on points of a :class:`~felupe.Region` with dimension ``dim`` and initial point ``values``. felupe.FieldPlaneStrain : Plane strain field on points of a :class:`~felupe.Region` with dimension ``dim`` and initial point ``values``. felupe.mesh.dual : Create a dual :class:`~felupe.Mesh`. """ def __init__( self, region, n=3, values=(0.0, 0.0, 1.0, 0.0), axisymmetric=False, planestrain=False, offset=0, npoints=None, mesh=None, **kwargs, ): if axisymmetric is False and planestrain is False: F = Field elif axisymmetric is True and planestrain is False: F = FieldAxisymmetric elif axisymmetric is False and planestrain is True: F = FieldPlaneStrain else: raise ValueError( "Choose between ``axisymmetric=True`` or ``planestrain=True``." ) fields = [F(region, dim=region.mesh.dim, values=values[0])] for a in range(1, n): fields.append( FieldDual( region, values=values[a], offset=offset, npoints=npoints, mesh=mesh, **kwargs, ) ) super().__init__(fields=fields)