Galerkin không liên tục / Poisson / Fenics


10

Tôi đang cố gắng giải phương trình Poisson 2D bằng phương pháp Galerkin không liên tục (DG) và sự rời rạc sau đây (tôi có tệp png nhưng tôi không được phép tải lên, xin lỗi):

Phương trình:

(κT)+f= =0

Phương trình mới:

q= =κTq= =-f

Dạng yếu với thông lượng số và : qT^q^

qwdV= =-T(κw)dV+κT^nwdSqvdV= =vfdV+q^nvdS

Thông lượng số (phương thức IP):

q^= ={T}-C11[T]T^= ={T}

với

{T}= =0,5(T++T-)[T]= =T+n++T-n-

Tôi đã viết một kịch bản python fenics đơn giản để giải phương trình. Giải pháp tôi nhận được là không tốt. Tôi thực sự đánh giá cao nếu ai đó quen thuộc với phương pháp DG có thể xem nhanh kịch bản dưới đây và cho tôi biết tôi đang làm gì sai.

Công thức galerkin liên tục mà tôi đã thêm trong kịch bản cho một giải pháp tốt đẹp.

Cảm ơn rất nhiều trước.

from dolfin import *

method = "DG" # CG / DG

# Create mesh and define function space
mesh = UnitSquare(32, 32)
V_q = VectorFunctionSpace(mesh, method, 2)
V_T = FunctionSpace (mesh, method, 1)
W = V_q * V_T

# Define test and trial functions
(q, T) = TrialFunctions(W)
(w, v) = TestFunctions(W)

# Define mehs quantities: normal component, mesh size
n = FacetNormal(mesh)

# define right-hand side
f = Expression("500.0*exp(-(pow(x[0] - 0.5, 2) + pow(x[1] - 0.5, 2)) / 0.02)")

# Define parameters
kappa = 1.0

# Define variational problem
if method == 'CG':
  a = dot(q,w)*dx \
       + T*div(kappa*w)*dx \
       + div(q)*v*dx

elif method == 'DG':
  #modele = "IP"
  C11 = 1.

  a = dot(q,w)*dx + T*div(kappa*w)*dx \
      - kappa*avg(T)*dot(n('-'),w('-'))*dS \
                                           \
      + dot(q,grad(v))*dx \
      - dot( avg(grad(T)) - C11 * jump(T,n) ,n('-'))*v('-')*dS

L = -v*f*dx

# Compute solution
qT = Function(W)
solve(a == L, qT)

# Project solution to piecewise linears
(q , T) = qT.split()

# Save solution to file
file = File("poisson.pvd")
file << T

# Plot solution
plot(T); plot(q)
interactive()

Câu trả lời:


10

Để thực hiện vấn đề của bạn trong FEniCS, bạn phải thay thế các tích phân theo các ranh giới bằng các tích phân theo các cạnh. Điều này giới thiệu các bước nhảy / trung bình trong các chức năng kiểm tra mà bạn hoàn toàn bỏ lỡ trong quá trình thực hiện. Do đó, hệ thống không thể đảo ngược và giải pháp của bạn có vẻ không ổn. Phương trình (3.3) trong Arnold et. al. 2002 cung cấp cho bạn một công cụ để viết lại dạng yếu:

ΣKThKqKnKφKdS= =Γ[q]{φ}dS+Γ0{q}[φ]dS

Ở đây là sự kết hợp các cạnh của bạn và giống nhau không có ranh giới.ΓΓ0

Bây giờ thông lượng của bạn là giá trị đơn, có nghĩa là bạn có thể bỏ các bước nhảy của thông lượng. Do đó

ΣKThKq^nKvKdS= =Γ0q^[v]dS+Ωq^nvdSΣKThKwnKκT^dS= =Γ[w]κT^dS

Điều này dẫn chúng tôi đến sửa đổi mã sau đây của bạn:

C11 = 1.
qhat = avg(grad(T)) - C11 * kappa*jump(T,n)
qhatbnd = grad(T) - C11 * kappa*T*n

a = dot(q,w)*dx + T*div(kappa*w)*dx \
  - kappa*avg(T)*jump(w,n)*dS \
  - kappa*T*dot(w,n)*ds \
  - dot(q,grad(v))*dx \
  + dot( qhat, jump(v,n))*dS \
  + dot( qhatbnd, v*n)*ds

Tôi chưa có thời gian để thực sự thử điều này, vì vậy hãy lưu ý đến các lỗi có thể xảy ra, v.v. Nhưng tôi hy vọng điều này sẽ giúp ích.

Tài liệu tham khảo: DN Arnold, F. Brezzi, B. Cockburn, LD Marini: Phân tích thống nhất các phương pháp Galerkin không liên tục cho các vấn đề Elliptic SIAM J. Num. Hậu môn, 39 (2002), 1749-1779


Vâng, tôi đã thực sự thiếu một cái gì đó.
micdup

-2

Vâng, tôi đã thực sự thiếu một cái gì đó!

Nó đang hoạt động tốt bây giờ.

Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn!


2
Để hoàn thiện, bạn có thể mô tả những gì bạn đã thiếu và cách bạn sửa nó.
Paul
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.