Цилиндрическая сетка OpenFOAM blockMesh и ее paraFoam, отображающая нормали граней

Раздел OpenFOAM:

Я создал сетку для формы полого цилиндра в OpenFOAM с помощью метода обрезки кромок / а>. В этой модели поток будет течь от внешней стенки цилиндра к внутренней стенке цилиндра; Закон правой руки используется для точек сетки, как показано ниже:  введите описание изображения здесь Я попытался построить нормали граней с помощью OpenFOAM, скомпилированного paraFoam, но не смог. Можно построить грани граничной сетки (которые находятся на верхней, нижней, внутренней и внешней стенках цилиндра) с помощью нормалей глифов, но не на внутренних гранях сетки.

Q OpenFOAM: Есть ли код функции или способ построить их внутри paraFoam?

Файл сетки был экспортирован для построения внутри Python, как показано на правом верхнем рисунке. Таким образом, очевидно, что грани сетки на плоскости перекрытия Start-End имеют противоположные направления по сравнению с нормалями других вращающихся граней.

Q OpenFOAM: Это нормальное направление приводит к неправильным результатам? или результаты контролируются только правилом правой руки? Есть ли какой-нибудь код или способ изменить эти направления, если это необходимо?

Примечание. Я импортировал этот файл сетки в python FiPy с помощью Gmsh3D и использовал его faceNormals и cellCenters для построения нормалей граней с помощью matplotlib.

Раздел FiPy:

Я изменил направление нормали граней сетки Start-End по часовой стрелке на против часовой стрелки с помощью следующего кода из-за того, что мне нужно использовать направление faceNormals против часовой стрелки:

for i in range(self.mesh.numberOfCells):
    for f in self.mesh.cellFaceIDs.data.T[i]:
        if self.mesh.faceCenters().T[f][0] > 0 > self.mesh.faceNormals.T[f][1] and self.mesh.faceCenters().T[f][1] == 0:
            self.mesh.faceNormals.T[f] = np.multiply(np.array([-1, -1, 1]), self.mesh.faceNormals.T[f])

Q FiPy: Влияют ли эти изменения направления нормали на результаты решения FiPy? Как я понял из недавнего объяснения (я не мог задать этот вопрос там, дуэт не имеет достаточного кворума репутации), FiPy рассматривает лицевую сторону ячейкиНормальное направление общей стороны наружу к соответствующей соседней ячейке, а направления faceNormal (которые показаны на картинке с использованием FiPy mesh.FaceNormals) не влияют на решение, сами; Это означает, что решатель может рассматривать его в противоположных направлениях в зависимости от обстоятельств. Это правильно?? Существуют ли какие-либо модули сетки FiPy для создания такой системы сеток цилиндрического типа O'grid, в которой могут быть доступны координаты x, y и z узлов? Я пробовал CylindricalGrid2D для радиальной сетки, но он дает только координаты r и z узлов.


person Ali_Sh    schedule 09.04.2021    source источник


Ответы (2)


Что касается сброса значений faceNormals с помощью FiPy. Это может быть невозможно в зависимости от типа сетки. Например, с сеткой в ​​стиле Grid2D, которая приведет к AttributeError: can't set attribute, поскольку нормали вычисляются при необходимости, а не сохраняются в объекте сетки. Если возможно, это, скорее всего, сломает FiPy. Например, следующее дает очень разные результаты при случайном переворачивании faceNormals.

from fipy import CellVariable, Grid3D, DiffusionTerm
from fipy.meshes.mesh import Mesh
import numpy as np

grid = Grid3D(nx=3, ny=3, nz=1)

mesh = Mesh(grid.vertexCoords, grid.faceVertexIDs, grid.cellFaceIDs)

var = CellVariable(mesh=mesh)

var.constrain(1, where=mesh.facesLeft)
var.constrain(0, where=mesh.facesRight)

DiffusionTerm().solve(var)
print(var)

var[:] = 0.0

flip = 2 * np.random.randint(2, size=mesh.faceNormals.shape[1]) - 1
mesh.faceNormals[:] = mesh.faceNormals * flip[None]

DiffusionTerm().solve(var)
print(var)
person wd15    schedule 09.04.2021
comment
Этот ответ относится к части вопроса, которая позже была удалена из исходного сообщения. - person wd15; 09.04.2021
comment
Спасибо за ответ, я удалил эту часть, потому что подумал, что лучше спросить по списку групп fipy. Я снова добавил сюда эту часть. - person Ali_Sh; 09.04.2021
comment
Случайное переворачивание может привести к неправильным ответам для любого типа сетки. В вашем примере это должно быть ограничено внутренними гранями, как моя проблема (поскольку я имел в виду то, что я назвал «общими лицами»). Использование [mesh.faceNormals.T[face][:] == mesh.faceNormals.T[face] * flip[face] for face in mesh.interiorFaceIDs] может дать верные ответы. Для плоскости перекрытия начала и конца величина z остается постоянной (ось цилиндра проходит вдоль оси z), но x и y были изменены на -x и -y. Таким образом, величины вектора нормали останутся постоянными, но с противоположными знаками (векторы нормали отражаются на соответствующих гранях). - person Ali_Sh; 10.04.2021
comment
Из вашего объяснения и как г-н. Совет Гайера, логичнее инициализировать faceVariable с помощью faceNormals, чтобы избежать возможных нежелательных неправильных результатов. - person Ali_Sh; 10.04.2021

FiPy рассматривает faceNormal направление общей грани наружу к соседней ячейке,

Нет, как указано в опубликованной вами ссылке, FiPy считает, что направление faceNormal находится во втором две клетки, ограничивающие лицо. Соседняя ячейка относительно ячейки. У грани есть две ограничивающие ячейки; если грань находится снаружи, то обе ограничивающие ячейки одинаковы.

и направления faceNormal (которые показаны на картинке с использованием FiPy mesh.FaceNormals) сами по себе не влияют на решение; Это означает, что решатель может рассматривать его в противоположных направлениях в зависимости от обстоятельств. Это правильно??

Нет. Как показано в ответе, опубликованном @ wd15, FiPy использует faceNormal внутри и ожидает, что он будет подчиняться определенным нами соглашениям, то есть всегда указывает на вторую ячейку.

Ничто не мешает вам инициализировать FaceVariable с помощью faceNormals, а затем переопределить некоторые значения по своему усмотрению:

my_normals = fp.FaceVariable(mesh=mesh, value=mesh.faceNormals, rank=1)
my_normals.setValue(my_desired_orientation, where=my_backward_faces)

Существуют ли какие-либо модули сетки FiPy для создания такой системы сеток цилиндрического типа O'grid, в которой могут быть доступны координаты x, y и z узлов?

No.

person jeguyer    schedule 09.04.2021
comment
Одна из моих целей вопроса состояла в том, чтобы понять, что если упомянутые нормали лицевой стороны по часовой стрелке на плоскости перекрытия Start-End (которые не находятся снаружи, задаются mesh.faceNormals и имеют противоположное направление по сравнению с другими) могут повлиять на окончательные результаты или не могут. Было понятно, что направление заданных векторов нормалей с помощью 'mesh.faceNormals' не влияет на результаты само по себе и будет направлено FiPy в том же или противоположном направлении на основе соглашений. В первой части ответа я имел в виду именно это; Я изменил фразу более четко. - person Ali_Sh; 10.04.2021