Получите FaceVariable в Физической Линии GMSH
Я успешно установил очень простую задачу диффузии, включая исходную грань (континуум) и грани стока (боковая стенка, верхняя часть) в сетке, созданной с помощью GMSH.
from fipy import *
mesh = Gmsh2D('''Point(1) = {0, 0, 0, 1.0};
Point(2) = {12, 0, 0, 0.1};
Point(3) = {12, 16, 0, 0.1};
Point(4) = {15, 16, 0, 0.1};
Point(5) = {15, 100, 0, 1.0};
Point(6) = {0, 100, 0, 1.0};
Line(1) = {1, 2};
Line(2) = {2, 3};
Line(3) = {3, 4};
Line(4) = {4, 5};
Line(5) = {5, 6};
Line(6) = {6, 1};
Line Loop(1) = {1, 2, 3, 4, 5, 6};
Plane Surface(1) = {1};
Physical Line("continuum") = {5};
Physical Line("sidewall") = {2};
Physical Line("top") = {3};
Physical Surface("domain") = {1};
''')
c = CellVariable(name='concentration', mesh=mesh, value=0.)
c.faceGrad.constrain([-0.05 * c.harmonicFaceValue], mesh.physicalFaces["sidewall"])
c.faceGrad.constrain([0.05 * c.harmonicFaceValue], mesh.physicalFaces["top"])
c.constrain(1., mesh.physicalFaces["continuum"])
dim = 1.
D = 1.
dt = 50 * dim**2 / (2 * D)
steps = 100
eq = TransientTerm() == DiffusionTerm(coeff=D)
viewer = Viewer(vars=(c, c.grad), datamin=0., datamax=1.)
for step in range(steps):
eq.solve(var=c, dt=dt)
viewer.plot()
TSVViewer(vars=(c, c.grad)).plot(filename="conc.tsv")
raw_input('Press any key...')
Расчет работает как задумано, однако я хотел бы получить доступ к градиенту на физических гранях, которые я настроил в GMSH. Я знаю, что могу получить градиент на лицах, используя c.faceGrad
и маска, представляющая физические лица, используя mesh.physicalFaces['sidewall']
, Чтобы получить градиент на гранях, содержащихся в физическом лице, я ожидал бы использовать индексирование как c.faceGrad[mesh.physicalFaces['sidewall']]
, Однако это не дает желаемого результата. Есть ли способ получить доступ к FaceVariable в местах, указанных physicalFaces
?
1 ответ
Помни что c.faceGrad
имеет форму (2, 22009)
поэтому маска работает на втором индексе как форма mesh.physicalFaces['sidewall']
является (22009,)
, Так что постарайтесь
c.faceGrad[:, mesh.physicalFaces['sidewall']]
и получить доступ к правильной форме использования
np.array(c.faceGrad[:, mesh.physicalFaces['sidewall']]).shape
который (2, 160)
,