# -*- 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.
#
""" Class to treat Constants Rectilinear Finite Element Problems
"""
from typing import Optional
import numpy as np
from scipy.sparse import coo_matrix
import scipy.sparse.linalg as linalg
import scipy.linalg as denselinalg
import scipy.sparse as sps
from Muscat.Types import MuscatIndex, MuscatFloat, ArrayLike
import Muscat.MeshContainers.ElementsDescription as ED
import Muscat.MeshContainers.Mesh as Mesh
import Muscat.FE.FeaBase as FeaBase
from Muscat.LinAlg.MatVecOperations import DeleteRowsCols
from Muscat.Helpers.Logger import Info, Debug, Error
from Muscat.MeshContainers.Filters.FilterObjects import NodeFilter
from Muscat.MeshTools.ConstantRectilinearMeshTools import GetMonoIndex
[docs]
class ElementaryMatrix():
def __init__(self,dim=3, physics="disp"):
self.dim = dim
self.geoFactor = [1,1,1]
self.physics = physics
self.young = 1
self.poisson = 0.3
self.density = 1
self.thermalK = 1
[docs]
def GetMassMatrix(self):
if self.physics == "disp":
from Muscat.FE.SymPhysics import MechPhysics
phys = MechPhysics(self.dim)
wform = phys.GetBulkMassFormulation()
return self.Integrate(["u_"+str(x) for x in range(self.dim)],wform)
elif self.physics == "thermal":
from Muscat.FE.SymPhysics import ThermalPhysics
wform = ThermalPhysics(spaceDimension=self.dim).GetBulkMassFormulation()
return self.Integrate(["t"],wform)
[docs]
def GetTangentMatrix(self):
from Muscat.FE.SymPhysics import MechPhysics,ThermalPhysics
if self.physics == "disp":
physics = MechPhysics(dim=self.dim)
wform = physics.GetBulkFormulation(self.young,self.poisson)
elif self.physics == "thermal":
physics = ThermalPhysics(spaceDimension=self.dim)
wform = physics.GetBulkFormulation(alpha=self.thermalK)
else:
raise(Exception("Physics not supported"))
return self.Integrate(physics.GetPrimalNames() ,wform)
[docs]
def Integrate(self,primalNames,wform):
from Muscat.FE.FETools import GetElementaryMatrixForFormulation
if self.dim == 3:
el = ED.Hexahedron_8
else:
el = ED.Quadrangle_4
KGeneric,rhs = GetElementaryMatrixForFormulation(el,wform, unknownNames = primalNames, geoFactor= self.geoFactor)
n = len(primalNames)
permutation = np.array([x*ED.numberOfNodes[el]+y for y in range(ED.numberOfNodes[el]) for x in range(n)])
rhs = rhs[permutation]
KGeneric = KGeneric[permutation,:]
KGeneric = KGeneric[:,permutation]
return KGeneric
[docs]
class Fea(FeaBase.FeaBase):
def __init__(self,spaceDim=3):
super().__init__(spaceDim=spaceDim)
self.linearSolver = "EigenCG"
self.writer = None
self.minthreshold = 0.9e-3
self.tol = 1.e-6
self.dofpernode = 1
self.init = False
self.dirichletBcs = []
self.neumannBcs = []
self.neumannNodalBcs = []
self.young = 1.
self.poisson = 0.3
self.density = 1.
[docs]
def AddDirichletCondition(self, nodeFilter, mask, forceFunction):
self.dirichletBcs.append( (nodeFilter, mask, forceFunction) )
[docs]
def AddNeumannCondition(self, nodeFilter, mask, forceFunction):
self.neumannBcs.append( (nodeFilter, mask, forceFunction) )
[docs]
def AddNeumannNodalCondition(self, nodeFilter, mask, forceFunction):
self.neumannNodalBcs.append( (nodeFilter, mask, forceFunction) )
[docs]
def BuildProblem(self, dofpernode = None, KOperator= None, MOperator= None, neumannNodalBcs= None):
if self.init == True:
return
self.init = True
if self.mesh.props.get("IsConstantRectilinear",False) == False :
raise Exception("Must be a ConstantRectilinear mesh type ") #pragma: no cover
self.outer_v = []
if dofpernode is not None:
self.dofpernode = dofpernode
self.nodesPerElement = 2**self.mesh.GetElementsDimensionality()
if KOperator is not None:
self.KE = KOperator
self.ME = MOperator
else:
self.myElem = ElementaryMatrix(dim = self.mesh.GetElementsDimensionality())
self.myElem.young = self.young
self.myElem.poisson = self.poisson
self.myElem.geoFactor = self.mesh.props.get("spacing")
self.KE = self.myElem.GetTangentMatrix()
self.ME = self.myElem.GetMassMatrix()
# dofs:
self.ndof = self.dofpernode * self.mesh.GetNumberOfNodes()
# FE: Build the index vectors for the for coo matrix format
Debug("Building Connectivity matrix")
nbBulkElements = self.mesh.GetNumberOfElements(self.mesh.GetElementsDimensionality())
self.edofMat = np.zeros((nbBulkElements, self.nodesPerElement*self.dofpernode), dtype=MuscatIndex)
Debug("Building Connectivity matrix 2")
bulkElements = self.mesh.GetElementsOfType([ED.Quadrangle_4,ED.Hexahedron_8][self.mesh.GetElementsDimensionality()-2])
bulkConnectivity = bulkElements.connectivity
for i in range(nbBulkElements):
conn = bulkConnectivity[i,:]
self.edofMat[i, :] = np.array([(conn*self.dofpernode+y) for y in range(self.dofpernode)]).ravel('F')
Debug("Building Connectivity matrix Done")
self.iK = None
self.jK = None
self.fixedValues = np.zeros((self.ndof, 1), dtype=MuscatFloat)
Debug("Treating Dirichlet 1/4")
self.fixed = np.zeros(self.ndof, dtype=bool)
for ef, mask, forceFunction in self.dirichletBcs:
indexs = ef.GetNodesIndices(mesh = self.mesh)
values = forceFunction(self.mesh.nodes[indexs,:])
for i, m in enumerate(mask):
if m:
self.fixed[indexs*self.dofpernode+i] = True
self.fixedValues[indexs*self.dofpernode+i] = values[i]
self.free = np.ones(self.ndof, dtype=bool)
self.free[self.fixed] = False
# Solution and RHS vectors
self.f = np.zeros((self.ndof, 1), dtype=MuscatFloat)
self.u = np.zeros((self.ndof, 1), dtype=MuscatFloat)
Debug("Treating Dirichlet Done")
Debug("Treating Neumann")
for ef, mask, forceFunction in self.neumannBcs:
nIndices = ef.GetNodesIndices(mesh = self.mesh)
if len(nIndices) == 0:
continue
z = np.zeros((self.mesh.GetNumberOfNodes(),))
f = np.zeros((self.ndof, 1), dtype=MuscatFloat)
values = forceFunction(self.mesh.nodes[nIndices,:])
for i, m in enumerate(mask):
if m:
z[nIndices] = 1.
f[nIndices*self.dofpernode + i] += values[i]
eff = np.clip((np.sum(z[bulkConnectivity],axis=1) ),0, 1)
MassMatrix = self.BuildMassMatrix(eff)
self.f[:] += MassMatrix*f[:]
if len (self.neumannNodalBcs) > 0:
nodal_f = np.zeros((self.ndof, 1), dtype=MuscatFloat)
for ef, mask, forceFunction in self.neumannNodalBcs:
nIndices = ef.GetNodesIndices(mesh = self.mesh)
values = forceFunction(self.mesh.nodes[nIndices,:])
for i, m in enumerate(mask):
if m:
nodal_f[nIndices*self.dofpernode + i] += values[i]
self.f[:,0] += nodal_f[:,0]
Debug("Treating Neumann Done")
self.eed = np.zeros(nbBulkElements)
[docs]
def AssemblyMatrix(self,Op, Eeff = None):
nbBulkElements = self.mesh.GetNumberOfElements(self.mesh.GetElementsDimensionality())
if Eeff is None:
Eeff = np.ones(nbBulkElements)
sM = ((Op.flatten()[np.newaxis]).T * Eeff.ravel()).flatten(order='F')
self.GenerateIJs()
M = coo_matrix((sM, (self.iK, self.jK)), shape=(self.ndof, self.ndof),dtype=MuscatFloat)
else:
Debug(" Eeff is known")
bool_Eeff = (Eeff>=self.minthreshold)
nEeff = Eeff[bool_Eeff]
sM = ((Op.flatten()[np.newaxis]).T * nEeff.ravel()).flatten(order='F')
one = np.ones((self.nodesPerElement*self.dofpernode, 1), dtype=MuscatIndex)
local_iK = np.kron(self.edofMat[bool_Eeff,:], one).flatten()
one.shape = (1,self.nodesPerElement*self.dofpernode)
local_jK = np.kron(self.edofMat[bool_Eeff,:], one).flatten()
M = coo_matrix((sM, (local_iK, local_jK)), shape=(self.ndof, self.ndof),dtype=MuscatFloat)
return M.tocsr()
[docs]
def BuildTangentMatrix(self, Eeff = None):
Debug("BuildTangentMatrix")
res = self.AssemblyMatrix(self.KE, Eeff)
Debug("BuildTangentMatrix Done")
return res
[docs]
def BuildMassMatrix(self, Eeff = None):
Debug("BuildMassMatrix")
res = self.AssemblyMatrix(self.ME, Eeff)
Debug("BuildMassMatrix Done")
return res
[docs]
def Solve(self, Eeff=None):
# hack to integrate complex boundary condition in the mesh
if hasattr(self,"mechPhysics") and (self.mechPhysics is not None):
from Muscat.FE.UnstructuredFeaSym import UnstructuredFeaSym
prob = UnstructuredFeaSym(spaceDim =self.spaceDim)
prob.physics.append(self.mechPhysics)
prob.SetMesh(self.mesh)
self.mechPhysics.ComputeDofNumberingFromConnectivity(self.mesh)
prob.ComputeDofNumbering(self.mesh)
k,f = prob.GetLinearProblem(computeK=False)
if f is not None:
f.shape = (self.spaceDim,len(f)//self.spaceDim)
f = f.ravel(order='F')
self.f[:,0] += f
for nf,data in self.mechPhysics.extraRHSTerms:
nids = nf.GetNodesIndices(self.mesh)
size = 0
offset = []
for n in self.mechPhysics.numberings:
offset.append(size)
size += n.size
for i,val in enumerate(data):
inumbering = self.mechPhysics.numberings[i]
if val == 0 :
continue
for nid in nids:
dof = inumbering.GetDofOfPoint(nid)+offset[i]
self.f[dof,0] = val
self.mechPhysics = None
Debug("Construction of the tangent matrix")
K = self.BuildTangentMatrix(Eeff)
zerosdof = np.where(K.diagonal()== 0 )[0]
Info("Number of active nodes : " + str(self.ndof-len(zerosdof) ) + " of " + str(self.ndof) + " "+ str(float(len(zerosdof)*100.)/self.ndof)+ "% of empty dofs" )
Kones = coo_matrix( (np.ones((len(zerosdof),) ) ,(zerosdof,zerosdof)), shape =(self.ndof, self.ndof)).tocsr()#(self.dofpernode,self.dofpernode))
K = (K.tocsr() + Kones.tocsr()).tocsr()
# Remove constrained dofs from matrix
Debug(" Delete fixed Dofs")
[K, rhsfixed] = DeleteRowsCols(K, self.fixed, self.fixed, self.fixedValues)
Debug(" Start solver (" + str(self.linearSolver) + ")")
rhs = self.f[self.free, 0]-rhsfixed[self.free, 0]
self.u = np.zeros((self.ndof, 1), dtype=MuscatFloat)
if K.nnz > 0 :
from Muscat.LinAlg.LinearSolver import LinearProblem
linSol = LinearProblem()
linSol.SetAlgo(self.linearSolver)
linSol.SetTolerance(self.tol)
linSol.SetOp(K)
linSol.u = self.u[self.free, 0]
self.u[self.free, 0] = linSol.Solve(rhs)
#else :
#print("'"+self.linearSolver + "' is not a valid linear solver")#pragma: no cover
#print('Please set a type of linear solver')#pragma: no cover
#raise Exception()#pragma: no cover
Debug('Post Process')
self.u = self.u + self.fixedValues
# Compute element elastic energy density
u_reshaped = self.u[self.edofMat]
nbBulkElements = self.mesh.GetNumberOfElements(self.mesh.GetElementsDimensionality())
u_reshaped.shape = (nbBulkElements, self.nodesPerElement*self.dofpernode)
Ku_reshaped = np.dot(u_reshaped, self.KE)
np.einsum('ij,ij->i', Ku_reshaped, u_reshaped, out=self.eed)
# we divide by the volume of one element to get the energy density
self.eed /= np.prod(self.mesh.props.get("spacing"))
Debug('Post Process Done')
[docs]
def GenerateIJs(self):
# lazy generations of the IJ for the case when no density is given
Debug("GenerateIJs")
if self.iK is None:
nodesPerElement = 2**self.mesh.GetElementsDimensionality()
ones = np.ones((nodesPerElement*self.dofpernode, 1), dtype=MuscatIndex)
self.iK = np.kron(self.edofMat, ones).flatten()
ones.shape = (1, nodesPerElement*self.dofpernode)
self.jK = np.kron(self.edofMat, ones).flatten()
Debug("GenerateIJs Done")
[docs]
def element_elastic_energy(self, Eeff= None, OnlyOnInterface = False):
if Eeff is None:
return self.eed
else:
nEeff = np.copy(Eeff)
bool_Eeff = Eeff<self.minthreshold
nEeff[bool_Eeff] = 0.0
return nEeff*self.eed
[docs]
def nodal_elastic_energy(self, Eeff=None, OnlyOnInterface = False):
nbBulkElements = self.mesh.GetNumberOfElements(self.mesh.GetElementsDimensionality())
if Eeff is None:
Eeff = np.ones(nbBulkElements)
return node_averaged_element_field(self.element_elastic_energy(Eeff,OnlyOnInterface=OnlyOnInterface),self.mesh)
[docs]
def Write(self):
if self.writer is not None:
self.writer.Write(self.mesh,
PointFields = [self.u, self.f],
PointFieldsNames= ["u", "f"]
)
[docs]
def element_averaged_node_field(node_field,support):
nnodes = support.props.get("dimensions")
ndims = support.GetElementsDimensionality()
if ndims == 3:
result = np.zeros((nnodes[0]-1,nnodes[1]-1,nnodes[2]-1 ))
field = node_field.view()
field.shape = tuple(x for x in support.props.get("dimensions"))
result += field[0:-1, 0:-1,0:-1]
result += field[0:-1, 1: ,0:-1]
result += field[1: , 0:-1,0:-1]
result += field[1: , 1: ,0:-1]
result += field[0:-1, 0:-1,1: ]
result += field[0:-1, 1: ,1: ]
result += field[1: , 0:-1,1: ]
result += field[1: , 1: ,1: ]
return result/8
elif ndims == 2:
result = np.zeros((nnodes[0]-1,nnodes[1]-1))
field = node_field.view()
field.shape = tuple(x for x in support.props.get("dimensions"))
result += field[0:-1, 0:-1]
result += field[0:-1, 1: ]
result += field[1: , 0:-1]
result += field[1: , 1: ]
return result/4
else :
raise(Exception("only implemented for dim = 3 or 2"))
[docs]
def node_averaged_element_field(element_field,support):
nnodes = support.props.get("dimensions")
ndims = support.GetElementsDimensionality()
if ndims == 3:
result = np.zeros((nnodes[0],nnodes[1],nnodes[2] ))
w = np.zeros((nnodes[0],nnodes[1],nnodes[2] ))
field = element_field.view()
field.shape = tuple(x-1 for x in nnodes)
result[0:-1, 0:-1,0:-1] += field
result[0:-1, 1: ,0:-1] += field
result[1: , 0:-1,0:-1] += field
result[1: , 1: ,0:-1] += field
result[0:-1, 0:-1,1: ] += field
result[0:-1, 1: ,1: ] += field
result[1: , 0:-1,1: ] += field
result[1: , 1: ,1: ] += field
w[0:-1, 0:-1,0:-1] += 1
w[0:-1, 1: ,0:-1] += 1
w[1: , 0:-1,0:-1] += 1
w[1: , 1: ,0:-1] += 1
w[0:-1, 0:-1,1: ] += 1
w[0:-1, 1: ,1: ] += 1
w[1: , 0:-1,1: ] += 1
w[1: , 1: ,1: ] += 1
return result/w
else:
result = np.zeros((nnodes[0],nnodes[1] ))
w = np.zeros((nnodes[0],nnodes[1] ))
field = element_field.view()
field.shape = tuple(x-1 for x in support.props.get("dimensions"))
result[0:-1, 0:-1] += field
result[0:-1, 1: ] += field
result[1: , 0:-1] += field
result[1: , 1: ] += field
w[0:-1, 0:-1] += 1
w[0:-1, 1: ] += 1
w[1: , 0:-1] += 1
w[1: , 1: ] += 1
return result/w
[docs]
def CheckIntegrityThermal3D():
print('---------------------------- Thermal3D -------------------------------------------------')
from Muscat.MeshTools.ConstantRectilinearMeshTools import CreateConstantRectilinearMesh
import Muscat.IO.XdmfWriter as XdmfWriter
import time
from Muscat.Helpers.IO.TemporaryDirectory import TemporaryDirectory
nx = 11
ny = 12
nz = 13
myMesh = CreateConstantRectilinearMesh(dimensions=[nx,ny,nz], spacing=[0.1, 0.1, 10./(nz-1)], origin=[0,0,0])
dtag = myMesh.nodesTags.CreateTag("Block")
for x in range(nx):
for y in range(ny):
dtag.AddToTag(GetMonoIndex( [[x,y,0]],[nx,ny,nz])[0] )
print(myMesh)
# thermal problem
#dirichlet at plane z =0
myProblem = Fea()
myProblem.SetMesh(myMesh)
myProblem.AddDirichletCondition(NodeFilter(nTag="Block"), [True] , lambda x : [0] )
myProblem.AddNeumannCondition(NodeFilter(), [True] , lambda x : [1] )
starttime = time.time()
myElement = ElementaryMatrix()
myElement.physics = "thermal"
myElement.geoFactor = myMesh.props.get("spacing")
myProblem.BuildProblem(dofpernode = 1,
KOperator = myElement.GetTangentMatrix(),
MOperator = myElement.GetMassMatrix())
print("Time for Fea definition : " + str(time.time() -starttime))
myProblem.writer = XdmfWriter.XdmfWriter(TemporaryDirectory.GetTempPath()+"Test_constantRectilinearThermal.xdmf")
myProblem.writer.SetBinary()
myProblem.writer.SetTemporal()
myProblem.writer.Open()
myProblem.linearSolver = 'Direct'
myProblem.Solve()
myProblem.Write()
myProblem.writer.Close()
path = TemporaryDirectory.GetTempPath() +'TestThermal3D.xmf'
XdmfWriter.WriteMeshToXdmf(path,myMesh,
[myProblem.u, myProblem.f],
PointFieldsNames= ['Temperature','q'],
GridFieldsNames=[])
print('DONE')
print(TemporaryDirectory.GetTempPath())
print(np.max(myProblem.u))
if abs(np.max(myProblem.u)-50.) > 1e-4:
raise Exception(f'{abs(np.max(myProblem.u))} not equal to 50')# pragma: no cover
return("ok")
[docs]
def CheckIntegrityDep3D():
import time
from Muscat.MeshTools.ConstantRectilinearMeshTools import CreateConstantRectilinearMesh
import Muscat.IO.XdmfWriter as XdmfWriter
from Muscat.Helpers.IO.TemporaryDirectory import TemporaryDirectory
print('------------------------------- Dep3D ----------------------------------------------')
nx = 11
ny = 12
nz = 13
myMesh = CreateConstantRectilinearMesh(dimensions=[nx,ny,nz],spacing=[0.1, 0.1, 10./(nz-1)], origin=[0, 0, 0] )
# block all the faces right
myProblem = Fea()
dirichletBcs = myProblem.dirichletBcs
dtagI = myMesh.nodesTags.CreateTag("BlockI")
dtagII = myMesh.nodesTags.CreateTag("BlockII")
for x in range(nx):
for y in range(ny):
dtagI.AddToTag(GetMonoIndex( [[x,y,0]],[nx,ny,nz])[0] )
dtagII.AddToTag(GetMonoIndex( [[x,y,nz-1]],[nx,ny,nz])[0] )
myProblem.AddDirichletCondition(NodeFilter(nTag="BlockI"), [True, True, True] , lambda x : [0,0,0] )
myProblem.AddDirichletCondition(NodeFilter(nTag="BlockII"), [True, True, True] , lambda x : [1,1,1] )
starttime = time.time()
myProblem.SetMesh(myMesh)
myProblem.BuildProblem(dofpernode = 3)
print("Time for Fea definition : " + str(time.time() -starttime))
starttime = time.time()
densities = np.ones(myMesh.GetNumberOfElements(dim=3))
myProblem.Solve(densities)
print("Time for Fea solve : " + str(time.time() -starttime))
XdmfWriter.WriteMeshToXdmf(TemporaryDirectory.GetTempPath() +'TestDep3D.xmf',myMesh,
[myProblem.u, myProblem.f, myProblem.nodal_elastic_energy() ],
[densities, myProblem.element_elastic_energy() ] ,
[],
PointFieldsNames= ['Dep','F','NEnergie'],
CellFieldsNames=['densities','EEnergie'],
GridFieldsNames=[])
print(np.max(myProblem.u))
if abs(np.max(myProblem.u)-1.00215295) > 1e-5:
print(TemporaryDirectory.GetTempPath())
raise Exception("The value must be 1.00215295")# pragma: no cover
[docs]
def CheckIntegrityThermal2D():
from Muscat.MeshTools.ConstantRectilinearMeshTools import CreateConstantRectilinearMesh
import Muscat.IO.XdmfWriter as XdmfWriter
import time
from Muscat.Helpers.IO.TemporaryDirectory import TemporaryDirectory
print('---------------------------- Thermal2D -------------------------------------------------')
nx = 11
ny = 11
myMesh = CreateConstantRectilinearMesh(dimensions=[nx,ny],spacing=[0.1, 0.1], origin=[0, 0] )
dtagI = myMesh.nodesTags.CreateTag("Block")
dtagII = myMesh.nodesTags.CreateTag("Load")
for x in range(nx):
dtagI.AddToTag(GetMonoIndex( [[x,0]],[nx,ny])[0] )
for y in range(ny):
dtagII.AddToTag(GetMonoIndex([[x,y]],[nx,ny])[0] )
print(myMesh)
myProblem = Fea()
myProblem.SetMesh(myMesh)
myProblem.AddDirichletCondition(NodeFilter(nTag="Block"), [True],lambda x : [0] )
myProblem.AddNeumannCondition(NodeFilter(nTag="Load"), [True], lambda x : [1] )
starttime = time.time()
myElement = ElementaryMatrix(dim=2,physics="thermal")
myElement.geoFactor = myMesh.props.get("spacing")
myProblem.BuildProblem(dofpernode = 1,
KOperator = myElement.GetTangentMatrix(),
MOperator = myElement.GetMassMatrix())
print("Time for Fea definition : " + str(time.time() -starttime))
myProblem.writer = XdmfWriter.XdmfWriter(TemporaryDirectory.GetTempPath()+"TestProblemWriterThermal2D.xdmf")
myProblem.writer.SetBinary()
myProblem.writer.SetTemporal()
myProblem.writer.Open()
myProblem.linearSolver = 'Direct'
myProblem.Solve()
myProblem.Write()
myProblem.element_elastic_energy()
myProblem.Write()
myProblem.writer.Close()
path = TemporaryDirectory.GetTempPath() +'TestThermal2D.xmf'
XdmfWriter.WriteMeshToXdmf(path,myMesh,
[myProblem.u, myProblem.f],
PointFieldsNames= ['Temperature','q'],
GridFieldsNames=[])
print('DONE')
print(np.max(myProblem.u))
if abs(np.max(myProblem.u)-.5) > 1e-5:
raise Exception(f"{np.max(myProblem.u)} grater than 5")# pragma: no cover
return 'OK'
[docs]
def CheckIntegrityDep2D():
from Muscat.MeshTools.ConstantRectilinearMeshTools import CreateConstantRectilinearMesh
import Muscat.IO.XdmfWriter as XdmfWriter
import time
from Muscat.Helpers.IO.TemporaryDirectory import TemporaryDirectory
print('----------------------- 2D dep ------------------------------------------------------')
nx = 11
ny = 12
myMesh = CreateConstantRectilinearMesh(dimensions=[nx,ny], spacing=[1./(nx-1), 1./(ny-1)], origin=[0, 0] )
dtagI = myMesh.nodesTags.CreateTag("BlockI")
dtagII = myMesh.nodesTags.CreateTag("BlockII")
for x in range(nx):
dtagI.AddToTag(GetMonoIndex( [[x,0]],[nx,ny])[0] )
dtagII.AddToTag(GetMonoIndex([[x,ny-1]],[nx,ny])[0] )
print(myMesh)
myProblem = Fea()
myProblem.SetMesh(myMesh)
myProblem.AddDirichletCondition(NodeFilter(nTag="BlockI"), [True, True], lambda x : [0, 0] )
myProblem.AddDirichletCondition(NodeFilter(nTag="BlockII"), [True, True], lambda x : [1, 1] )
starttime = time.time()
myProblem.BuildProblem(dofpernode = 2)
print("Time for Fea definition : " + str(time.time() -starttime))
starttime = time.time()
densities = np.ones(myMesh.GetNumberOfElements(dim=2))
myProblem.Solve(densities)
print("Time for Fea solve : " + str(time.time() -starttime))
print(myProblem.u.T)
# build mass matrix
myProblem.BuildMassMatrix()
myProblem.BuildMassMatrix(densities)
XdmfWriter.WriteMeshToXdmf(TemporaryDirectory.GetTempPath() +'TestDep2D.xmf',myMesh,
[myProblem.u, myProblem.f, myProblem.nodal_elastic_energy(), myProblem.fixed.astype(int) ],
[densities, myProblem.element_elastic_energy() ] ,
[],
PointFieldsNames= ['Dep','F','NEnergie', 'ufixed'],
CellFieldsNames=['densities','EEnergie'],
GridFieldsNames=[])
return 'ok'
[docs]
def CheckIntegrity():
from Muscat.Helpers.IO.TemporaryDirectory import TemporaryDirectory
print(CheckIntegrityThermal3D())
print(CheckIntegrityDep3D())
print(CheckIntegrityThermal2D())
print(CheckIntegrityDep2D())
from Muscat.Helpers.IO.TemporaryDirectory import TemporaryDirectory
print(TemporaryDirectory.GetTempPath())
return "ok"
if __name__ == '__main__':
print(CheckIntegrity()) #pragma: no cover