From 4dad8446111cfc23e46e80dc1d2f9a1424f91e5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Zar=C4=99bski?= Date: Mon, 14 Oct 2024 08:46:06 +0100 Subject: [PATCH 01/11] Started overlapping overset grids example --- .../tutorials/overlapping_overset_grids.rst | 79 +++++++++++++++++- .../overlapping_overset_grids/hillnn.udf | 13 +++ .../overlapping_overset_grids/hillnn_mesh.png | Bin 0 -> 22590 bytes .../hillnn_result.png | Bin 0 -> 62251 bytes .../overlapping_overset_grids/lower.box | 14 ++++ .../overlapping_overset_grids/upper.box | 13 +++ 6 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 doc/source/tutorials/overlapping_overset_grids/hillnn.udf create mode 100644 doc/source/tutorials/overlapping_overset_grids/hillnn_mesh.png create mode 100644 doc/source/tutorials/overlapping_overset_grids/hillnn_result.png create mode 100644 doc/source/tutorials/overlapping_overset_grids/lower.box create mode 100644 doc/source/tutorials/overlapping_overset_grids/upper.box diff --git a/doc/source/tutorials/overlapping_overset_grids.rst b/doc/source/tutorials/overlapping_overset_grids.rst index d56bc1de2..ec1596823 100644 --- a/doc/source/tutorials/overlapping_overset_grids.rst +++ b/doc/source/tutorials/overlapping_overset_grids.rst @@ -1,4 +1,81 @@ .. _overlapping_overset_grids: Overlapping Overset Grids -========================= \ No newline at end of file +========================= + +This tutorial will describe how to run a case with two overlapping meshes (NekNek) from scratch. +We illustrate this by using the :ref:`perhill` case. +If you are not familiar with *NekRS*, we strongly recommend you begin with the periodic hill tutorial first! + +The three key steps to running a case with NekNek are: + + 1. Setting up the mesh with appropriate boundary conditions for the overlapping interface. + 2. Specifying parameters to control stability and accuracy for the overlapping-Schwarz iterations. + 3. Modifying ``velocityDirichletConditions`` to read Dirichlet boundary data for the overlapping interfaces. + +Pre-processing +.............. + +The pre-processing steps for a NekNek calculation differ from a mono-domain NekRS calculation only in terms of ensuring that the appropriate boundary condition ``int`` is specified at the overlapping interface. +This boundary condition serves as the flag to let the solver know that Dirichlet data for these boundary conditions must come from interpolation of the data in the overlapping mesh. + +Mesh generation +............... + +In this tutorial, we generate two meshes to span the entire domain, an upper and a lower mesh. +The lower mesh is generated by ``genbox`` with the following input file: + +.. literalinclude:: overlapping_overset_grids/lower.box + +and the upper mesh is generated by ``genbox`` with the following input file: + +.. literalinclude:: overlapping_overset_grids/upper.box + +Note: the lower domain spans :math:`y \in [0,2.5]` and the upper domain spans :math:`y \in [2.25,3]`. We also use ``int`` for the boundary surfaces that overlap the other domain. + +Now the meshes can be generated by running ``genbox`` for each of these cases to obtain ``upper.re2`` and ``lower.re2``. + +.. code-block:: console + + $ genbox <<< upper.box + $ mv box.re2 upper.re2 + $ genbox <<< lower.box + $ mv box.re2 upper.re2 + +:Reminder: + ``genbox`` produces a file named ``box.re2``, so you will need to rename the files between generating the separate parts. + +Once we have both upper and lower mesh files, we need to run ``genmap`` for both meshes. + +.. code-block:: console + + $ genmap + +On input specify ``lower`` as your casename and press enter to use the default tolerance. +This step will produce ``lower.ma2`` which needs to be generated only once. +Next do the same for the upper mesh to generate ``upper.ma2``. + +User Defined Functions file (.udf) +.................................. + +As before we need to create a UDF file, to get started create a file ``hillnn.udf`` in the current directory. + +Modify mesh and add forcing to the flow +--------------------------------------- + +As for the mono-domain periodic hill case, we modify the mesh in ``UDF_Setup`` as: + +.. literalinclude:: overlapping_overset_grids/hillnn.udf + :language: c++ + +.. _fig:hillnn_mesh: + +.. figure:: overlapping_overset_grids/hillnn_mesh.png + :align: center + :figclass: align-center + :alt: neknek_mesh + + Modified box mesh graded + +Currently, applying a constant mass flux with ``param(54)`` and ``param(55)`` is **not** supported with overlapping overset grids. +For this case, we drive the flow using a constant acceleration term in ``scalarNeumannConditions`` diff --git a/doc/source/tutorials/overlapping_overset_grids/hillnn.udf b/doc/source/tutorials/overlapping_overset_grids/hillnn.udf new file mode 100644 index 000000000..d3990dd8c --- /dev/null +++ b/doc/source/tutorials/overlapping_overset_grids/hillnn.udf @@ -0,0 +1,13 @@ + +void UDF_Setup() { + auto mesh = nrs->meshV; + + const dfloat A{4.5}, B{3.5}, C{1./6}; + + // mesh modification + for(int i{0}; i < mesh -> Nlocal; ++i) { + const dfloat argx{B * (std::abs(mesh->x[i] - A) - B)}; + const dfloat A1{C * (1. + std::tanh(argx))}; + mesh->y[i] = mesh->y[i] + A1 * (3. - mesh->y[i]); + } +} diff --git a/doc/source/tutorials/overlapping_overset_grids/hillnn_mesh.png b/doc/source/tutorials/overlapping_overset_grids/hillnn_mesh.png new file mode 100644 index 0000000000000000000000000000000000000000..966ef29f76291a2e1c478507868406f211da89df GIT binary patch literal 22590 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 FzW|gj3Jw4O literal 0 HcmV?d00001 diff --git a/doc/source/tutorials/overlapping_overset_grids/lower.box b/doc/source/tutorials/overlapping_overset_grids/lower.box new file mode 100644 index 000000000..701ce5688 --- /dev/null +++ b/doc/source/tutorials/overlapping_overset_grids/lower.box @@ -0,0 +1,14 @@ +-3 spatial dimension (will create box.re2) +1 number of fields +# +# comments: two dimensional periodic hill +# +#======================================================== +# +Box +-22 5 -1 Nelx Nely Nelz +0.0 9.0 1. x0 x1 ratio +0.0 0.1 0.25 0.5 1.5 2.5 y0 y1 ratio +0.0 1.0 1.0 z0 z1 ratio +P ,P ,W ,int ,P ,P BC's: (cbx0, cbx1, cby0, cby1, cbz0, cbz1) + diff --git a/doc/source/tutorials/overlapping_overset_grids/upper.box b/doc/source/tutorials/overlapping_overset_grids/upper.box new file mode 100644 index 000000000..a9f1c14bb --- /dev/null +++ b/doc/source/tutorials/overlapping_overset_grids/upper.box @@ -0,0 +1,13 @@ +-3 spatial dimension (will create box.re2) +1 number of fields +# +# comments: two dimensional periodic hill +# +#======================================================== +# +Box +-21 3 -1 Nelx Nely Nelz +0.0 9.0 1. x0 x1 ratio +2.25 2.75 2.9 3.0 y0 y1 ratio +0.0 1.0 1.0 z0 z1 ratio +P ,P ,int,W ,P ,P BC's: (cbx0, cbx1, cby0, cby1, cbz0, cbz1) From 4ddd95c25465180452911ce96d7533f58dfc95c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Zar=C4=99bski?= Date: Wed, 23 Oct 2024 15:56:15 +0100 Subject: [PATCH 02/11] Continued overlap with IC --- .../tutorials/overlapping_overset_grids.rst | 9 +++++++-- .../overlapping_overset_grids/hillnn.udf | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/doc/source/tutorials/overlapping_overset_grids.rst b/doc/source/tutorials/overlapping_overset_grids.rst index ec1596823..b85252cd6 100644 --- a/doc/source/tutorials/overlapping_overset_grids.rst +++ b/doc/source/tutorials/overlapping_overset_grids.rst @@ -63,10 +63,11 @@ As before we need to create a UDF file, to get started create a file ``hillnn.ud Modify mesh and add forcing to the flow --------------------------------------- -As for the mono-domain periodic hill case, we modify the mesh in ``UDF_Setup`` as: +As for the mono-domain periodic hill case, we modify the mesh defining a function ``UDF_Setup`` and adding: .. literalinclude:: overlapping_overset_grids/hillnn.udf :language: c++ + :lines: 9-18 .. _fig:hillnn_mesh: @@ -78,4 +79,8 @@ As for the mono-domain periodic hill case, we modify the mesh in ``UDF_Setup`` a Modified box mesh graded Currently, applying a constant mass flux with ``param(54)`` and ``param(55)`` is **not** supported with overlapping overset grids. -For this case, we drive the flow using a constant acceleration term in ``scalarNeumannConditions`` +For this case, we drive the flow using a constant acceleration term in ``userf`` and using this within ``UDF_Setup``: + + +.. literalinclude:: overlapping_overset_grids/hillnn.udf + :language: c++ diff --git a/doc/source/tutorials/overlapping_overset_grids/hillnn.udf b/doc/source/tutorials/overlapping_overset_grids/hillnn.udf index d3990dd8c..7507b0943 100644 --- a/doc/source/tutorials/overlapping_overset_grids/hillnn.udf +++ b/doc/source/tutorials/overlapping_overset_grids/hillnn.udf @@ -1,4 +1,13 @@ +void userf(double time) { + const dfloat ffx{0.052}; + + // Get x component of non-linear momentum array + // using offset of 0 + auto o_FUx = nrs->o_NLT + 0 * nrs->fieldOffset; + platform->linAlg->fill(nrs->mesh->Nlocal, ffx, o_FUx); +} + void UDF_Setup() { auto mesh = nrs->meshV; @@ -10,4 +19,14 @@ void UDF_Setup() { const dfloat A1{C * (1. + std::tanh(argx))}; mesh->y[i] = mesh->y[i] + A1 * (3. - mesh->y[i]); } + + // initial conditions + for(int i{0}; i < mesh -> Nlocal; ++i) { + nrs->U[n + 0 * nrs->fieldOffset] = 1.0; + nrs->U[n + 1 * nrs->fieldOffset] = 0.0; + nrs->U[n + 2 * nrs->fieldOffset] = 0.0; + } + + nrs->userVelocitySource = &userf; } + From 485c602facbb8d6d8f074e3ec0a31b81ddd14f74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Zar=C4=99bski?= Date: Mon, 28 Oct 2024 14:18:34 +0000 Subject: [PATCH 03/11] Use newer function names --- .../overlapping_overset_grids/hillnn.udf | 15 +++++++++++++++ .../tutorials/overlapping_overset_grids/lower.box | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/doc/source/tutorials/overlapping_overset_grids/hillnn.udf b/doc/source/tutorials/overlapping_overset_grids/hillnn.udf index 7507b0943..13550e73b 100644 --- a/doc/source/tutorials/overlapping_overset_grids/hillnn.udf +++ b/doc/source/tutorials/overlapping_overset_grids/hillnn.udf @@ -8,6 +8,20 @@ void userf(double time) { platform->linAlg->fill(nrs->mesh->Nlocal, ffx, o_FUx); } +void velocityDirichletConditions(bcData *bc) { + if(bc->id == 3) { + bc->u = bc->uinter; + bc->v = bc->vinter; + bc->w = bc->winter; + bc->s = bc->sinter; + } else { + bc->u = 0.0; + bc->v = 0.0; + bc->w = 0.0; + bc->s = 0.0; + } +} + void UDF_Setup() { auto mesh = nrs->meshV; @@ -30,3 +44,4 @@ void UDF_Setup() { nrs->userVelocitySource = &userf; } +void UDF_ExecuteStep(double time, int tstep) {} diff --git a/doc/source/tutorials/overlapping_overset_grids/lower.box b/doc/source/tutorials/overlapping_overset_grids/lower.box index 701ce5688..59218ba87 100644 --- a/doc/source/tutorials/overlapping_overset_grids/lower.box +++ b/doc/source/tutorials/overlapping_overset_grids/lower.box @@ -10,5 +10,5 @@ Box 0.0 9.0 1. x0 x1 ratio 0.0 0.1 0.25 0.5 1.5 2.5 y0 y1 ratio 0.0 1.0 1.0 z0 z1 ratio -P ,P ,W ,int ,P ,P BC's: (cbx0, cbx1, cby0, cby1, cbz0, cbz1) +P ,P ,W ,int,P ,P BC's: (cbx0, cbx1, cby0, cby1, cbz0, cbz1) From 6e37d87f52132f6a1cb1048feb216087c10c0be1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Zar=C4=99bski?= Date: Mon, 28 Oct 2024 15:52:38 +0000 Subject: [PATCH 04/11] Added session file and parts --- .../overlapping_overset_grids/hillnn.sess | 2 ++ .../overlapping_overset_grids/lower.par | 22 ++++++++++++++++++ .../overlapping_overset_grids/lower.re2 | Bin 0 -> 39636 bytes .../overlapping_overset_grids/upper.box | 2 +- .../overlapping_overset_grids/upper.par | 22 ++++++++++++++++++ .../overlapping_overset_grids/upper.re2 | Bin 0 -> 23836 bytes 6 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 doc/source/tutorials/overlapping_overset_grids/hillnn.sess create mode 100644 doc/source/tutorials/overlapping_overset_grids/lower.par create mode 100644 doc/source/tutorials/overlapping_overset_grids/lower.re2 create mode 100644 doc/source/tutorials/overlapping_overset_grids/upper.par create mode 100644 doc/source/tutorials/overlapping_overset_grids/upper.re2 diff --git a/doc/source/tutorials/overlapping_overset_grids/hillnn.sess b/doc/source/tutorials/overlapping_overset_grids/hillnn.sess new file mode 100644 index 000000000..1f0e748d0 --- /dev/null +++ b/doc/source/tutorials/overlapping_overset_grids/hillnn.sess @@ -0,0 +1,2 @@ +lower:1; +upper:1; diff --git a/doc/source/tutorials/overlapping_overset_grids/lower.par b/doc/source/tutorials/overlapping_overset_grids/lower.par new file mode 100644 index 000000000..009e3e446 --- /dev/null +++ b/doc/source/tutorials/overlapping_overset_grids/lower.par @@ -0,0 +1,22 @@ +[GENERAL] +polynomialOrder = 7 +stopAt = endTime +endTime = 200 +variableDT = yes +dt = targetCFL = 0.4 + initial=1e-1 +timeStepper = bdf2 +checkpointControl = runTime +checkpointInterval = 20 +udf = "hillnn.udf" + +[PROBLEMTYPE] +equation = navierstokes + +[VELOCITY] +residualTol = 1e-8 +density = 1 +viscosity = -100 + +[MESH] +solver = user +file = "lower.re2" diff --git a/doc/source/tutorials/overlapping_overset_grids/lower.re2 b/doc/source/tutorials/overlapping_overset_grids/lower.re2 new file mode 100644 index 0000000000000000000000000000000000000000..690cf5b40f2705b7af0364a92653536932c9b5e3 GIT binary patch literal 39636 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 N#Krk@e#G?5Y0Mb)RI>6+_T|8(!(YiIR({r=h6 zqd&*%(cgdlt3S-abI5;w`S+=W>!0ub?!lu!=QIo#K3$H#IMtZGG{=-r`Lrb0zt3wz zPfOr?Z(awzTvz4i(+BhX_$WTgr+iwHtH;l`j`z-Ay?E#D#XIjejoiKQ3V@H|qkPJz zCAskSv=n@m`{Dd}JZ$U9#w!3mijVRspO)n6@$)?%56|Cx{BYcTVWM$ed}_P`;G_5` zpYmx*F1$T01y|koYZK*DKIK;cd=ww$Q$8)p)#K-TUR|61`@hH6^`>}fZ@dEFqxdMF z@@Yvfyge-i-#?D8yC0e;pYkcc0^pDW8_)!rN1yuWnDrhvUJgn#OhY#w!3mijVRspO)n6@$*Z;cYGVXIGZS+ z@+rRp;G_5`pYmx*F1$T01=sO5>h7l}%BOtFuK@TcKFX(jT9T{B&o2d6o#@U)`IJwW z{)U zpnS@w&KWY!Y&>$u7;jIlWA8ab#+i*r?ily@`95F0-_94@ch}EX@%-dr%QId(W}Ml0 zT-kx67IYY*ojYsYn_xSl&bbYczfz~ckekv#+i*r?ily@`B!z$ka1??kvqnCdwNyp3>jxO9=T)OuyG&%dg3hKw^CkK8fF+taH$XUI6S@yH$H9zXvw|JmmV z?zh~hyDu;0>E{YJraJSDcHSV5ztkG_f8y<$jy;DWCH3(^IVjSKZ&||9uAh^i=D>?|z%|DWCH3(^IVj zm-7S4r+muCPfxWDT)x+*e9EVM{Pa}oz~y^=%BOtF$4^hS4qU$Pr+mt%eEjrO>%dk2 z-9G>CGvKGES_gjL_ftOQQ$Burs&(M1uRqWK`waN$sn&tt_xhAi`IL{Jo@yPqeBV#` zlu!Bi>8aL%tA0Lt{@-W7PfxWD{Jz(xe9EVM{Pa}oz~y^=%BOtF$4^hS4qU$1r+mt% zeEjrO>%dj}-Yj3{rR!)-`<{T|9Br?-Dmy$&F}ws{2v?3`j@8~e|gqI ztNp~!x90!vQ7!#%&iUe3=J<)i`L9o}m#^M@Sv^j5>-^{}*RQ_yn`%CuSY67JUwzA; z>)U**36}MqKU?|L>nCnJgZ<^JH{Yr}tl#ryE5CaE#CS&g%U5r{tX|$$e)UoDjP{ow z=gI2TZRJ<5ub7VZmru=?)qirT8C&_)>nFxB+F!nU^JVpCJNeb?C&n|{U%qh%+k^2dC!`7-{` z?&MdmpLmo%=8Mgj@qcb7zk2<|qx>;nY`%>D^E>&~>n9%NkNINrW&B^*$**2N@hE@H z7n?8RzqgZLy?)|R{+KT|U&jB%o&4(c6OZ!8e6jg5{?~T$tJhCF${+K^=F9l+@8nmn zpLmo%=8Mgj@qcM2zk2<|qx>;nY`%=&{qEM!59&+UhnMGgv_D?+jjliDi_Mqye|_e} z`vcr`HNo=pn|l4kqx>;nY`#_d@cHj6GpBsC5GUs+v?_pg}W;=%sqyJ7v}!TzmYzWTxbhmhZ5^Oe=LT)+A`zts=+FW;ML1Nq{? z{;giVdh@ODm+$|Fkl$kSjn-R#m~UOa>|ee=)fBwq!TzmYzIyYm0hW(n$Ulh9H(GD~ z>IeIm_<7OiH=iey{;gg=^9}O1dimR{5apb zeEIm5H+Js7diy0FIeDDn>+Vky?)|B{?=c< zdh=!Lmw#hk$2vbc%hxaU_Fs%AR)_Du4h&|g~T6&uITS|Db-5zx-t9{;StdJjmbr%U5r{Z2j`L z?!S8bFUB+4-~Ou~m-cJ9A= z{ltU(t-pNr=F8SEf9w9MxBp^1qy6o_`a%BUesLpztJlwbgZ!;tzIyXz>z7~Z^Qhf_ a4&MK_`{j-6Z}lEOJk~SH@9|TgumAr;2fA$l literal 0 HcmV?d00001 From 49d62c60ef15ac6dd225ab4079ed9654d7da7ab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Zar=C4=99bski?= Date: Tue, 29 Oct 2024 09:26:07 +0000 Subject: [PATCH 05/11] Fix bugs in UDF --- .../overlapping_overset_grids/hillnn.udf | 37 ++++++++++--------- .../overlapping_overset_grids/lower.par | 3 +- .../overlapping_overset_grids/upper.par | 3 +- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/doc/source/tutorials/overlapping_overset_grids/hillnn.udf b/doc/source/tutorials/overlapping_overset_grids/hillnn.udf index 13550e73b..acfee1f4b 100644 --- a/doc/source/tutorials/overlapping_overset_grids/hillnn.udf +++ b/doc/source/tutorials/overlapping_overset_grids/hillnn.udf @@ -1,3 +1,19 @@ +#ifdef __okl__ +void codedFixedValueVelocity(bcData *bc) { + if(bc->id == 3) { + bc->u = bc->uinterp; + bc->v = bc->vinterp; + bc->w = bc->winterp; + bc->s = bc->sinterp; + } else { + bc->u = 0.0; + bc->v = 0.0; + bc->w = 0.0; + bc->s = 0.0; + } + // TODO: Need to handle case of nfld_neknek > 3 for temperature +} +#endif void userf(double time) { const dfloat ffx{0.052}; @@ -5,22 +21,9 @@ void userf(double time) { // Get x component of non-linear momentum array // using offset of 0 auto o_FUx = nrs->o_NLT + 0 * nrs->fieldOffset; - platform->linAlg->fill(nrs->mesh->Nlocal, ffx, o_FUx); + platform->linAlg->fill(nrs->meshV->Nlocal, ffx, o_FUx); } -void velocityDirichletConditions(bcData *bc) { - if(bc->id == 3) { - bc->u = bc->uinter; - bc->v = bc->vinter; - bc->w = bc->winter; - bc->s = bc->sinter; - } else { - bc->u = 0.0; - bc->v = 0.0; - bc->w = 0.0; - bc->s = 0.0; - } -} void UDF_Setup() { auto mesh = nrs->meshV; @@ -36,9 +39,9 @@ void UDF_Setup() { // initial conditions for(int i{0}; i < mesh -> Nlocal; ++i) { - nrs->U[n + 0 * nrs->fieldOffset] = 1.0; - nrs->U[n + 1 * nrs->fieldOffset] = 0.0; - nrs->U[n + 2 * nrs->fieldOffset] = 0.0; + nrs->U[i + 0 * nrs->fieldOffset] = 1.0; + nrs->U[i + 1 * nrs->fieldOffset] = 0.0; + nrs->U[i + 2 * nrs->fieldOffset] = 0.0; } nrs->userVelocitySource = &userf; diff --git a/doc/source/tutorials/overlapping_overset_grids/lower.par b/doc/source/tutorials/overlapping_overset_grids/lower.par index 009e3e446..997cb9b05 100644 --- a/doc/source/tutorials/overlapping_overset_grids/lower.par +++ b/doc/source/tutorials/overlapping_overset_grids/lower.par @@ -5,7 +5,7 @@ endTime = 200 variableDT = yes dt = targetCFL = 0.4 + initial=1e-1 timeStepper = bdf2 -checkpointControl = runTime +checkpointControl = steps checkpointInterval = 20 udf = "hillnn.udf" @@ -18,5 +18,4 @@ density = 1 viscosity = -100 [MESH] -solver = user file = "lower.re2" diff --git a/doc/source/tutorials/overlapping_overset_grids/upper.par b/doc/source/tutorials/overlapping_overset_grids/upper.par index a44b981e2..4a6b86da7 100644 --- a/doc/source/tutorials/overlapping_overset_grids/upper.par +++ b/doc/source/tutorials/overlapping_overset_grids/upper.par @@ -5,7 +5,7 @@ endTime = 200 variableDT = yes dt = targetCFL = 0.4 + initial=1e-1 timeStepper = bdf2 -checkpointControl = runTime +checkpointControl = steps checkpointInterval = 20 udf = "hillnn.udf" @@ -18,5 +18,4 @@ density = 1 viscosity = -100 [MESH] -solver = user file = "upper.re2" From 3e3eaa92602cda99eda5d84c54c8a3a6e6c8159b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Zar=C4=99bski?= Date: Thu, 31 Oct 2024 09:47:47 +0000 Subject: [PATCH 06/11] Remove temperature from codeFixedValueVelocity --- doc/source/tutorials/overlapping_overset_grids/hillnn.udf | 3 --- 1 file changed, 3 deletions(-) diff --git a/doc/source/tutorials/overlapping_overset_grids/hillnn.udf b/doc/source/tutorials/overlapping_overset_grids/hillnn.udf index acfee1f4b..b18a8e947 100644 --- a/doc/source/tutorials/overlapping_overset_grids/hillnn.udf +++ b/doc/source/tutorials/overlapping_overset_grids/hillnn.udf @@ -4,14 +4,11 @@ void codedFixedValueVelocity(bcData *bc) { bc->u = bc->uinterp; bc->v = bc->vinterp; bc->w = bc->winterp; - bc->s = bc->sinterp; } else { bc->u = 0.0; bc->v = 0.0; bc->w = 0.0; - bc->s = 0.0; } - // TODO: Need to handle case of nfld_neknek > 3 for temperature } #endif From 8447c0923c586c5f2b2f4c2893dacd3fdc251f6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Zar=C4=99bski?= Date: Mon, 4 Nov 2024 11:03:11 +0000 Subject: [PATCH 07/11] Add boundary logic via par files --- .../overlapping_overset_grids/hillnn.udf | 15 ++++++++++++++- .../tutorials/overlapping_overset_grids/lower.par | 5 ++++- .../tutorials/overlapping_overset_grids/upper.par | 5 ++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/doc/source/tutorials/overlapping_overset_grids/hillnn.udf b/doc/source/tutorials/overlapping_overset_grids/hillnn.udf index b18a8e947..ae5bff651 100644 --- a/doc/source/tutorials/overlapping_overset_grids/hillnn.udf +++ b/doc/source/tutorials/overlapping_overset_grids/hillnn.udf @@ -1,6 +1,8 @@ +static int P_INTERPOLATED_BC_ID; + #ifdef __okl__ void codedFixedValueVelocity(bcData *bc) { - if(bc->id == 3) { + if(bc->id == p_interpolated_bc_id) { bc->u = bc->uinterp; bc->v = bc->vinterp; bc->w = bc->winterp; @@ -12,6 +14,17 @@ void codedFixedValueVelocity(bcData *bc) { } #endif +void UDF_LoadKernels(deviceKernelProperties& kernelInfo) +{ + setupAide& options = platform->options; + kernelInfo.define("p_interpolated_bc_id") = P_INTERPOLATED_BC_ID; +} + +void UDF_Setup0(MPI_Comm comm, setupAide &options) +{ + platform->par->extract("casedata", "interpolated_bc_id", P_INTERPOLATED_BC_ID); +} + void userf(double time) { const dfloat ffx{0.052}; diff --git a/doc/source/tutorials/overlapping_overset_grids/lower.par b/doc/source/tutorials/overlapping_overset_grids/lower.par index 997cb9b05..bff4fb128 100644 --- a/doc/source/tutorials/overlapping_overset_grids/lower.par +++ b/doc/source/tutorials/overlapping_overset_grids/lower.par @@ -1,7 +1,7 @@ [GENERAL] polynomialOrder = 7 stopAt = endTime -endTime = 200 +endTime = 1 variableDT = yes dt = targetCFL = 0.4 + initial=1e-1 timeStepper = bdf2 @@ -19,3 +19,6 @@ viscosity = -100 [MESH] file = "lower.re2" + +[CASEDATA] +interpolated_bc_id = 3 diff --git a/doc/source/tutorials/overlapping_overset_grids/upper.par b/doc/source/tutorials/overlapping_overset_grids/upper.par index 4a6b86da7..f56a458d6 100644 --- a/doc/source/tutorials/overlapping_overset_grids/upper.par +++ b/doc/source/tutorials/overlapping_overset_grids/upper.par @@ -1,7 +1,7 @@ [GENERAL] polynomialOrder = 7 stopAt = endTime -endTime = 200 +endTime = 1 variableDT = yes dt = targetCFL = 0.4 + initial=1e-1 timeStepper = bdf2 @@ -19,3 +19,6 @@ viscosity = -100 [MESH] file = "upper.re2" + +[CASEDATA] +interpolated_bc_id = 2 From 3fc36e8160d21d3aef1d3d23edb1d36f8a907c38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Zar=C4=99bski?= Date: Mon, 4 Nov 2024 11:34:48 +0000 Subject: [PATCH 08/11] Run for slightly longer period --- doc/source/tutorials/overlapping_overset_grids/lower.par | 2 +- doc/source/tutorials/overlapping_overset_grids/upper.par | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/tutorials/overlapping_overset_grids/lower.par b/doc/source/tutorials/overlapping_overset_grids/lower.par index bff4fb128..6ab053ac5 100644 --- a/doc/source/tutorials/overlapping_overset_grids/lower.par +++ b/doc/source/tutorials/overlapping_overset_grids/lower.par @@ -1,7 +1,7 @@ [GENERAL] polynomialOrder = 7 stopAt = endTime -endTime = 1 +endTime = 10 variableDT = yes dt = targetCFL = 0.4 + initial=1e-1 timeStepper = bdf2 diff --git a/doc/source/tutorials/overlapping_overset_grids/upper.par b/doc/source/tutorials/overlapping_overset_grids/upper.par index f56a458d6..b034bd8f6 100644 --- a/doc/source/tutorials/overlapping_overset_grids/upper.par +++ b/doc/source/tutorials/overlapping_overset_grids/upper.par @@ -1,7 +1,7 @@ [GENERAL] polynomialOrder = 7 stopAt = endTime -endTime = 1 +endTime = 10 variableDT = yes dt = targetCFL = 0.4 + initial=1e-1 timeStepper = bdf2 From 9dc3284f6c0556f5e6d91ddd03703547262556df Mon Sep 17 00:00:00 2001 From: Jez Swann Date: Mon, 4 Nov 2024 11:47:21 +0000 Subject: [PATCH 09/11] Moving overlapping tutorial files to different directories --- .../tutorials/overlapping_overset_grids/hillnn.sess | 4 ++-- .../overlapping_overset_grids/{ => lower}/lower.box | 0 .../overlapping_overset_grids/{ => lower}/lower.par | 2 +- .../overlapping_overset_grids/{ => lower}/lower.re2 | Bin .../overlapping_overset_grids/{ => upper}/upper.box | 0 .../overlapping_overset_grids/{ => upper}/upper.par | 4 ++-- .../overlapping_overset_grids/{ => upper}/upper.re2 | Bin 7 files changed, 5 insertions(+), 5 deletions(-) rename doc/source/tutorials/overlapping_overset_grids/{ => lower}/lower.box (100%) rename doc/source/tutorials/overlapping_overset_grids/{ => lower}/lower.par (93%) rename doc/source/tutorials/overlapping_overset_grids/{ => lower}/lower.re2 (100%) rename doc/source/tutorials/overlapping_overset_grids/{ => upper}/upper.box (100%) rename doc/source/tutorials/overlapping_overset_grids/{ => upper}/upper.par (87%) rename doc/source/tutorials/overlapping_overset_grids/{ => upper}/upper.re2 (100%) diff --git a/doc/source/tutorials/overlapping_overset_grids/hillnn.sess b/doc/source/tutorials/overlapping_overset_grids/hillnn.sess index 1f0e748d0..0e0589fb9 100644 --- a/doc/source/tutorials/overlapping_overset_grids/hillnn.sess +++ b/doc/source/tutorials/overlapping_overset_grids/hillnn.sess @@ -1,2 +1,2 @@ -lower:1; -upper:1; +lower/lower:1; +upper/upper:1; diff --git a/doc/source/tutorials/overlapping_overset_grids/lower.box b/doc/source/tutorials/overlapping_overset_grids/lower/lower.box similarity index 100% rename from doc/source/tutorials/overlapping_overset_grids/lower.box rename to doc/source/tutorials/overlapping_overset_grids/lower/lower.box diff --git a/doc/source/tutorials/overlapping_overset_grids/lower.par b/doc/source/tutorials/overlapping_overset_grids/lower/lower.par similarity index 93% rename from doc/source/tutorials/overlapping_overset_grids/lower.par rename to doc/source/tutorials/overlapping_overset_grids/lower/lower.par index 6ab053ac5..58f6852be 100644 --- a/doc/source/tutorials/overlapping_overset_grids/lower.par +++ b/doc/source/tutorials/overlapping_overset_grids/lower/lower.par @@ -7,7 +7,7 @@ dt = targetCFL = 0.4 + initial=1e-1 timeStepper = bdf2 checkpointControl = steps checkpointInterval = 20 -udf = "hillnn.udf" +udf = "../hillnn.udf" [PROBLEMTYPE] equation = navierstokes diff --git a/doc/source/tutorials/overlapping_overset_grids/lower.re2 b/doc/source/tutorials/overlapping_overset_grids/lower/lower.re2 similarity index 100% rename from doc/source/tutorials/overlapping_overset_grids/lower.re2 rename to doc/source/tutorials/overlapping_overset_grids/lower/lower.re2 diff --git a/doc/source/tutorials/overlapping_overset_grids/upper.box b/doc/source/tutorials/overlapping_overset_grids/upper/upper.box similarity index 100% rename from doc/source/tutorials/overlapping_overset_grids/upper.box rename to doc/source/tutorials/overlapping_overset_grids/upper/upper.box diff --git a/doc/source/tutorials/overlapping_overset_grids/upper.par b/doc/source/tutorials/overlapping_overset_grids/upper/upper.par similarity index 87% rename from doc/source/tutorials/overlapping_overset_grids/upper.par rename to doc/source/tutorials/overlapping_overset_grids/upper/upper.par index b034bd8f6..f5c4b68a6 100644 --- a/doc/source/tutorials/overlapping_overset_grids/upper.par +++ b/doc/source/tutorials/overlapping_overset_grids/upper/upper.par @@ -7,7 +7,7 @@ dt = targetCFL = 0.4 + initial=1e-1 timeStepper = bdf2 checkpointControl = steps checkpointInterval = 20 -udf = "hillnn.udf" +udf = "../hillnn.udf" [PROBLEMTYPE] equation = navierstokes @@ -21,4 +21,4 @@ viscosity = -100 file = "upper.re2" [CASEDATA] -interpolated_bc_id = 2 +interpolated_bc_id = 3 diff --git a/doc/source/tutorials/overlapping_overset_grids/upper.re2 b/doc/source/tutorials/overlapping_overset_grids/upper/upper.re2 similarity index 100% rename from doc/source/tutorials/overlapping_overset_grids/upper.re2 rename to doc/source/tutorials/overlapping_overset_grids/upper/upper.re2 From 268afe8bd11884fab3d8a85e8a75a48fa26db1b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Zar=C4=99bski?= Date: Thu, 7 Nov 2024 08:35:25 +0000 Subject: [PATCH 10/11] Added extrapolation parameter to overlapping grids --- doc/source/tutorials/overlapping_overset_grids/lower/lower.par | 3 +++ doc/source/tutorials/overlapping_overset_grids/upper/upper.par | 3 +++ 2 files changed, 6 insertions(+) diff --git a/doc/source/tutorials/overlapping_overset_grids/lower/lower.par b/doc/source/tutorials/overlapping_overset_grids/lower/lower.par index 58f6852be..13037becb 100644 --- a/doc/source/tutorials/overlapping_overset_grids/lower/lower.par +++ b/doc/source/tutorials/overlapping_overset_grids/lower/lower.par @@ -17,6 +17,9 @@ residualTol = 1e-8 density = 1 viscosity = -100 +[NEKNEK] +boundaryEXTOrder = 2 + [MESH] file = "lower.re2" diff --git a/doc/source/tutorials/overlapping_overset_grids/upper/upper.par b/doc/source/tutorials/overlapping_overset_grids/upper/upper.par index f5c4b68a6..76c0c0ffd 100644 --- a/doc/source/tutorials/overlapping_overset_grids/upper/upper.par +++ b/doc/source/tutorials/overlapping_overset_grids/upper/upper.par @@ -17,6 +17,9 @@ residualTol = 1e-8 density = 1 viscosity = -100 +[NEKNEK] +boundaryEXTOrder = 2 + [MESH] file = "upper.re2" From 8c093ffb6664b165c035af2c5bceb2dbccb1eb44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Zar=C4=99bski?= Date: Mon, 11 Nov 2024 11:41:31 +0000 Subject: [PATCH 11/11] Finalised docs for overlapping grids --- .../tutorials/overlapping_overset_grids.rst | 69 +++++++++++++++---- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/doc/source/tutorials/overlapping_overset_grids.rst b/doc/source/tutorials/overlapping_overset_grids.rst index b85252cd6..10fb63d86 100644 --- a/doc/source/tutorials/overlapping_overset_grids.rst +++ b/doc/source/tutorials/overlapping_overset_grids.rst @@ -32,28 +32,18 @@ and the upper mesh is generated by ``genbox`` with the following input file: .. literalinclude:: overlapping_overset_grids/upper.box Note: the lower domain spans :math:`y \in [0,2.5]` and the upper domain spans :math:`y \in [2.25,3]`. We also use ``int`` for the boundary surfaces that overlap the other domain. - -Now the meshes can be generated by running ``genbox`` for each of these cases to obtain ``upper.re2`` and ``lower.re2``. +Create two directories, ``lower`` and ``upper`` representing the two meshes then generate them by running ``genbox`` for each case to obtain ``upper/upper.re2`` and ``lower/lower.re2``. .. code-block:: console $ genbox <<< upper.box - $ mv box.re2 upper.re2 + $ mv box.re2 upper/upper.re2 $ genbox <<< lower.box - $ mv box.re2 upper.re2 + $ mv box.re2 lower/upper.re2 :Reminder: ``genbox`` produces a file named ``box.re2``, so you will need to rename the files between generating the separate parts. -Once we have both upper and lower mesh files, we need to run ``genmap`` for both meshes. - -.. code-block:: console - - $ genmap - -On input specify ``lower`` as your casename and press enter to use the default tolerance. -This step will produce ``lower.ma2`` which needs to be generated only once. -Next do the same for the upper mesh to generate ``upper.ma2``. User Defined Functions file (.udf) .................................. @@ -67,7 +57,7 @@ As for the mono-domain periodic hill case, we modify the mesh defining a functio .. literalinclude:: overlapping_overset_grids/hillnn.udf :language: c++ - :lines: 9-18 + :lines: 38,43-48,58 .. _fig:hillnn_mesh: @@ -84,3 +74,54 @@ For this case, we drive the flow using a constant acceleration term in ``userf`` .. literalinclude:: overlapping_overset_grids/hillnn.udf :language: c++ + :lines: 28-36,38,43-48,56,57,58 + :emphasize-lines: 1-8,18 + +Specifying NekNek and control parameters +---------------------------------------- + +The control parameters for this case are the same as that for the mono-domain periodic hill case and impact the +stability and accuracy of the calculation. In addition we also specify the extrapolation order for the boundary +conditions of the overlapping interface. + +Create a parameter file for the lower mesh ``lower/lower.par``: + +.. literalinclude:: overlapping_overset_grids/lower/lower.par + :language: ini + +and another for the upper mesh ``upper/upper.par``: + +.. literalinclude:: overlapping_overset_grids/upper/upper.par + :language: ini + +here the extrapolation is set by the variable ``boundaryEXTOrder``. +For this tutorial we have set our polynomial order to be :math:`N=7` using the `polynomialOrder` variable. + +Defining the session +-------------------- + +The last file we require is a session file which will combine all of the components into a single +NekRS run, create a new file ``hillnn.sess`` and add the following: + +.. literalinclude:: overlapping_overset_grids/hillnn.sess + +the lines being in the form ``:;``. + +Compilation +----------- + +You should now have the following files required to compile and run this case: + + * :download:`hillnn.udf ` + * :download:`lower/lower.par ` + * :download:`upper/upper.par ` + +If for some reason you encountered an insurmountable error and were unable to generate any of the required files, you may use the provided links to download them. +After confirming that you have all eight, you are now ready to compile + +.. code-block:: console + + $ nekbmpi hillnn.sess 2 + +Note the number of MPI ranks should match the total of those defined in the session file, in this case ``2``. +If all works properly, upon compilation the executable ``nek5000`` will be generated.