Осесимметричный блокMeshDict: FOAM FATAL ERROR: центральная плоскость клина не совпадает с координатной плоскостью

Я пытаюсь следовать этому руководству, чтобы создать осесимметричную модель ниже:

введите здесь описание изображения

После обсуждения здесь мой blockMeshDict файл:

FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      blockMeshDict;
}

convertToMeters 0.001;

wa 5.0;
cr 10.0;
pr 8.0;
cl 50.0;
px 20.0; 
pl 10.0; 
px2 #calc "$px+$pl"; 
ms 50; 

vertices
(
    (0                      0                         0)    //00
    (#calc "$pr*cos($wa/2)" #calc "$pr*sin($wa/2)"    0)    //01
    (#calc "$pr*cos($wa/2)" #calc "-$pr*sin($wa/2)"   0)    //02
    (#calc "$pr*cos($wa/2)" #calc "-$pr*sin($wa/2)"   $px)  //03
    (#calc "$pr*cos($wa/2)" #calc "$pr*sin($wa/2)"    $px)  //04
    (0                      0                         $px)  //05
    (#calc "$cr*cos($wa/2)" #calc "$cr*sin($wa/2)"    $px)  //06
    (#calc "$cr*cos($wa/2)" #calc "$cr*sin($wa/2)"    0)    //07
    (#calc "$cr*cos($wa/2)" #calc "-$cr*sin($wa/2)"   0)    //08
    (#calc "$cr*cos($wa/2)" #calc "-$cr*sin($wa/2)"   $px)  //09
    (#calc "$cr*cos($wa/2)" #calc "-$cr*sin($wa/2)"   $px2) //10
    (#calc "$cr*cos($wa/2)" #calc "$cr*sin($wa/2)"    $px2) //11
    (#calc "$pr*cos($wa/2)" #calc "$pr*sin($wa/2)"    $px2) //12
    (#calc "$pr*cos($wa/2)" #calc "-$pr*sin($wa/2)"   $px2) //13
    (#calc "$pr*cos($wa/2)" #calc "-$pr*sin($wa/2)"   $cl)  //14
    (#calc "$pr*cos($wa/2)" #calc "$pr*sin($wa/2)"    $cl)  //15
    (#calc "$cr*cos($wa/2)" #calc "$cr*sin($wa/2)"    $cl)  //16
    (#calc "$cr*cos($wa/2)" #calc "-$cr*sin($wa/2)"   $cl)  //17
    (0                      0                         $cl)  //18
    (0                      0                         $px2) //19
);

blocks
(
    hex (0  1  2  0  5  4  3  5)         ($ms 1 $ms) simpleGrading (1 1 1)
    hex (1  7  8  2  4  6  9  3)         ($ms 1 $ms) simpleGrading (1 1 1)
    hex (4  6  9  3  12 11 10 13)        ($ms 1 $ms) simpleGrading (1 1 1)
    hex (12 11 10 13 15 16 17 14)        ($ms 1 $ms) simpleGrading (1 1 1)
    hex (19 12 13 19 18 15 14 18)        ($ms 1 $ms) simpleGrading (1 1 1)
);

edges
(
);

boundary
(
    inlet
    {
        type patch;
        faces
        (
            (0 1 2 0)
            (1 7 8 2)
        );
    }
    outlet
    {
        type patch;
        faces
        (
            (18 15 14 18)
            (15 16 17 14)
        );
    }
    walls
    {
        type wall;
        faces
        (
            (7  8  9  6)
            (6  9  10 11)
            (11 10 17 16)
        );
    }
    wedgeBack
    {
        type wedge;
        faces
        (
            (0  1  4  5)
            (1  7  6  4)
            (4  6  11 12)
            (12 11 16 15)
            (19 12 15 18)
        );
    }

    wedgeFront
    {
        type wedge;
        faces
        (
            (0  2  3  5)
            (2  8  9  3)
            (3  9  10 13)
            (13 10 17 14)
            (19 13 14 18)
        );
    }

    axis
     { 
           type empty;
           faces  
           (
               (0  5  5  0)
               (19 18 18 19)
           );
    }
);

mergePatchPairs
(
);

Но когда я запускаю blockMesh, я получаю предупреждения вроде:

Создание топологии блочной сетки --> FOAM Предупреждение: из функции Foam::polyMesh::polyMesh(const Foam::IOobject&, const Foam::Xfer > >&, const cellShapeList&, const faceListList&, const wordList&, const Foam::PtrList&, const Foam::word&, const Foam::word&, bool) в файле meshes/polyMesh/polyMeshFromShapeMesh.C в строке 871 Найдено 3 неопределенных грани в сетке; добавление к патчу по умолчанию.

затем ошибка:

--> ФАТАЛЬНАЯ ОШИБКА FOAM: центральная плоскость фронта клина не совпадает с координатной плоскостью на 0,360319 из функции virtual void Foam::wedgePolyPatch::calcGeometry(Foam::PstreamBuffers&) в файле meshes/polyMesh/polyPatches/constraint/wedge/wedgePolyPatch .C в строке 98.

к сожалению, поиск в Google сообщения об ошибке не возвращает много. Я был бы признателен, если бы вы могли помочь мне узнать, в чем проблема и как я могу ее решить.


person Foad    schedule 22.08.2018    source источник
comment
Поиск сообщения об ошибке в Google может помочь, а может и не помочь с OpenFOAM, однако я нахожу сообщения об ошибках OpenFOAM весьма красноречивыми и полезными. Он точно говорит вам, что не так, хотя, должен признать, новичку, в том числе и мне, их иногда трудно читать. Но при наличии достаточного опыта сообщения об ошибках OpenFOAM действительно полезны.   -  person Dohn Joe    schedule 23.08.2018
comment
Кстати: сайт Computational Science SE является более распространенным местом для публикации вопросов, связанных с OpenFOAM. Я понятия не имею, как это делается, но предлагаю перенести вопрос в SciComp SE.   -  person Dohn Joe    schedule 23.08.2018
comment
@DohnJoe Я попробую ваш код и вернусь сюда. большое спасибо за твою помощь.   -  person Foad    schedule 23.08.2018
comment
@DohnJoe Я попробовал обмен стеками вычислительной науки для своего новый вопрос. не получил много помощи, хотя!   -  person Foad    schedule 23.08.2018
comment
Что ж, OpenFOAM — это очень специфическая тема. Так что не ждите немедленных ответов. К сожалению, сообщество OpenFOAM довольно мало.   -  person Dohn Joe    schedule 23.08.2018


Ответы (1)


То, как вы вычисляете координаты точки, кажется мне довольно странным, например. что должен означать параметр wa? Кажется, вы хотели, чтобы это был угол.

Мне удалось получить корректную сетку, изменив тип заплатки клиньев на тип patch, который более щадящий, чем тип wegde. Я часто делаю это при устранении неполадок blockMeshDicts.

Кроме того, я изменил порядок вершин в определении входного патча. Список вершин в определении патча должен соответствовать «правилу правой руки», см. Руководство пользователя.

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

Таким образом, я предлагаю:

  • Пока оставьте клинья типа patch.
  • Отсортируйте свою геометрию, чтобы вы могли создать срез геометрии в 1°.
  • Измените патчи клина обратно на wedge, как только ваша геометрия станет срезом в 1°.

Структура блока

FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      blockMeshDict;
}

convertToMeters 0.001;

wa 4.0;
cr 10.0;
pr 8.0;
cl 50.0;
px 20.0; 
pl 10.0; 
px2 #calc "$px+$pl"; 
ms 50; 

vertices
(
    (0                      0                         0)    //00
    (#calc "$pr*cos($wa/2)" #calc "$pr*sin($wa/2)"    0)    //01
    (#calc "$pr*cos($wa/2)" #calc "-$pr*sin($wa/2)"   0)    //02
    (#calc "$pr*cos($wa/2)" #calc "-$pr*sin($wa/2)"   $px)  //03
    (#calc "$pr*cos($wa/2)" #calc "$pr*sin($wa/2)"    $px)  //04
    (0                      0                         $px)  //05
    (#calc "$cr*cos($wa/2)" #calc "$cr*sin($wa/2)"    $px)  //06
    (#calc "$cr*cos($wa/2)" #calc "$cr*sin($wa/2)"    0)    //07
    (#calc "$cr*cos($wa/2)" #calc "-$cr*sin($wa/2)"   0)    //08
    (#calc "$cr*cos($wa/2)" #calc "-$cr*sin($wa/2)"   $px)  //09
    (#calc "$cr*cos($wa/2)" #calc "-$cr*sin($wa/2)"   $px2) //10
    (#calc "$cr*cos($wa/2)" #calc "$cr*sin($wa/2)"    $px2) //11
    (#calc "$pr*cos($wa/2)" #calc "$pr*sin($wa/2)"    $px2) //12
    (#calc "$pr*cos($wa/2)" #calc "-$pr*sin($wa/2)"   $px2) //13
    (#calc "$pr*cos($wa/2)" #calc "-$pr*sin($wa/2)"   $cl)  //14
    (#calc "$pr*cos($wa/2)" #calc "$pr*sin($wa/2)"    $cl)  //15
    (#calc "$cr*cos($wa/2)" #calc "$cr*sin($wa/2)"    $cl)  //16
    (#calc "$cr*cos($wa/2)" #calc "-$cr*sin($wa/2)"   $cl)  //17
    (0                      0                         $cl)  //18
    (0                      0                         $px2) //19
);

blocks
(
    hex (0  1  2  0  5  4  3  5)         ($ms 1 $ms) simpleGrading (1 1 1)
    hex (1  7  8  2  4  6  9  3)         ($ms 1 $ms) simpleGrading (1 1 1)
    hex (4  6  9  3  12 11 10 13)        ($ms 1 $ms) simpleGrading (1 1 1)
    hex (12 11 10 13 15 16 17 14)        ($ms 1 $ms) simpleGrading (1 1 1)
    hex (19 12 13 19 18 15 14 18)        ($ms 1 $ms) simpleGrading (1 1 1)
);

edges
(
);

boundary
(
    inlet
    {
        type patch;
        faces
        (
            (0 2 1 0)
            (1 2 8 7)
        );
    }
    outlet
    {
        type patch;
        faces
        (
            (18 15 14 18)
            (15 16 17 14)
        );
    }
    walls
    {
        type wall;
        faces
        (
            (7  8  9  6)
            (6  9  10 11)
            (11 10 17 16)
        );
    }
    wedgeBack
    {
        type patch;
        faces
        (
            (0  1  4  5)
            (1  7  6  4)
            (4  6  11 12)
            (12 11 16 15)
            (19 12 15 18)
        );
    }

    wedgeFront
    {
        type patch;
        faces
        (
            (0  2  3  5)
            (2  8  9  3)
            (3  9  10 13)
            (13 10 17 14)
            (19 13 14 18)
        );
    }

    axis
     { 
           type empty;
           faces  
           (
               (0  5  5  0)
               (19 18 18 19)
           );
    }
);

mergePatchPairs
(
);
person Dohn Joe    schedule 23.08.2018
comment
Большое спасибо. некоторые моменты: 1. wa означает угол клина, и я считал его равным 5, как указано в эта страница, будет ли лучше, если мы посчитаем ее меньше или ближе к 5? 2. не повлияет ли на решение замена клина на заплатку? 3. нормаль к каждой грани должна быть направлена ​​наружу? или все они должны быть в одном направлении? это действительно сбивает с толку! - person Foad; 23.08.2018
comment
Обратите внимание, что в тригонометрические функции вы вводите угол в радианах, а не в градусах. Из-за этого я смог создать корректную сетку только со значениями wa=4 и wa=5. - person Dohn Joe; 23.08.2018
comment
аааа, типичная ошибка первокурсников! Я исправлю это сейчас. это действительно 5 градусов! - person Foad; 23.08.2018
comment
Заплаты клина должны быть типа wedge, как только вы запустите симуляцию, но для устранения проблем с сеткой установка их на тип patch делает генерацию сетки более щадящей. На изображении, которое я разместил, клиновые патчи имеют тип patch, если бы я установил для них тип wedge, генерация сетки завершилась бы неудачей, и я не смог бы увидеть блочную структуру. - person Dohn Joe; 23.08.2018
comment
Патчи определяются таким образом, что нормаль лица направлена ​​наружу. Для этой цели очень полезно правило правой руки. Направьте большой палец так, чтобы он указывал наружу; а затем проведите указательным пальцем по границе патча, чтобы посетить все вершины. - person Dohn Joe; 23.08.2018
comment
Руководство пользователя: Порядок, в котором задаются вершины, должен быть таким, чтобы, если смотреть изнутри блока и начинать с любой вершины, необходимо пройти по грани по часовой стрелке, чтобы определить другие вершины. - person Dohn Joe; 23.08.2018
comment
Является ли это wa 5.0*constant::mathematical::pi/180; правильным способом перехода от градусов к радианам? - person Foad; 23.08.2018
comment
Существует предопределенная функция для использования: radHalfAngle #calc "degToRad($halfAngle)";, но то, что вы разместили, также должно помочь. - person Dohn Joe; 23.08.2018
comment
как ни странно, исправление проблемы с градусным радианом устранило вышеуказанную ошибку! но теперь у меня есть эта ошибка: FOAM FATAL IO ERROR: Block hex (0 1 2 0 5 4 3 5) (50 1 50) simpleGrading (1(1) 1(1) 1(1)) has inward- pointing faces 4(1 2 3 4) 4(0 1 4 5) 4(0 5 3 2) 4(0 0 2 1) 4(5 4 3 5) Сейчас я ее исправлю. - person Foad; 23.08.2018
comment
Думаю, вам нужно пересмотреть определение блока. Мне удалось создать допустимый блок 0 с альтернативным порядком вершин hex (0 2 1 0 5 3 4 5). Сообщение об ошибке направленные внутрь грани означает, что, скорее всего, порядок вершин в определении блока неправильный. - person Dohn Joe; 23.08.2018
comment
Хорошо, я думаю, что есть два способа рассмотреть лица. один при определении блоков/гексов, тогда нормаль двух граней, определяющих гекс, должна указывать на одно и то же направление, в нашем случае отрицательное z. но при определении границ они в норме должны указывать наружу. Это правда? - person Foad; 23.08.2018
comment
Я исправил нормали, как описано в комментарии выше, и больше не получаю ошибку: `FOAM FATAL ERROR: Несоответствующее количество граней между парой блоков 0 и 1 из функции void Foam::blockMesh::calcMergeInfo() в файле blockMesh/blockMeshMerge. C в строке 217.` - person Foad; 23.08.2018
comment
определение блока не зависит от определения лица. - person Dohn Joe; 23.08.2018
comment
Еще один совет по устранению неполадок: установите количество ячеек равным 1 для всех блоков и для всех направлений. Как только сетка с одной ячейкой на блок будет успешно создана, установите нужные значения для номеров ячеек. Несовместимое количество граней между парой блоков X и Y означает, что два соседних, соединенных блока дискретизированы с несовпадающими номерами ячеек. - person Dohn Joe; 23.08.2018
comment
Потрясающие. Я изменил все размеры сетки $ms на 1, и теперь он компилируется. а что с ними не так? - person Foad; 23.08.2018
comment
теперь я могу без проблем разделить все гексы в направлении z, а также первый и последний гексы в направлении x. проблема возникает, когда я пытаюсь связать 2, 3 и 4 в направлении x! вы можете найти мой последний blockMeshDict здесь - person Foad; 23.08.2018
comment
странно, но я смог разделить 2, 3 и 4 гекса в направлении x, изменив параметр y! вы можете увидеть обновленный blockMeshDict здесь. Теперь я также получаю это предупреждение: `Предупреждение FOAM: из функции virtual void Foam::wedgePolyPatch::calcGeometry(Foam::PstreamBuffers&) в файле meshes/polyMesh/polyPatches/constraint/wedge/wedgePolyPatch.C в строке 70 Wedge patch 'wedgeBack ' не является плоским. Локальная грань на нормали отличается от средней нормали Исправьте заплатку или разбейте ее на плоские части` - person Foad; 23.08.2018
comment
из здесь Я решил проблему, изменив writePrecision в файле controlDict с 6 на 7! OpenFOAM чертовски странный! - person Foad; 23.08.2018
comment
Да, проблема с writePrecision сложная. У меня были похожие проблемы в прошлом. Итак, почему это происходит? Записи #calc в blockMeshDict компилируются и запускаются для выполнения вычислений. Любые результаты записываются на диск с точностью, установленной writePrecision. Таким образом, вычисление координаты точки может использовать промежуточный результат в виде: os << (8.000000*cos(0.017453/2));. При слишком малой точности некоторые вычисления могут быть недостаточно точными. - person Dohn Joe; 23.08.2018
comment
разделите 2, 3 и 4 гекса в направлении x, изменив параметр y Внимательно посмотрите на рисунок 5.4 в Руководство пользователя. Локальные направления x, y и z отдельного блока не обязательно совпадают с глобальными направлениями x, y и z глобальной системы координат. - person Dohn Joe; 23.08.2018
comment
еще одно странное поведение: если я использую radHalfAngle #calc "degToRad(5)";, я получаю то же планарное... предупреждение, если я не изменю writePrecision на 8 в файле controlDict! - person Foad; 23.08.2018
comment
Как я вижу, когда вы определяете гекс, направление от точки 0 до 1 — это x, от 1 до 2 — это z, а направление, перпендикулярное к ним, — это y. Следовательно, для 2, 3, 4 y и z меняются местами! - person Foad; 23.08.2018
comment
Еще раз взгляните на рисунок 5.4 из Руководства пользователя. Ребро 0-1 является локальным направлением x или x_1; ребро 1-2 является локальным направлением Y или x_2; и перпендикулярное направление к двум вышеупомянутым краям является локальным направлением z. - person Dohn Joe; 23.08.2018
comment
Было бы здорово, если бы эти точки можно было классифицировать и очистить для дальнейшего использования. - person Foad; 23.08.2018