Воссоздайте фипы Grid2D с помощью конструктора Mesh2D - PullRequest
0 голосов
/ 24 апреля 2019

Если я создаю двумерную сетку, используя:

mesh = Grid2D(nx=3, ny=3, dx=1., dy=1.)

Я получаю разумную сетку из прямоугольных элементов. Однако, если я возьму значения этой сетки и использую их для построения ванили Mesh2D:

mesh2d = Mesh2D(mesh.vertexCoords, mesh.faceVertexIDs, mesh.cellFaceIDs)

Я получаю треугольную сетку, и некоторые треугольники кажутся недействительными. Если я сделаю это:

model = CellVariable(mesh=mesh2d, value=1.)

и просмотрите его с помощью средства просмотра matplotlib, некоторые из треугольников не заполнены, что, как я предполагаю, означает, что они недействительны.

Можно ли воссоздать исходную прямоугольную сетку, используя Mesh2D? Я хотел бы сделать это, потому что я исказил координаты прямоугольной сетки из другого источника, который я хотел бы заменить на mesh.vectorCoords в вызове Mesh2D. Вершины граней и грани ячеек одинаковы, искажена только сетчатая ткань.

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Grid2D имеет ряд оптимизаций, которые являются самосогласованными как при решении, так и при просмотре, но не относятся к общим сеткам. Вы можете достичь того, чего хотите, вместо этого

mesh = fipy.meshes.nonUniformGrid2D.NonUniformGrid2D(nx=3, ny=3, dx=1., dy=1.)
mesh2d = Mesh2D(mesh.vertexCoords, mesh.faceVertexIDs, mesh.cellFaceIDs)
model = CellVariable(mesh=mesh2d, value=1.)
1 голос
/ 24 апреля 2019

Я думаю, что зритель не может отобразить класс сетки Mesh2D, а не все, что в корне неправильно при использовании объекта Mesh2D для решения уравнений. Чтобы продемонстрировать это, вы можете решить простое уравнение с помощью Mesh2D, а затем отобразить обратно на Grid2D для отображения ваших данных. Например,

import fipy

mesh = fipy.Grid2D(nx=3, ny=3, dx=1., dy=1.)
mesh2d = fipy.meshes.mesh2D.Mesh2D(mesh.vertexCoords, mesh.faceVertexIDs, mesh.cellFaceIDs)

var = fipy.CellVariable(mesh=mesh, value=1.)
var2D = fipy.CellVariable(mesh=mesh2d, value=1.)

var2D.constrain(2, where=mesh.facesRight)
var2D.constrain(0, where=mesh.facesLeft)

fipy.DiffusionTerm().solve(var2D)


var[:] = var2D(mesh.cellCenters, order=1)

fipy.Viewer(var).plot()
raw_input('stop')

и результат выглядит правильно. Мы решили уравнение, используя переменную на Mesh2D, и, похоже, оно отлично работает.

Выше используется метод __call__ из CellVariable для интерполяции обратно к переменной в Grid2D. Этот подход будет работать и для вашей искаженной сетки. Интерполяция только первого порядка.

...