Help - plate model
- andressa
- Topic Author
- New Member
Less
More
1 year 10 months ago #4667
by andressa
Help - plate model was created by andressa
Dear all,
I am working with the Reissner-minlin plate model, the trial source term f is given by the two-dimensional Dirac delta
function. However, the program returns an error using CoefficientFunction:
f = LinearForm(source *du* dx).Assemble()
netgen.libngpy._meshing.NgException: Linearform must not have TrialFunction
Code:
##########################################################################################################
from ngsolve import *
from ngsolve.meshes import MakeStructured2DMesh
cx, cy = [], []
# one ball
cx.append(0.66666667)
cy.append(0.66666667)
# two ball
cx.append(0.5)
cy.append(0.25)
def gdirac(cx, cy):
# eps = 7.499999999999972e-01 #0.1*meshsize
eps = 2.499999999999994e-01
coef = 1.0/(2.0*pi*eps*eps)
dif = -((x-cx)*(x-cx) + (y-cy)*(y-cy) )/(2*eps)
gdirX = -coef * exp(dif) * (x-cx)
gdirY = -coef * exp(dif) * (y-cy)
return gdirX, gdirY
E, nu, k = 10.92, 0.3, 5/6
mu = E/(2*(1+nu))
lam = E*nu/(1-nu**2)
#shearing modulus
G = E/(2*(1+nu))
#thickness, shear locking with t=0.1
t = 0.1
R = 5
#force
order = 1
Db = E*t**3/(12*(1-nu**2))
mesh = MakeStructured2DMesh(quads=False, nx=6, ny=6)
moment=[]
# 1: cavitation
coef = (2.0*mu + 3*lam)
beta = 1.0e-10
m11, m12 = beta*coef, 0
m21, m22 = 0, beta*coef
# moment tensor: cisalhamento
moment.append(m11, m12], [m21, m22)
clamped = True
if clamped:
fesB = VectorH1(mesh, order=order, dirichletx="circ|left", dirichlety="circ|bottom", autoupdate=True)
else:
fesB = VectorH1(mesh, order=order, dirichletx="left", dirichlety="bottom", autoupdate=True)
fesW = H1(mesh, order=order, dirichlet="circ", autoupdate=True)
fes = FESpace( [fesB, fesW], autoupdate=True )
(beta,u), (dbeta,du) = fes.TnT()
fes.ndof
nz = fes.ndof
Z = GridFunction(fes)
Gamma = HCurl(mesh,order=order, autoupdate=True)
with TaskManager():
a = BilinearForm(fes)
a += t**3/12*(2*mu*InnerProduct(Sym(grad(beta)),Sym(grad(dbeta))) + lam*div(beta)*div(dbeta))*dx
a += t*k*G*InnerProduct(Interpolate(grad(u)-beta,Gamma), Interpolate(grad(du)-dbeta,Gamma))*dx
a.Assemble()
print(a)
cx_, cy_ = cx[0], cy[0]
gdirX, gdirY = gdirac(cx_, cy_)
sorX = (beta*coef)*gdirX
sorY = (beta*coef)*gdirY
source = CoefficientFunction((sorX, sorY))
f = LinearForm(source *du* dx).Assemble()
# res = f.vec.CreateVector()
# res.data += f.vec - a.mat * Z.vec
# Z.vec.data += a.mat.Inverse(freedofs=fes.FreeDofs()) * res
##################################################################################################
Regards,
Andressa
I am working with the Reissner-minlin plate model, the trial source term f is given by the two-dimensional Dirac delta
function. However, the program returns an error using CoefficientFunction:
f = LinearForm(source *du* dx).Assemble()
netgen.libngpy._meshing.NgException: Linearform must not have TrialFunction
Code:
##########################################################################################################
from ngsolve import *
from ngsolve.meshes import MakeStructured2DMesh
cx, cy = [], []
# one ball
cx.append(0.66666667)
cy.append(0.66666667)
# two ball
cx.append(0.5)
cy.append(0.25)
def gdirac(cx, cy):
# eps = 7.499999999999972e-01 #0.1*meshsize
eps = 2.499999999999994e-01
coef = 1.0/(2.0*pi*eps*eps)
dif = -((x-cx)*(x-cx) + (y-cy)*(y-cy) )/(2*eps)
gdirX = -coef * exp(dif) * (x-cx)
gdirY = -coef * exp(dif) * (y-cy)
return gdirX, gdirY
E, nu, k = 10.92, 0.3, 5/6
mu = E/(2*(1+nu))
lam = E*nu/(1-nu**2)
#shearing modulus
G = E/(2*(1+nu))
#thickness, shear locking with t=0.1
t = 0.1
R = 5
#force
order = 1
Db = E*t**3/(12*(1-nu**2))
mesh = MakeStructured2DMesh(quads=False, nx=6, ny=6)
moment=[]
# 1: cavitation
coef = (2.0*mu + 3*lam)
beta = 1.0e-10
m11, m12 = beta*coef, 0
m21, m22 = 0, beta*coef
# moment tensor: cisalhamento
moment.append(m11, m12], [m21, m22)
clamped = True
if clamped:
fesB = VectorH1(mesh, order=order, dirichletx="circ|left", dirichlety="circ|bottom", autoupdate=True)
else:
fesB = VectorH1(mesh, order=order, dirichletx="left", dirichlety="bottom", autoupdate=True)
fesW = H1(mesh, order=order, dirichlet="circ", autoupdate=True)
fes = FESpace( [fesB, fesW], autoupdate=True )
(beta,u), (dbeta,du) = fes.TnT()
fes.ndof
nz = fes.ndof
Z = GridFunction(fes)
Gamma = HCurl(mesh,order=order, autoupdate=True)
with TaskManager():
a = BilinearForm(fes)
a += t**3/12*(2*mu*InnerProduct(Sym(grad(beta)),Sym(grad(dbeta))) + lam*div(beta)*div(dbeta))*dx
a += t*k*G*InnerProduct(Interpolate(grad(u)-beta,Gamma), Interpolate(grad(du)-dbeta,Gamma))*dx
a.Assemble()
print(a)
cx_, cy_ = cx[0], cy[0]
gdirX, gdirY = gdirac(cx_, cy_)
sorX = (beta*coef)*gdirX
sorY = (beta*coef)*gdirY
source = CoefficientFunction((sorX, sorY))
f = LinearForm(source *du* dx).Assemble()
# res = f.vec.CreateVector()
# res.data += f.vec - a.mat * Z.vec
# Z.vec.data += a.mat.Inverse(freedofs=fes.FreeDofs()) * res
##################################################################################################
Regards,
Andressa
- mneunteufel
- Offline
- Premium Member
Less
More
- Thank you received: 59
1 year 10 months ago #4669
by mneunteufel
Replied by mneunteufel on topic Help - plate model
Hi Andressa,
in sorX and sorY you use beta, which is a TrialFunction.
In Linearforms, however, only TestFunctions are allowed, therefore the error message.
If you use a CoefficientFunction not including some Trialfunctions this error should be gone.
The final expression in the LinearForm has to be a scalar. Currently source is a vector and du a scalar which will give you an error. If you make source scalar valued your file should work.
Best,
Michael
in sorX and sorY you use beta, which is a TrialFunction.
In Linearforms, however, only TestFunctions are allowed, therefore the error message.
If you use a CoefficientFunction not including some Trialfunctions this error should be gone.
The final expression in the LinearForm has to be a scalar. Currently source is a vector and du a scalar which will give you an error. If you make source scalar valued your file should work.
Best,
Michael
Time to create page: 0.094 seconds