@heike256 5万
CFDngu
帖子
-
-
@李东岳 之前慢的原因是没有插满内存,插满后试了一下,确实是80核左右最快。
结果如下:
128 42.75
80 37.13
64 43.1
32 71.04
16 93.86
8 118.65
4 222.97
2 385.11
1 799.57 -
@heike256 不是二手,发现原因了,内存槽没插满。。
-
CPU型号:AMD EPYC 7763 64-Core (双路)
系统:ubuntu18.04
内存:256G ddr4
OpenFOAM版本:OpenFOAM v2006
128 125.5
64 105.71
32 109.28
16 124.35
8 171.75
4 276.83
2 517.43
1 887.79超线程已关,结果不怎么样,难不成我这个是假7763?请问如何优化?(刚组的机器,没多长时间)
-
@李东岳 在 VOF方法中如何准确计算自由表面曲率? 中说:
这个方法在函数calculateK()里面,可直接调用。计算结果在3232网格上能得到光滑的结果,但不对。在6464网格上出现了数值振荡。
VOF结果在网格比较细的时候结果不对?这个结论很有挑战性
李老师,我用interIsoFoam算了一下,还是不对。在32$\times$32的网格上可以得到光滑的结果,但是和解析解不一样;在64$\times$64的网格上结果出现了振荡。interfoam也跑了一下,结果和interisofoam不一样,也不对。。。(这个算例的设置参照和解析解在主贴的参考文献[1]中)
算例在这里,大家有兴趣可以跑一下。要是算例设置有问题也可以指出来。另外,我是在v2006环境下跑的(这个链接可能需要注册坚果云,我没找到其他的上传方法 )
capillaryWave -
@李东岳 李老师,我在间断条件中加入了表面张力项$\sigma\kappa$,其中$\kappa$是用calculateK算的,结果确实不对。但这属于GFM方法,和CSF模型不同。明天我用interfoam算一下这个算例,看看结果如何。
-
各位大神,我在做Ghost Fluid Method时遇到一个棘手的问题:间断条件中自由表面曲率的计算。我选择的验证算例是Capillary wave[1]。
目前尝试了几种方法:
(1) interfoam中使用的是CSF模型,计算曲率采用如下公式:
$\vec{n} = \nabla \alpha / | \nabla \alpha| $ (1)
$\kappa = - \nabla\cdot\vec{n}$ (2)
这个方法在函数calculateK()里面,可直接调用。计算结果在32$\times$32网格上能得到光滑的结果,但不对。在64$\times$64网格上出现了数值振荡。(2) 尝试的另一种方法是采用isoAdvector,因为这个方法中自由表面法向量$\vec{n}$是根据subcell system计算的,理论上应该更准。最后曲率的计算公式还是上面的公式(2),但是结果也不对,还是会出现振荡,并且难以做到收敛。
(3) 另外,我注意到有文章讨论VOF方法中的自由表面曲率计算问题[2]。我尝试了基于RDF的方法进行计算(isoAdvector中可采用RDF重构自由表面并计算自由表面法向量[3]),但结果也不理想。
我查了相关文献,发现将表面张力加入间断条件的程序都是采用levelset法捕捉自由表面(例如参考文献[1]),其自由表面曲率可由levetset函数直接计算。但在基于VOF方法中的模型中,很少见到间断条件中包含表面张力和粘性项,都是只有一个压力的间断条件。
因此我想请教一下各位大神,有没有什么在VOF方面中准确计算自由表面曲率的好方法?或者成功的经验?非常感谢!
[1] Haghshenas M, Wilson J A, Kumar R. Algebraic coupled level set-volume of fluid method for surface tension dominant two-phase flows[J]. International Journal of Multiphase Flow, 2017, 90:13-28.
[2] Cummins S J, Francois M M, Kothe D B. Estimating curvature from volume fractions[J]. Computers & Structures, 2005, 83(6/7):425-434.
[3] Hs A, Jr B. Accurate and efficient surface reconstruction from volume fraction data on general meshes[J]. Journal of Computational Physics, 2019, 383:1-23. -
@cp_zhao 这个我记得收费吧?不过也谢谢了~
-
一直用gdb调试程序,但却不会并行调试。最近写的代码单核运行没问题了,但并行运行有问题,应该是不同processor交界面处出现问题。之前对并行这方面涉及不多,对并行编程思想认识不直观,故想尝试并行调试。
我在openWiki上看到一个mpirunDebug文件(文件如下),但是不会用。求大佬指点一二,或者有什么好用的并行debug工具推荐一下?
#!/bin/sh # # Driver script to run mpi jobs with the processes in separate # windows or to separate log files. # Requires bash on all processors. PROGNAME=`basename $0` PROGDIR=`dirname $0` if [ `uname -s` = 'Linux' ]; then ECHO='echo -e' else ECHO='echo' fi printUsage() { echo "" echo "Usage: $PROGNAME -np <dd> <executable> <args>" echo "" echo "This will run like mpirun but with each process in an xterm" } nProcs='' exec='' args='' while [ "$1" != "" ]; do echo "$1" case $1 in -np) nProcs=$2;shift ;; *) if [ ! "$exec" ]; then exec=$1 elif [ ! "$args" ]; then args="\"$1\"" else args="$args \"$1\"" fi ;; esac shift done echo "nProcs=$nProcs" echo "exec=$exec" echo "args=$args" if [ ! "$nProcs" ]; then printUsage exit 1 fi if [ ! "$args" ]; then printUsage exit 1 fi if [ ! "$exec" ]; then printUsage exit 1 fi exec=`which $exec` if [ ! -x "$exec" ]; then echo "Cannot find executable $exec or is not executable" printUsage exit 1 fi echo "run $args" > $HOME/gdbCommands echo "where" >> $HOME/gdbCommands echo "Constructed gdb initialization file $HOME/gdbCommands" $ECHO "Choose running method: 1)gdb+xterm 2)gdb 3)log 4)xterm+valgrind 5)nemiver: \c" read method if [ "$method" -ne 1 -a "$method" -ne 2 -a "$method" -ne 3 -a "$method" -ne 4 -a "$method" -ne 5 ]; then printUsage exit 1 fi $ECHO "Run all processes local or distributed? 1)local 2)remote: \c" read spawn if [ "$spawn" -ne 1 -a "$spawn" -ne 2 ]; then printUsage exit 1 fi # check ~/.$WM_PROJECT/$WM_PROJECT_VERSION/ # check ~/.$WM_PROJECT/ # check <installedProject>/etc/ if [ "$WM_PROJECT" ]; then for i in \ $HOME/.WM_PROJECT/$WM_PROJECT_VERSION \ $HOME/.WM_PROJECT \ $WM_PROJECT_DIR/etc \ ; do if [ -f "$i/bashrc" ]; then sourceFoam="$i/bashrc" break fi done fi # Construct test string for remote execution. # Source OpenFOAM settings if OpenFOAM environment not set. # attempt to preserve the installation directory 'FOAM_INST_DIR' if [ "$FOAM_INST_DIR" ]; then sourceFoam='[ "$WM_PROJECT" ] || '"FOAM_INST_DIR=$FOAM_INST_DIR . $sourceFoam" else sourceFoam='[ "$WM_PROJECT" ] || '". $sourceFoam" fi echo "**sourceFoam:$sourceFoam" rm -f $HOME/mpirun.schema touch $HOME/mpirun.schema proc=0 xpos=0 ypos=0 for ((proc=0; proc<$nProcs; proc++)) do procCmdFile="$HOME/processor${proc}.sh" procLog="processor${proc}.log" geom="-geometry 120x20+$xpos+$ypos" node="" if [ .$WM_MPLIB = .OPENMPI ]; then node="-np 1 " elif [ .$WM_MPLIB = .LAM ]; then if [ "$spawn" -eq 2 ]; then node="c${proc} " fi fi echo "#!/bin/sh" > $procCmdFile if [ "$method" -eq 1 ]; then echo "$sourceFoam; cd $PWD; gdb -command $HOME/gdbCommands $exec 2>&1 | tee $procLog; read dummy" >> $procCmdFile #echo "$sourceFoam; cd $PWD; $exec $args; read dummy" >> $procCmdFile echo "${node}xterm -font fixed -title 'processor'$proc $geom -e $procCmdFile" >> $HOME/mpirun.schema elif [ "$method" -eq 2 ]; then echo "$sourceFoam; cd $PWD; gdb -command $HOME/gdbCommands >& $procLog" >> $procCmdFile echo "${node}$procCmdFile" >> $HOME/mpirun.schema elif [ "$method" -eq 3 ]; then echo "$sourceFoam; cd $PWD; $exec $args >& $procLog" >> $procCmdFile echo "${node}$procCmdFile" >> $HOME/mpirun.schema elif [ "$method" -eq 4 ]; then echo "$sourceFoam; cd $PWD; valgrind $exec $args; read dummy" >> $procCmdFile echo "${node}xterm -font fixed -title 'processor'$proc $geom -e $procCmdFile" >> $HOME/mpirun.schema elif [ "$method" -eq 5 ]; then ## maybe could use nemiver sessions for reloading breakpoints --session=<N> or --last # echo "$sourceFoam; cd $PWD; nemiver --last $exec $args; read dummy" >> $procCmdFile echo "$sourceFoam; cd $PWD; nemiver $exec $args; read dummy" >> $procCmdFile # echo "$sourceFoam; cd $PWD; ddd --args $exec $args; read dummy" >> $procCmdFile echo "${node} $procCmdFile" >> $HOME/mpirun.schema fi chmod +x $procCmdFile let column=proc%6 if [ $proc -ne 0 -a $column -eq 0 ]; then ((xpos+=600)) ((ypos=0)) else ((ypos+=200)) fi done for ((proc=0; proc<$nProcs; proc++)) do procLog="processor${proc}.log" echo " tail -f $procLog" done $ECHO "Constructed $HOME/mpirun.schema file. Press return to execute.\c" read dummy if [ .$WM_MPLIB = .OPENMPI ]; then mpirun -app $HOME/mpirun.schema </dev/null elif [ .$WM_MPLIB = .LAM ]; then mpirun $HOME/mpirun.schema </dev/null fi
-
@李东岳 好的,谢谢李老师。我发现面上梯度可通过fvc::reconstruct这个函数重构出的体心梯度,我还是得研究一下这个函数。比如刚刚的重力源项,定义在面上的话,我还没掌握怎么把它放回控制方程里面
-
@李东岳 非常感谢东岳老师。现在有点理解了,在Laplacian算子中用snGrad替代传统插值方法计算面上梯度来消除振荡,这是不是所谓的Rhie-Chow interpolation?
还有一个小问题,interfoam中动量方程的源项,如重力源项$\vec{g}\cdot\vec{x}\nabla\rho$等,我看是直接定义在面上了(代码中phig为$-(\vec{g}\cdot\vec{x})_f\cdot snGrad_f(\rho)\cdot |\vec{S_f}| \cdot rAU_f$),这个应该是传统的交错网格处理方式防止压强振荡?
-
是李东岳老师讲的“紧致基架点”的问题吗?我看了东岳老师文档,但却没有太理解,如果是的话我就再去看几遍。另外在写代码的时候怎么避免类似的问题呢?多用fvc::snGrad?
-
最近学习算法,绕来绕去把自己绕晕了,想问一下大家,下面这两个相等吗?
$(\nabla\phi)_f\cdot n_f$ 与 $snGrad_f(\phi)$
根据我的理解,对于同一个面,这两个表达式应该是相等的,都表示梯度在面法相方向的投影。但是我计算了一下,实际上怎么不想等?以如下一维网格为例:
左右两侧的边界条件都是零梯度,如果设$\phi_O=1000$,$\phi_N=1, |d_{ON}|=1$,那么梯度可计算为:
$(\nabla\phi)_O = 1000\cdot(-1) + (1000+1)/2\cdot1 = -499.5$$(\nabla\phi)_N = (1000+1)/2\cdot(-1) + 1\cdot1 = -499.5$
f上的梯度为
$(\nabla\phi)_f = [(\nabla\phi)_O + (\nabla\phi)_N]/2 = -499.5$实际上就是:$(\nabla\phi)_f\cdot n_f = -499.5$
而snGrad根据定义可以直接计算
$snGrad_f(\phi) = \frac{\phi_N - \phi_O}{|d|} = -999.0$这两个值为什么不相等呢?是哪里出问题了?请各位大佬指点,非常感谢!
-
各位,我发现问题所在了,是OpenMPI的问题。我换成intelMPI后,跨节点并行速度得到了极大的提升,双节点(每个节点双核,共4核)运行所需的时间缩短至72s左右。尽管还是比单节点上的运行时间(47s)长,但是这个结果也算是可以接受了。
-
各位老师,最近比较忙,这几天终于抽出时间把这个问题解决了,但是也出现了新的问题。现在来和大家讨论一下,希望能帮到有需要的人,也希望各位能再给我一些建议。
首先,我参考这篇文章,解决了不能夸节点并行的问题:
链接文本其方法就是在运行时通过添如下参数指定通信的地址:
--mca btl_tcp_if_include "通信地址“
其中“通信地址”是通过ip addr命令获得的。
其次,参考邱老师提供的链接,通过添加如下参数解决“There was an error initializing an OpenFabrics device.”的问题
--mca btl '^openib'
通过添加上述两个参数,现在运行时不会出现任何warning,跨节点并行也成功了。
然而,也出现了新的问题,就是跨节点并行的速度太慢了!我运行的算例是dambreak,所有设置保持默认不变,计算所需时间如下。
-
4核并行时:
双节点 (通信地址1) -- 686.79s
双节点 (通信地址2) -- 381.22s
单节点 -- 47.34s -
30核并行时:
双节点 (通信地址1) -- 3030.08s
双节点 (通信地址2) -- 2183.42s
单节点 -- 90.28s
单节点并行时,由于网格总数较少(9000左右),4核并行的时间较短,这个我认为是合理的。但相较于单节点并行,跨节点并行非常消耗时间,且指定不同通信地址时计算时间也不一样,说明节点之间的通信占据了大部分时间,这个现象是不正常的吧?
-
-
@李东岳 好的,谢谢李老师,我再研究一下,FLUENT是可以跑的,我看他们一个作业用了四个节点。
-
@xpqiu 感谢邱老师回复。
这个贴子我也搜到过,但我不确定前面的warning是否是问题所在,因为当我在一个节点上并行时,会出现如下提示(此时并行没问题,可以计算):
By default, for Open MPI 4.0 and later, infiniband ports on a device are not used by default. The intent is to use UCX for these devices. You can override this policy by setting the btl_openib_allow_ib MCA parameter to true. Local host: cu01 Local adapter: mlx5_0 Local port: 1 -------------------------------------------------------------------------- -------------------------------------------------------------------------- WARNING: There was an error initializing an OpenFabrics device. Local host: cu01 Local device: mlx5_0 -------------------------------------------------------------------------- [cu01:51824] 29 more processes have sent help message help-mpi-btl-openib.txt / ib port not selected [cu01:51824] Set MCA parameter "orte_base_help_aggregate" to 0 to see all help / error messages [cu01:51824] 29 more processes have sent help message help-mpi-btl-openib.txt / error in device init
这里大部分信息与上面的一样,就是少了刚才的“ received unexpected process identifier”,所以我猜想,可能“ received unexpected process identifier”才是主要的,其他的或许没那么重要?也不知道按照您帖子里的方法能不能解决“ received unexpected process identifier”的问题,我一会试一下。
-
@李东岳 感谢李老师回复,我之前还真没搜到你的这个帖子,我去学习一下,感谢!
另外多少钱买的,多少核?
我刚来这边,不太知道价格,一个计算节点信息如下:
cu01 state = free np = 56 ntype = cluster status = rectime=1657244447,state=free,slurmstate=idle,size=0kb:0kb,ncpus=56,boards=1,sockets=2,cores=28,threads=1,availmem=380000mb,opsys=linux 3.10.0-862.el7.x86_64 #1 smp fri apr 20 16:44:24 utc 2018,arch=x86_64
一个CPU节点56个核(还是28核56线程我也不太清楚。。。),共18个CPU节点,另外还有2个GPU节点,每个节点48核。
我看你说有管理员,他给你开了个普通账户。软件设置应该是管理员的工作。管理员平时干什么。。
这个事情一言难尽。买了节点后,实际上是我们这边的一个普通老师负责分配账户与资源,但是安装软件什么的他完全不懂。管理员就在买节点的时候拉了个群,后面我在群里提问,他很少回复,加好友也加不上。比如这个问题,我问了他就不理我,再解决不了我只找他电话打过去了。这个故事告诉我们买节点不要一下把钱都付了,否则人家都不理你。
另外,你的意思跑2个节点,每个节点15核,一共30核没问题。1个节点30核就有问题了?你这个每个节点多少核。是不是30超过了物理核心数。
是单节点30核并行没问题;两个节点,每个15核就不行了,测试算例为dambreak。
-
各位大佬,最近我尝试在课题组的集群上运行OF,由于之前一直在工作站上跑,因此遇到一些问题,可能比较初级,求各位指点。
课题组集群买后一直没什么人用,更别提Openfoam了。管理员给我开了一个普通账户,和我说在自己的账户下编译需要的程序即可。所以我参考咱们论坛上的一些方法,在我的普通账户下先编译了OpenMPI,然后又编译了OFv2006。
目前,在我的账户下,可以向工作站那样运行算例,提交到单节点上也可以并行。但是,一旦我想采用多节点并行,就会出现如下问题:
-------------------------------------------------------------------------- By default, for Open MPI 4.0 and later, infiniband ports on a device are not used by default. The intent is to use UCX for these devices. You can override this policy by setting the btl_openib_allow_ib MCA parameter to true. Local host: cu07 Local adapter: mlx5_0 Local port: 1 -------------------------------------------------------------------------- -------------------------------------------------------------------------- WARNING: There was an error initializing an OpenFabrics device. Local host: cu07 Local device: mlx5_0 -------------------------------------------------------------------------- [cu07][[41116,1],0][btl_tcp_endpoint.c:626:mca_btl_tcp_endpoint_recv_connect_ack] received unexpected process identifier [[41116,1],11] [cu07:16231] 29 more processes have sent help message help-mpi-btl-openib.txt / ib port not selected [cu07:16231] Set MCA parameter "orte_base_help_aggregate" to 0 to see all help / error messages [cu07:16231] 29 more processes have sent help message help-mpi-btl-openib.txt / error in device init
错误提示为“ received unexpected process identifier”,我查了下,意味着节点之间通信阻塞了。我以前没接触过MPI相关的内容,不知道这个是什么原因导致?我看课题组的其他人在跑fluent的时候可以多节点并行,所以是否我的设置有问题?
我使用的脚本如下。当nodes=2且ntasks-per-node=15时,会有上述问题,但当nodes=1且ntasks-per-node=30时,就没有问题了。
#!/bin/sh #SBATCH --job-name=dambreak #SBATCH --nodes=2 #SBATCH --ntasks-per-node=15 #SBATCH --time=999:00:00 #SBATCH --error="error.txt" mpirun -np 30 interIsoFoam -parallel 2>&1 > log.interIsoFoam
刚开始学,请各位大佬给点建议,非常感谢
-
@bestucan 在 请问如何理解这一项? 中说:
我猜是任意方向的加速度。
速度本身是矢量,做梯度就是个二阶张量了,前后乘以n和n的转置,应该是类似于对角化操作(基于某方向的对角化)。把各方向的加速度解耦出来,使之不在其他方向有分量。
这个“任意方向”就是右边那项分母上n的方向,咦,n就是法向哈
那应该就是了
但是要注意右边那项分子,速度有下标的,应该是n方向上的速度。
那这一项的意义应该是:“n方向上的速度,在n方向的加速度”这也和左边对角化操作印证,嗯,就这么猜
理解了,这项应该是一个标量,即“沿自由表面法向的加速度”。
我水平有限,还是需要多研究。
非常感谢您的不吝赐教!
-
@bestucan 在 请问如何理解这一项? 中说:
这,速度对坐标的偏微分,不就是加速度么。
三维上的,所以可以用左边的速度梯度(最大加速度方向的加速度)和坐标换算各个方向的加速度。
大概这个意思
感谢老师指点,我可以这么理解吗:这一项是沿自由表面法向的加速度?
-
各位老师好,最近我在文献中看到这一项:
\begin{equation}
\textbf{n}^T \cdot \nabla\textbf{u} \ \cdot \textbf{n} = \frac{\partial u_n}{\partial n}
\end{equation}
其中$\textbf{n}$是自由表面法向量,$\textbf{u}$为速度,但是右边那一项我看的不太明白,请问代表什么?文献中没有说明,好像大家都知道就我不知道出处:
Haghshenas M, Wilson J A, Kumar R. Finite volume Ghost Fluid Method implementation of interfacial forces in PISO loop. Journal of Computational Physics, 2019, 376:20-27.求大神解答,谢谢!
-
额 好像发现个问题,质量守恒方程应该是这个
其中𝑆(𝜌)与 𝑆(𝛾)形式一样,只不过自变量由相体积分数变成了密度,不知道这样对不对?
感觉有点弄乱了,求大佬指点,不胜感激
-
各位老师同学大家好,最近遇到了点小问题,真心求帮助。
假设流体不可压缩。MULES算法中,添加了人工压缩项以保证界面尖锐:
按我的理解,其实就相当于在VOF方程中引入了一个源项S
虽然界面压缩项只在自由表面附近起作用,但是严格来讲,连续性方程应该修改成如下形式才对吧?(因为对于不可压缩流体,相体积分数的控制方程与连续性方程是一致的)
但是在interfoam里面并未发现类似的代码,请问这是怎么回事呢?是对于这个问题,这个源项可以忽略吗?
推广一下,如果想在VOF方程中添加其他的源项,是不是也要修改质量守恒方程?
此外,对于相体积分数为0的网格,上式中除以相体积分数这个操作是不是需要特殊处理一下?我试了一下,假设这样
程序运行倒是没什么问题,但是这个意义我没搞清楚,这么一除不是得到无限大的速度散度了吗?目前,我倾向于这么做:对于相体积分数为0的网格,我直接将源项S的值设为0,即源项不起作用。说的可能有点乱,但主要的意思就是这样。。。
谢谢大家!
-
@李东岳 在 interfoam控制方程的问题 中说:
@cfdngu http://dyfluid.com/interFoam.html 不是方程26么 这里面的推导跟nonNewtonianIcoFoam是一样的 那个更简单 你可以看看
好的,非常感谢东岳老师
-
各位老师好,下图是我推的动量方程, 但是我发现很多文献里面写的并不是这样。
我推的(忽略表面张力项):
文献中常见的:
被我圈出来的这一项为什么不一样呢?是我链式法则用错了吗?
另外,有哪位老师能提供些intercompressiblefoam的学习资料?或者针对低速可压缩流体的教材的名称?之前一直做不可压缩流体,现在想做一些可压缩流体的工作,想尽快入门,谢谢!
-
@blookcfd
你好,感谢回复。我发现我的问题可能是由于snappyHexMesh选定的区域与重叠区域重合导致的,现在已经解决了。
但是也有没解决的部分,我自己在原来overset网格的基础上加了一点东西,自己编译了另一个lib,这个lib与SHM还是有点冲突,运行的时候会报错,但实际上SHM执行了,网格也能用,所以我下一步好好看看我自己编的lib哪里有问题。
当用toposet + createPatch时,提示找不到stl文件,但是我的stl文件就在对应文件夹下放着,所以这个问题我还没找到原因。
我还在找寻替代方法,如果您知道其他方法能把stl放入计算域中,请不吝赐教,谢谢。
-
大家好,今天发现overset网格和snappyHexMesh好像有点冲突,导致用stl文件在计算域中创建边界不成功。请问有其他办法可以用stl文件(在计算域中)创建边界吗?我想把地形放到计算域里。
我尝试了topoSet+createMesh,但是使用topoSet的时候提示找不到stl文件,但我的stl文件没有变过,就在constant/triSurface下面,SHM能找到。
其他的方法也行,主要是要在overset 网格下中实现这个功能。
谢谢
-
@jlx 在 关于overset网格的问题 中说:
@cfdngu 您好,我最近遇到了一个差不多的问题,想请教一下。
在OFv1912中使用重叠网格模拟波浪和浮体的相互作用,在监测重叠网格区域内的波高时,发现监测的是背景网格不变的波高而不是重叠网格区域的波高(如下图),因此监测的波高值一直保持不变是0,这和您使用probe提取浮体边界某点流场信息遇到的问题相似,因此想请教您该怎样得到重叠区域的波高呢?谢谢!
你好,
很遗憾,我没解决这个问题,目前我认为需要自己调整sample的代码。我的问题通选择patchProbes暂时解决了,但是你那个可能有难度。
思路大概就两种:
1、将重叠区网格细化,因此重叠区域得以变小,让浪高仪在非重叠区测波面;
2、改代码,重点关注如何根据位置坐标找到对应网格编号的,过程中可能要用到cellZone或者cellType场来加以区分结构物网格与背景网格 -
@bestucan 好的,非常感谢,我再研究一下~
-
@bestucan 你好,非常感谢你的回复,我其实周日晚上就看到了,受到很大启发,也还有些不懂的地方,所以思考了两天才回复。
第一个问题,我认为应该如你所说,是显式和隐式的区别;
第二个问题,我将ALE框架下的积分形式的方程手动离散了一下,发现和MULES或isoAdvector中对应的代码一致,用的是相对通量求解的,而rhoPhi也是用相对通量组建的,所以不需要再次进行makeRelative操作;
第三个问题,我还是没太明白,按照我的理解,fvc::intepolate(U)就应该直接是新的面上速度了。我认为最后一句是不是类似非正交修正的操作?(尤其是相邻网格体心连线没有经过面心的时候) -
大家好,最近重新研究interFoam,关于动网格的处理有些困惑,希望大家指点。
若网格进行运动,首先interFoam.C中要运行如下内容:
if (correctPhi) { // 计算绝对通量 phi = mesh.Sf() & Uf(); // 求解pcorr,利用其修正phi,保证质量守恒 #include "correctPhi.H" // 绝对通量转换为相对通量 fvc::makeRelative(phi, U); mixture.correct(); }
这段代码所做的工作我在注释中标注出来了,不知道是否准确。我的第一个问题是,计算绝对通量为什么不是如下代码:
phi = fvc::interpolate(U) & mesh.Sf()
按我的理解,直接用Uf()访问的是上一迭代得出的面上速度,网格运动后其不一定与新网格面在一个平面了,而fvc::interpolate(U)是按照更新的网格插值得出的,这样貌似更合理些?
随后是求解相方程的内容,采用相对通量求解没有问题。
#include "alphaControls.H" #include "alphaEqnSubCycle.H" mixture.correct();
相方程求解后,我没有发现对rhoPhi采用类似makeRelative()的操作,即程序直接组建速度矩阵然后求解压力泊松方程,并在求解后才执行makeRelative(),位置在pEqn.H:70。这一点我没理解,为什么在动量方程的求解中未使用相对通量,而在求解后才显式地将phi转换为相对通量?
最后还有个小问题,在求解完压力方程后,将phi转化为相对值之前,即pEqn.H:67,程序还对面上速度进行了更新:
Uf() = fvc::interpolate(U); surfaceVectorField n(mesh.Sf()/mesh.magSf()); Uf() += n*(phi/mesh.magSf() - (n & Uf()));
后两句存在的意义是什么呢?尤其是最后一句,实在没想明白。
劳烦大家指点下,我哪里理解有误还是哪个地方知识储备不够,这三个问题困扰我好几天了,查了不少资料也没找到原因,谢谢!
-
@bestucan 非常感谢!
-
大家好,我最近在研究OF的求解过程,主要针对interFoam这个求解器。
我的问题是大部分代码能看懂,并且也能够“翻译”成方程,当网格不动时,没什么问题。
但当涉及到网格运动/变形时,即Arbitrary Lagrangian–Eulerian框架下的计算,问题就来了:说来惭愧,我的理论基础不是很过关。即使把代码“翻译”成方程,也会产生很多疑问。
我举两个小栗子来说一下遇到的问题:
第一个,correctPhi这个函数,在interfoam中只要涉及到动网格就基本上会执行。我看了代码,应该是求解压力修正量pcorr,然后根据其对应的通量对现有的通量进行修正,以保证质量守恒。但是我没有发现pcorr与压力场的联系,所以我的疑惑在于为什么要通过pcorr修正?直接对通量场修正和这样做有什么区别吗?
第二个,MULES算法求解VOF方程时,其程序求解的离散方程大概这样子:
但是当网格运动后,右端第一项前面多出来一个上一时间步网格体积与当前时间步网格体积的比值(大概是这个意思),这个多出来的系数是怎么推出来的我也没搞清楚。因此我想提高一下理论基础,我在google上搜了一些关于动网格的资料,但都不是很详细,关于ALE方面的资料也是,且没有发现教材。在这里想请教大家一下,哪里有关于动网格处理、ALE理论(主要是控制方程的推导)、重叠网格这几方面的教材或者资料呢?中英文都可以,网课也行,谢谢大家了。
-
行我再考虑下,谢谢
-
对的
-
@cccrrryyy
老实说,对于波浪-结构物相互作用的问题是否采用湍流模型、采用哪个模型我一直拿不准。按照我的理解,造波和波浪在常水深下传播时,雷诺数(或粘度比)应该非常小。只有波浪与结构物相互作用过程中,发生波浪抨击、波浪破碎时,貌似才需要用湍流模型来模拟。这也是最初我不解的地方,因为我觉得源附近不应该有这么大的湍动能,而结构物附近的湍动能才应该相对大些。另外您说的网格问题是什么意思?我的算例中源区确实一般占据4-5个网格(x方向),但是我的网格不复杂,如下图
多说一句,按照我个人的经验,与波浪相关的问题,采用层流模型的结果貌似一般也不会与实验差太多。
可能我不是很懂,但是并行这个问题,真的是玄学。。
-
我进行了一些测试,结果如下:
我分别在串行和并行的前提下对算例进行了模拟,所有设置完全一致。采用isoAdvector捕捉的自由面,且算例中采用了overset网格来计算漂浮结构物的运动。图A和B分别是串行和并行前提下,t=2.5s时的结果速度场,图C和D是湍动能。明显看出,在t=2.5s时,质量源的强度还不是很大,源附近的速度梯度也不大,但是采用并行计算的结果已经出现了不正常的湍动能增加。
图A:
图B:
图C:
图D:
随着计算的进行,差距愈发明显。图E和F分别为t=3.5s时串行和并行得到的速度场,图G和H为湍动能。可以看出,t=3.5s时,计算结果已经被严重干扰。
图E:
图F:
图G:
图H:
如果我把D图放大,透明度调低,可以发现湍动能的扰动出现在不同子计算域的交界处:
另外,还有个比较诡异的地方,我的算例在并行时分为8个子区域,若采用simple(8 1 1)分块,计算无法进行。只有采用scotch才可以。我也尝试了不同的分块方法(数量),但并无明显改善。如果不同子区域的交接面不穿过质量源,那么湍动能的扰动出现的时间稍微有滞后,但最终还是会出现。质量源方面的代码是我自己写的,如果不用overset网格,只是进行造波的话又一切正常可以并行。
总的来说,貌似这个问题是由于并行引起的,并且这个影响主要在湍动能上:并行的层流计算也没有问题。请问有没有大佬遇到过类似的问题呢?另外我感觉OF中overset网格貌似不太适合并行?我不得不采用串行计算后,感觉速度没有慢很多。换言之,并行好像并没有让overset网格的算例计算速度增加多少。
对了,版本是v1906,湍流模型是k-e,引入了larson和furman在2018年JFM上的文章以解决湍流模型在层流区域高估湍流强度的问题(貌似这个对结果没啥影响)。
求大佬解惑,谢谢大家。
-
@Samuel-Tu 在 在质量守恒方程中添加源项对湍动能的影响 中说:
@CFDngu 是不是写了什么代码没有在多核时注意reduce..
我不是很了解MPI,但目前初步看来,不是reduce的问题,应该是不同区域交界面上的问题。在交界面上速度场貌似有点不连续,可能就是这样引起了扰动。详细的我明天去实验室再对比下。
-
各位老师,我今天有了重大发现:
(1)之前出现问题的算例使用的是overset网格,当不用overset网格时没有问题;
(2)overset网格在单核运行时湍动能的过度增长消失了!等我周一把算例的对比图传上来,这个结果我是真没想到,到时候希望有大佬来指点一下迷津。。。
-
各位老师好,最近遇到了一个湍流方面的问题,由于之前所有的计算都是在层流的条件下进行,实在没有经验,所以想请教一下大家。
我使用的是interFoam,计算二相不可压缩流。之前我在压力方程中添加了一个随时间变化的源项(源强度的变化趋势类似于简谐运动),用于在计算域中制造波浪,进而研究波浪与浮体之间的相互作用过程。方程大概这样子:
我的程序在层流下运行没有问题,可以实现想要的功能,但是在湍流情况下出现问题(目前我用的是k-e模型)。
计算时此源项位于某一区域Omega内,该区域称之为源区域。这个区域里速度的散度不为零,类似于一个水泵,向计算域中输入/抽取水体。当采用湍流模型计算时,由于源区域附近的速度梯度比较大,源区附近的湍动能显著增加。湍动能增加后,源周围的速度场受到影响呈现混乱的状态,进而使湍动能更加混乱,导致源区域附近的自由表面完全混乱。且随着时间的增加,混乱程度加剧,最后计算崩溃。
我想请教的问题就是,是否添加了质量源一定会产生这种问题?如何能够削弱源区域附近的湍动能过度增长?是通过设置还是修改方程?(我试过了修改fvscheme与fvsolution里面的各种设置,但问题依旧存在)因为感兴趣的地方在波浪与结构物相互作用,因此希望通过质量源可以产生简谐波而不是使源区域附近的自由表面高度混乱。
此外,还有一个问题,按我的理解,如果采用速度输入的方法,在边界上输入一个周期性变化的速度,那么是不是和添加质量源类似,边界附近的速度梯度也应该不小。这时候会不会出现类似的问题呢?(我看很多文章都是这么造波的,很好奇)
之前没怎么涉及过湍流模型的使用,如果问的问题过于简单希望大家不要嫌弃,谢谢
-
输出bmp格式的,且增加一下分辨率是否可行?
-
感谢!
-
有现成的,可以看看6DOF模块的代码,里面又控制方程,也有写好的阻力
-
@Sloan 感谢回复,overset是另一个路子,我这里没有涉及
-
@东岳 老师你的意思是用sixDoFRigidBodyMotion可以求解动边界吗?
-
大家好,我想做一个动边界+浮体的算例,目前的情况是这两个模块分开计算没问题,动边界求解用displacementLaplacian,浮体用sixDoFRigidBodyMotion,各自安好。
但是在一起求解时有问题,不知道动网格求解器怎么设置,弄了一下午都不行,我在CFD-online上搜索了很久,有这么一个帖子的情况和我比较类似:
链接文本
大概意思应该就是在dynamicDict里面采用displacementLaplacian,在pointDisplacement里面采用sixDoFRigidBodyDisplacement。然而,里面用到的类(sixDoFRigidBodyDisplacement)在OF5以上的版本就删除了,目前我用的是OF6。这个帖子里面的设置我按照做了也没成功,难道我要退回到OF4版本去吗 。我觉得既然删除了应该就有对应的替代,官方说是用sixDoFRigidBodyMotion代替,但是我测试了一下,如果用sixDoFRigidBodyMotion求解动边界(不加浮体),算不了几步就发散。
到底dynamicDict和pointdisplacement该怎么设置呢?谢谢了。附上能用的solver列表:
displacementComponentLaplacian displacementInterpolation displacementLaplacian displacementLayeredMotion displacementLinearMotion displacementSBRStress multiSolidBodyMotionSolver sixDoFRigidBodyMotion solidBody velocityComponentLaplacian velocityLaplacian
-
我用overset计算过浮体大幅度运动的问题,没遇到你们说的问题。
第一种可能是设置问题,可以仔细检查一下算例的设置,包括overset网格的设置;
第二中可能就是waves2Foam与overset网格结合的问题。这个我也不确定,因为我之前算的时候采用了自己写的造波程序。 -
SWAN应该是基于谱方法的模拟,一般用于模拟某一区域内的整体波浪场。interFoam是从流体力学角度出发,求解N-S方程,是一种“细节”的模拟方法。shallowWaterFoam没涉及过,但我估计应该类似于SWAN。
-
你好,感谢你的回复,你说的内容我之前有过了解,Pout可以输出所有processor的信息,每个网格有自己的编号。
可能是我描述问题不够精确,我换一个说法。
程序流程如下:
1、我创建了一个空容器,根据网格位置信息选定某一区域的网格,向容器里面添加元素(网格编号);
2、后续对这个容器进行操作,因此这个容器不能为空这个程序在单核的时候没有问题,寻找网格编号算法无误。但是并行时出现了问题,由于计算域被分块,并不是所有processor上的网格位置信息都位于目标区域,不包含目标网格的processor不会进行添加元素的操作,这样就导致在不同的processor之间有不同大小的容器,因此并行时会出现发散的情况。
我现在想尝试将所有的容器进行gather和scatter操作,但是没有成功,不知谁能给我点建议?谢谢
200万网格并行算力测试(OpenFOAM版本)
200万网格并行算力测试(OpenFOAM版本)
200万网格并行算力测试(OpenFOAM版本)
200万网格并行算力测试(OpenFOAM版本)
VOF方法中如何准确计算自由表面曲率?
VOF方法中如何准确计算自由表面曲率?
VOF方法中如何准确计算自由表面曲率?
请问有并行debug的工具吗?
请问有并行debug的工具吗?
fvc::intergrate(fvc::grad(phi))*nf不等于snGrad(phi)?
fvc::intergrate(fvc::grad(phi))*nf不等于snGrad(phi)?
fvc::intergrate(fvc::grad(phi))*nf不等于snGrad(phi)?
fvc::intergrate(fvc::grad(phi))*nf不等于snGrad(phi)?
集群上OF不能跨节点并行
集群上OF不能跨节点并行
集群上OF不能跨节点并行
集群上OF不能跨节点并行
集群上OF不能跨节点并行
集群上OF不能跨节点并行
请问如何理解这一项?
请问如何理解这一项?
请问如何理解这一项?
VOF方程的疑问
VOF方程的疑问
interfoam控制方程的问题
interfoam控制方程的问题
请问如何根据stl文件创建边界?(SHM除外)
请问如何根据stl文件创建边界?(SHM除外)
关于overset网格的问题
网格运动与相对通量转换的问题
网格运动与相对通量转换的问题
网格运动与相对通量转换的问题
大家能推荐些与动网格(ALE)相关的教材或书籍吗?
大家能推荐些与动网格(ALE)相关的教材或书籍吗?
在质量守恒方程中添加源项对湍动能的影响
在质量守恒方程中添加源项对湍动能的影响
在质量守恒方程中添加源项对湍动能的影响
在质量守恒方程中添加源项对湍动能的影响
在质量守恒方程中添加源项对湍动能的影响
在质量守恒方程中添加源项对湍动能的影响
在质量守恒方程中添加源项对湍动能的影响
paraview后处理的清晰度不够
一个关于使用SnappyHexMesh控制边界层生成的小程序
如何在dynamicMeshDict里设置restraint,实现浮体运动状态的控制?
如何将6DOF和动边界一起使用?
如何将6DOF和动边界一起使用?
如何将6DOF和动边界一起使用?
动网格和overset物体速度快速震荡导致崩溃的问题
OF波浪模拟
请教一个并行运算的问题