# -*- 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.
#
from typing import Optional, List
from Muscat.Types import MuscatFloat
from Muscat.Containers.Mesh import Mesh
from Muscat.Containers.Filters.FilterObjects import ElementFilter
from Muscat.FE.Fields.FieldTools import IntegrationPointWrapper
from Muscat.FE.Fields.FieldBase import FieldBase
from Muscat.FE.Fields.FEField import FEField
from Muscat.FE.Spaces.FESpaces import ConstantSpaceGlobal
from Muscat.FE.DofNumbering import ComputeDofNumbering
from Muscat.FE.Integration import IntegrateGeneral
from Muscat.FE.SymWeakForm import GetTestField, GetField
from Muscat.FE.IntegrationRules import LagrangeIsoParamQuadrature
[docs]def IntegrateSymExpression(mesh:Mesh, fields: List[FieldBase], symexp, ef:Optional[ElementFilter]=None ) -> MuscatFloat:
space = ConstantSpaceGlobal
numbering = ComputeDofNumbering(mesh,space)
testfield = FEField("Testfunc",mesh=mesh,space=space,numbering=numbering)
Tt = GetTestField("Testfunc",1)
_,f = IntegrateGeneral(mesh, symexp*Tt, {}, fields, unknownFields = [ testfield ],integrationRule=LagrangeIsoParamQuadrature, elementFilter=ef )
return f[0]
[docs]def IntegrateField(field, ef:Optional[ElementFilter]=None ):
return IntegrateSymExpression(field.mesh, [field], symexp= GetField(field.name, size=1), ef=ef)
[docs]def CheckIntegrity(GUI= False):
from Muscat.IO.StlReader import ReadStl
from Muscat.TestData import GetTestDataPath
mesh = ReadStl(GetTestDataPath() + "stlsphere.stl")
from Muscat.FE.Fields.FieldTools import CreateFieldFromDescription
from Muscat.Containers.Filters.FilterObjects import ElementFilter
field = CreateFieldFromDescription(mesh,[(ElementFilter(),1)] )
area = IntegrateField(field)
print(f"Computed Area = {area}")
import numpy as np
np.testing.assert_equal(area, 2.9088166085800675)
return "ok"
if __name__ == '__main__':
print(CheckIntegrity(True)) # pragma: no cover