FeniCS: แสดงองค์ประกอบลำดับสูง


14

ฉันเพิ่งเริ่มสับสนกับ FEniCS ฉันกำลังแก้ไข Poisson ด้วยองค์ประกอบลำดับที่ 3 และต้องการให้เห็นภาพผลลัพธ์ อย่างไรก็ตามเมื่อฉันใช้ plot (u) การสร้างภาพข้อมูลเป็นเพียงการแก้ไขเชิงเส้นของผลลัพธ์ ฉันได้สิ่งเดียวกันเมื่อฉันส่งออกไปยัง VTK ในรหัสอื่นที่ฉันทำงานด้วยฉันเขียนเอาต์พุต VTK ที่จะเพิ่มองค์ประกอบการสั่งซื้อที่สูงขึ้นเพื่อให้พวกเขาดูลำดับที่สูงขึ้นใน Paraview มีอะไรเช่นนี้ (หรือดีกว่า) ใน FEniCS หรือไม่

คำตอบ:


12

คุณสามารถสอดแทรกโซลูชันลงบนตาข่ายที่ละเอียดยิ่งขึ้นแล้วลงจุด:

from dolfin import *

coarse_mesh = UnitSquareMesh(2, 2)
fine_mesh = refine(refine(refine(coarse_mesh)))

P2_coarse = FunctionSpace(coarse_mesh, "CG", 2)
P1_fine = FunctionSpace(fine_mesh, "CG", 1)

f = interpolate(Expression("sin(pi*x[0])*sin(pi*x[1])"), P2_coarse)
g = interpolate(f, P1_fine)

plot(f, title="Bad plot")
plot(g, title="Good plot")

interactive()

สังเกตว่าคุณจะเห็นโครงร่างของสามเหลี่ยม P2 หยาบในโครงเรื่องบนตาข่ายที่ละเอียดกว่าได้อย่างไร

พล็อตของฟังก์ชั่น P2 บนตาข่ายหยาบ

พล็อตของฟังก์ชั่น P2 สอดแทรกไปที่ฟังก์ชั่น P1 บนตาข่ายละเอียด


8

ฉันทำงานเพื่อปรับแต่งการปรับแต่งเล็กน้อยเพื่อทำงาน (ดูรหัสด้านล่าง) การปรับขนาดของตัวบ่งชี้ข้อผิดพลาดที่มีขนาดตาข่ายทั้งหมดและการเปลี่ยนแปลงทั้งหมดของฟังก์ชันตาข่ายนั้นไม่สมบูรณ์แบบ แต่คุณสามารถปรับให้เหมาะกับความต้องการของคุณได้ ภาพด้านล่างสำหรับ testcase # 4 จำนวนเซลล์เพิ่มขึ้นจาก 200 เป็นประมาณ 24,000 ซึ่งอาจสูงกว่าเล็กน้อย แต่ผลลัพธ์ค่อนข้างดี ตาข่ายแสดงว่าเฉพาะส่วนที่เกี่ยวข้องเท่านั้นที่ได้รับการปรับปรุง สิ่งประดิษฐ์ที่คุณยังคงเห็นคือสิ่งที่องค์ประกอบลำดับสามตัวเองไม่สามารถแสดงความถูกต้องได้อย่างเพียงพอ

from dolfin import *
from numpy import abs


def compute_error(expr, mesh):
    DG = FunctionSpace(mesh, "DG", 0)
    e = project(expr, DG)
    err = abs(e.vector().array())
    dofmap = DG.dofmap()
    return err, dofmap


def refine_by_bool_array(mesh, to_mark, dofmap):
    cell_markers = CellFunction("bool", mesh)
    cell_markers.set_all(False)
    n = 0
    for cell in cells(mesh):
        index = dofmap.cell_dofs(cell.index())[0]
        if to_mark[index]:
            cell_markers[cell] = True
            n += 1
    mesh = refine(mesh, cell_markers)
    return mesh, n


def adapt_mesh(f, mesh, max_err=0.001, exp=0):
    V = FunctionSpace(mesh, "CG", 1)
    while True:
        fi = interpolate(f, V)
        v = CellVolume(mesh)
        expr = v**exp * abs(f-fi)
        err, dofmap = compute_error(expr, mesh)

        to_mark = (err>max_err)
        mesh, n = refine_by_bool_array(mesh, to_mark, dofmap)
        if not n:
            break

        V = FunctionSpace(mesh, "CG", 1)
    return fi, mesh


def show_testcase(i, p, N, fac, title1="", title2=""):
    funcs = ["sin(60*(x[0]-0.5)*(x[1]-0.5))",
             "sin(10*(x[0]-0.5)*(x[1]-0.5))",
             "sin(10*(x[0]-0.5))*sin(pow(3*(x[1]-0.05),2))"]

    mesh = UnitSquareMesh(N, N)
    U = FunctionSpace(mesh, "CG", p)
    f = interpolate(Expression(funcs[i]), U)

    v0 = (1.0/N) ** 2;
    exp = 1
    #exp = 0
    fac2 = (v0/100)**exp
    max_err = fac * fac2
    #print v0, fac, exp, fac2, max_err
    g, mesh2 = adapt_mesh(f, mesh, max_err=max_err, exp=exp)

    plot(mesh, title=title1 + " (mesh)")
    plot(f, title=title1)
    plot(mesh2, title=title2 + " (mesh)")
    plot(g, title=title2)
    interactive()


if __name__ == "__main__":
    N = 10
    fac = 0.01
    show_testcase(0, 1, 10, fac, "degree 1 - orig", "degree 1 - refined (no change)")
    show_testcase(0, 2, 10, fac, "degree 2 - orig", "degree 2 - refined")
    show_testcase(0, 3, 10, fac, "degree 3 - orig", "degree 3 - refined")
    show_testcase(0, 3, 10, 0.2*fac, "degree 3 - orig", "degree 3 - more refined")
    show_testcase(1, 2, 10, fac, "smooth: degree 2 - orig", "smooth: degree 2 - refined")
    show_testcase(1, 3, 10, fac, "smooth: degree 3 - orig", "smooth: degree 3 - refined")
    show_testcase(2, 2, 10, fac, "bumps: degree 2 - orig", "bumps: degree 2 - refined")
    show_testcase(2, 3, 10, fac, "bumps: degree 3 - orig", "bumps: degree 3 - refined")

พล็อตบนตาข่ายที่ไม่เน่า ตาข่ายสาก พล็อตบนตาข่ายกลั่น ตาข่ายที่ผ่านการกลั่นอย่างเหมาะสม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.