# -*- coding: utf-8 -*-## This file is subject to the terms and conditions defined in# file 'LICENSE.txt', which is part of this source code package.#fromtypingimportAny,NewType,Dict,Type,Union,IterablefromenumimportEnum,uniqueimportMuscat.MeshContainers.ElementsDescriptionasEDfromMuscat.Helpers.FactoryimportFactoryimportMuscat.FE.Spaces.PointSpacesasPointSpacesimportMuscat.FE.Spaces.BarSpacesasBarSpacesimportMuscat.FE.Spaces.TriSpacesasTriSpacesimportMuscat.FE.Spaces.TetSpacesasTetSpacesimportMuscat.FE.Spaces.QuadSpacesasQuadSpacesimportMuscat.FE.Spaces.HexaSpacesasHexaSpacesimportMuscat.FE.Spaces.WedgeSpacesasWedgeSpacesimportMuscat.FE.Spaces.PyrSpacesasPyrSpacesfromMuscat.FE.Spaces.SpaceBaseimportSpaceBase
[docs]classFESpace:def__init__(self,spaceType:SpaceType):super().__init__()self.storage:Dict[ED.ElementType,SpaceBase]={}self.type=spaceTypeself.name=spaceType.name#if true means some shape function are shared across the elements; meaning we must compute a global numberingself.hasSharedShapeFunctions=Truedef__getitem__(self,elementType:Union[str,ED.ElementType])->SpaceBase:returnself.storage[ED.ElementType(elementType)]def__setitem__(self,elementType:Union[str,ED.ElementType],value:SpaceBase):self.storage[ED.ElementType(elementType)]=value
LagrangeSpaceGeo=FESpace(SpaceType.LagrangeSpaceGeo)"""Isoparametric Lagrange space (if the mesh is quadratic the field is P2)."""LagrangeSpaceGeo[ED.Point_1]=PointSpaces.Point_P0_Lagrange()LagrangeSpaceGeo[ED.Bar_2]=BarSpaces.Bar_P1_Lagrange()LagrangeSpaceGeo[ED.Bar_3]=BarSpaces.Bar_P2_Lagrange()LagrangeSpaceGeo[ED.Triangle_3]=TriSpaces.Tri_P1_Lagrange()LagrangeSpaceGeo[ED.Triangle_6]=TriSpaces.Tri_P2_Lagrange()LagrangeSpaceGeo[ED.Tetrahedron_4]=TetSpaces.Tet_P1_Lagrange()LagrangeSpaceGeo[ED.Tetrahedron_10]=TetSpaces.Tet_P2_Lagrange()LagrangeSpaceGeo[ED.Quadrangle_4]=QuadSpaces.Quad_P1_Lagrange()LagrangeSpaceGeo[ED.Quadrangle_8]=QuadSpaces.Quad8_P2_Lagrange()LagrangeSpaceGeo[ED.Quadrangle_9]=QuadSpaces.Quad_P2_Lagrange()LagrangeSpaceGeo[ED.Hexahedron_8]=HexaSpaces.Hexa_P1_Lagrange()LagrangeSpaceGeo[ED.Hexahedron_20]=HexaSpaces.Hexa20_P2_Lagrange()LagrangeSpaceGeo[ED.Hexahedron_27]=HexaSpaces.Hexa_P2_Lagrange()LagrangeSpaceGeo[ED.Wedge_6]=WedgeSpaces.Wedge_P1_Lagrange()LagrangeSpaceGeo[ED.Wedge_15]=WedgeSpaces.Wedge15_P2_Lagrange()LagrangeSpaceGeo[ED.Wedge_18]=WedgeSpaces.Wedge_P2_Lagrange()LagrangeSpaceGeo[ED.Pyramid_5]=PyrSpaces.Pyr_P1_Lagrange()LagrangeSpaceGeo[ED.Pyramid_13]=PyrSpaces.Pyr13_P2_Lagrange()LagrangeSpaceGeo[ED.Pyramid_14]=PyrSpaces.Pyr14_P2_Lagrange()RegisterFESpace(LagrangeSpaceGeo())ConstantSpaceGlobal=FESpace(SpaceType.ConstantSpaceGlobal)"""Global constant space. Used to integrate expressions over a domain into a scalar."""ConstantSpaceGlobal[ED.Point_1]=PointSpaces.Point_P0_Global()ConstantSpaceGlobal[ED.Bar_2]=BarSpaces.Bar_P0_Global()ConstantSpaceGlobal[ED.Bar_3]=BarSpaces.Bar_P0_Global()ConstantSpaceGlobal[ED.Triangle_3]=TriSpaces.Tri_P0_Global()ConstantSpaceGlobal[ED.Triangle_6]=TriSpaces.Tri_P0_Global()ConstantSpaceGlobal[ED.Tetrahedron_4]=TetSpaces.Tet_P0_Global()ConstantSpaceGlobal[ED.Tetrahedron_10]=TetSpaces.Tet_P0_Global()ConstantSpaceGlobal[ED.Quadrangle_4]=QuadSpaces.Quad_P0_Global()ConstantSpaceGlobal[ED.Quadrangle_8]=QuadSpaces.Quad_P0_Global()ConstantSpaceGlobal[ED.Quadrangle_9]=QuadSpaces.Quad_P0_Global()ConstantSpaceGlobal[ED.Hexahedron_8]=HexaSpaces.Hexa_P0_Global()ConstantSpaceGlobal[ED.Hexahedron_20]=HexaSpaces.Hexa_P0_Global()ConstantSpaceGlobal[ED.Hexahedron_27]=HexaSpaces.Hexa_P0_Global()ConstantSpaceGlobal[ED.Wedge_6]=WedgeSpaces.Wedge_P0_Global()ConstantSpaceGlobal[ED.Wedge_15]=WedgeSpaces.Wedge_P0_Global()ConstantSpaceGlobal[ED.Wedge_18]=WedgeSpaces.Wedge_P0_Global()ConstantSpaceGlobal[ED.Pyramid_5]=PyrSpaces.Pyr_P0_Global()ConstantSpaceGlobal[ED.Pyramid_13]=PyrSpaces.Pyr_P0_Global()ConstantSpaceGlobal[ED.Pyramid_14]=PyrSpaces.Pyr_P0_Global()RegisterFESpace(ConstantSpaceGlobal())LagrangeSpaceP0=FESpace(SpaceType.LagrangeSpaceP0)LagrangeSpaceP0.hasSharedShapeFunctions=False"""Degree 0 Lagrange space. This space is constant per element (one value per element)."""LagrangeSpaceP0[ED.Point_1]=PointSpaces.Point_P0_Lagrange()LagrangeSpaceP0[ED.Bar_2]=BarSpaces.Bar_P0_Lagrange()LagrangeSpaceP0[ED.Bar_3]=BarSpaces.Bar_P0_Lagrange()LagrangeSpaceP0[ED.Triangle_3]=TriSpaces.Tri_P0_Lagrange()LagrangeSpaceP0[ED.Triangle_6]=TriSpaces.Tri_P0_Lagrange()LagrangeSpaceP0[ED.Tetrahedron_4]=TetSpaces.Tet_P0_Lagrange()LagrangeSpaceP0[ED.Tetrahedron_10]=TetSpaces.Tet_P0_Lagrange()LagrangeSpaceP0[ED.Quadrangle_4]=QuadSpaces.Quad_P0_Lagrange()LagrangeSpaceP0[ED.Quadrangle_8]=QuadSpaces.Quad_P0_Lagrange()LagrangeSpaceP0[ED.Quadrangle_9]=QuadSpaces.Quad_P0_Lagrange()LagrangeSpaceP0[ED.Hexahedron_8]=HexaSpaces.Hexa_P0_Lagrange()LagrangeSpaceP0[ED.Hexahedron_20]=HexaSpaces.Hexa_P0_Lagrange()LagrangeSpaceP0[ED.Hexahedron_27]=HexaSpaces.Hexa_P0_Lagrange()LagrangeSpaceP0[ED.Wedge_6]=WedgeSpaces.Wedge_P0_Lagrange()LagrangeSpaceP0[ED.Wedge_15]=WedgeSpaces.Wedge_P0_Lagrange()LagrangeSpaceP0[ED.Wedge_18]=WedgeSpaces.Wedge_P0_Lagrange()LagrangeSpaceP0[ED.Pyramid_5]=PyrSpaces.Pyr_P0_Lagrange()LagrangeSpaceP0[ED.Pyramid_13]=PyrSpaces.Pyr_P0_Lagrange()LagrangeSpaceP0[ED.Pyramid_14]=PyrSpaces.Pyr_P0_Lagrange()RegisterFESpace(LagrangeSpaceP0())LagrangeSpaceP1=FESpace(SpaceType.LagrangeSpaceP1)"""Degree 1 Lagrange space. This space implement linear interpolation functions."""LagrangeSpaceP1[ED.Point_1]=PointSpaces.Point_P0_Lagrange()LagrangeSpaceP1[ED.Bar_2]=BarSpaces.Bar_P1_Lagrange()LagrangeSpaceP1[ED.Bar_3]=BarSpaces.Bar_P1_Lagrange()LagrangeSpaceP1[ED.Triangle_3]=TriSpaces.Tri_P1_Lagrange()LagrangeSpaceP1[ED.Triangle_6]=TriSpaces.Tri_P1_Lagrange()LagrangeSpaceP1[ED.Tetrahedron_4]=TetSpaces.Tet_P1_Lagrange()LagrangeSpaceP1[ED.Tetrahedron_10]=TetSpaces.Tet_P1_Lagrange()LagrangeSpaceP1[ED.Quadrangle_4]=QuadSpaces.Quad_P1_Lagrange()LagrangeSpaceP1[ED.Quadrangle_8]=QuadSpaces.Quad_P1_Lagrange()LagrangeSpaceP1[ED.Quadrangle_9]=QuadSpaces.Quad_P1_Lagrange()LagrangeSpaceP1[ED.Hexahedron_8]=HexaSpaces.Hexa_P1_Lagrange()LagrangeSpaceP1[ED.Hexahedron_20]=HexaSpaces.Hexa_P1_Lagrange()LagrangeSpaceP1[ED.Hexahedron_27]=HexaSpaces.Hexa_P1_Lagrange()LagrangeSpaceP1[ED.Wedge_6]=WedgeSpaces.Wedge_P1_Lagrange()LagrangeSpaceP1[ED.Wedge_15]=WedgeSpaces.Wedge_P1_Lagrange()LagrangeSpaceP1[ED.Wedge_18]=WedgeSpaces.Wedge_P1_Lagrange()LagrangeSpaceP1[ED.Pyramid_5]=PyrSpaces.Pyr_P1_Lagrange()LagrangeSpaceP1[ED.Pyramid_13]=PyrSpaces.Pyr_P1_Lagrange()LagrangeSpaceP1[ED.Pyramid_14]=PyrSpaces.Pyr_P1_Lagrange()RegisterFESpace(LagrangeSpaceP1())LagrangeSpaceP2=FESpace(SpaceType.LagrangeSpaceP2)"""Degree 2 Lagrange space. This space implement quadratic interpolation functions."""LagrangeSpaceP2[ED.Point_1]=PointSpaces.Point_P0_Lagrange()LagrangeSpaceP2[ED.Bar_2]=BarSpaces.Bar_P2_Lagrange()LagrangeSpaceP2[ED.Bar_3]=BarSpaces.Bar_P2_Lagrange()LagrangeSpaceP2[ED.Triangle_3]=TriSpaces.Tri_P2_Lagrange()LagrangeSpaceP2[ED.Triangle_6]=TriSpaces.Tri_P2_Lagrange()LagrangeSpaceP2[ED.Tetrahedron_4]=TetSpaces.Tet_P2_Lagrange()LagrangeSpaceP2[ED.Tetrahedron_10]=TetSpaces.Tet_P2_Lagrange()LagrangeSpaceP2[ED.Quadrangle_4]=QuadSpaces.Quad_P2_Lagrange()LagrangeSpaceP2[ED.Quadrangle_8]=QuadSpaces.Quad_P2_Lagrange()LagrangeSpaceP2[ED.Quadrangle_9]=QuadSpaces.Quad_P2_Lagrange()LagrangeSpaceP2[ED.Hexahedron_8]=HexaSpaces.Hexa_P2_Lagrange()LagrangeSpaceP2[ED.Hexahedron_20]=HexaSpaces.Hexa_P2_Lagrange()LagrangeSpaceP2[ED.Hexahedron_27]=HexaSpaces.Hexa_P2_Lagrange()LagrangeSpaceP2[ED.Wedge_6]=WedgeSpaces.Wedge_P2_Lagrange()LagrangeSpaceP2[ED.Wedge_15]=WedgeSpaces.Wedge_P2_Lagrange()LagrangeSpaceP2[ED.Wedge_18]=WedgeSpaces.Wedge_P2_Lagrange()LagrangeSpaceP2[ED.Pyramid_5]=PyrSpaces.Pyr14_P2_Lagrange()LagrangeSpaceP2[ED.Pyramid_13]=PyrSpaces.Pyr14_P2_Lagrange()LagrangeSpaceP2[ED.Pyramid_14]=PyrSpaces.Pyr14_P2_Lagrange()RegisterFESpace(LagrangeSpaceP2())LagrangeSpaceP2Serendipity=FESpace(SpaceType.LagrangeSpaceP2Serendipity)LagrangeSpaceP2Serendipity[ED.Point_1]=PointSpaces.Point_P0_Lagrange()LagrangeSpaceP2Serendipity[ED.Bar_2]=BarSpaces.Bar_P2_Lagrange()LagrangeSpaceP2Serendipity[ED.Bar_3]=BarSpaces.Bar_P2_Lagrange()LagrangeSpaceP2Serendipity[ED.Triangle_3]=TriSpaces.Tri_P2_Lagrange()LagrangeSpaceP2Serendipity[ED.Triangle_6]=TriSpaces.Tri_P2_Lagrange()LagrangeSpaceP2Serendipity[ED.Tetrahedron_4]=TetSpaces.Tet_P2_Lagrange()LagrangeSpaceP2Serendipity[ED.Tetrahedron_10]=TetSpaces.Tet_P2_Lagrange()LagrangeSpaceP2Serendipity[ED.Quadrangle_4]=QuadSpaces.Quad_P2_Lagrange()LagrangeSpaceP2Serendipity[ED.Quadrangle_8]=QuadSpaces.Quad8_P2_Lagrange()LagrangeSpaceP2Serendipity[ED.Quadrangle_9]=QuadSpaces.Quad_P2_Lagrange()LagrangeSpaceP2Serendipity[ED.Hexahedron_8]=HexaSpaces.Hexa_P2_Lagrange()LagrangeSpaceP2Serendipity[ED.Hexahedron_20]=HexaSpaces.Hexa20_P2_Lagrange()LagrangeSpaceP2Serendipity[ED.Hexahedron_27]=HexaSpaces.Hexa_P2_Lagrange()LagrangeSpaceP2Serendipity[ED.Wedge_6]=WedgeSpaces.Wedge_P2_Lagrange()LagrangeSpaceP2Serendipity[ED.Wedge_15]=WedgeSpaces.Wedge15_P2_Lagrange()LagrangeSpaceP2Serendipity[ED.Wedge_18]=WedgeSpaces.Wedge_P2_Lagrange()LagrangeSpaceP2Serendipity[ED.Pyramid_5]=PyrSpaces.Pyr14_P2_Lagrange()LagrangeSpaceP2Serendipity[ED.Pyramid_13]=PyrSpaces.Pyr13_P2_Lagrange()LagrangeSpaceP2Serendipity[ED.Pyramid_14]=PyrSpaces.Pyr14_P2_Lagrange()RegisterFESpace(LagrangeSpaceP2Serendipity())
[docs]defInitAllSpaces()->None:"""Function to create all the spaces, this need to be called at the beginning of the app in a multi threated app"""forfeSpaceinGetListOfAvailableFESpaces():feSpace.InitSpaces()