CFD中文网

    CFD中文网

    • 登录
    • 搜索
    • 最新
    1. 主页
    2. CFDngu
    C
    • 资料
    • 关注 2
    • 粉丝 6
    • 主题 33
    • 帖子 142
    • 群组 0

    CFDngu

    @CFDngu

    1891
    资料浏览
    142
    帖子
    6
    粉丝
    2
    关注
    注册时间 最后登录

    CFDngu 取消关注 关注

    CFDngu 发布的最佳帖子

    • RE: OpenFOAM不同版本代码转换的问题

      个人认为如果你在某一版本上开发了,就继续下去吧,不用移植了。。。。。

      发布在 OpenFOAM
      C
      CFDngu
    • RE: 给ubuntu 16 04 装了中文输入法

      @李东岳 对 有

      发布在 C斯达克
      C
      CFDngu

    CFDngu 发布的最新帖子

    • RE: VOF方法中如何准确计算自由表面曲率?

      @李东岳 在 VOF方法中如何准确计算自由表面曲率? 中说:

      这个方法在函数calculateK()里面,可直接调用。计算结果在3232网格上能得到光滑的结果,但不对。在6464网格上出现了数值振荡。

      VOF结果在网格比较细的时候结果不对?这个结论很有挑战性

      李老师,我用interIsoFoam算了一下,还是不对。在32$\times$32的网格上可以得到光滑的结果,但是和解析解不一样;在64$\times$64的网格上结果出现了振荡。interfoam也跑了一下,结果和interisofoam不一样,也不对。。。(这个算例的设置参照和解析解在主贴的参考文献[1]中)

      算例在这里,大家有兴趣可以跑一下。要是算例设置有问题也可以指出来。另外,我是在v2006环境下跑的(这个链接可能需要注册坚果云,我没找到其他的上传方法:xinlei: )
      capillaryWave

      发布在 OpenFOAM
      C
      CFDngu
    • RE: VOF方法中如何准确计算自由表面曲率?

      @李东岳 李老师,我在间断条件中加入了表面张力项$\sigma\kappa$,其中$\kappa$是用calculateK算的,结果确实不对。但这属于GFM方法,和CSF模型不同。明天我用interfoam算一下这个算例,看看结果如何。

      发布在 OpenFOAM
      C
      CFDngu
    • VOF方法中如何准确计算自由表面曲率?

      各位大神,我在做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.

      发布在 OpenFOAM
      C
      CFDngu
    • RE: 请问有并行debug的工具吗?

      @cp_zhao 这个我记得收费吧?不过也谢谢了~

      发布在 OpenFOAM
      C
      CFDngu
    • 请问有并行debug的工具吗?

      一直用gdb调试程序,但却不会并行调试。最近写的代码单核运行没问题了,但并行运行有问题,应该是不同processor交界面处出现问题。之前对并行这方面涉及不多,对并行编程思想认识不直观,故想尝试并行调试。

      我在openWiki上看到一个mpirunDebug文件(文件如下),但是不会用。求大佬指点一二,或者有什么好用的并行debug工具推荐一下?:xiexie:

      #!/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
      
      
      发布在 OpenFOAM
      C
      CFDngu
    • RE: fvc::intergrate(fvc::grad(phi))*nf不等于snGrad(phi)?

      @李东岳 好的,谢谢李老师。我发现面上梯度可通过fvc::reconstruct这个函数重构出的体心梯度,我还是得研究一下这个函数。比如刚刚的重力源项,定义在面上的话,我还没掌握怎么把它放回控制方程里面:143:

      发布在 OpenFOAM
      C
      CFDngu
    • RE: fvc::intergrate(fvc::grad(phi))*nf不等于snGrad(phi)?

      @李东岳 非常感谢东岳老师。现在有点理解了,在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$),这个应该是传统的交错网格处理方式防止压强振荡?

      发布在 OpenFOAM
      C
      CFDngu
    • RE: fvc::intergrate(fvc::grad(phi))*nf不等于snGrad(phi)?

      是李东岳老师讲的“紧致基架点”的问题吗?我看了东岳老师文档,但却没有太理解,如果是的话我就再去看几遍。另外在写代码的时候怎么避免类似的问题呢?多用fvc::snGrad?

      发布在 OpenFOAM
      C
      CFDngu
    • fvc::intergrate(fvc::grad(phi))*nf不等于snGrad(phi)?

      最近学习算法,绕来绕去把自己绕晕了,想问一下大家,下面这两个相等吗?

      $(\nabla\phi)_f\cdot n_f$ 与 $snGrad_f(\phi)$

      根据我的理解,对于同一个面,这两个表达式应该是相等的,都表示梯度在面法相方向的投影。但是我计算了一下,实际上怎么不想等?以如下一维网格为例:

      1.jpg

      左右两侧的边界条件都是零梯度,如果设$\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$

      这两个值为什么不相等呢?是哪里出问题了?请各位大佬指点,非常感谢!

      发布在 OpenFOAM
      C
      CFDngu
    • RE: 集群上OF不能跨节点并行

      各位,我发现问题所在了,是OpenMPI的问题。我换成intelMPI后,跨节点并行速度得到了极大的提升,双节点(每个节点双核,共4核)运行所需的时间缩短至72s左右。尽管还是比单节点上的运行时间(47s)长,但是这个结果也算是可以接受了。

      发布在 OpenFOAM
      C
      CFDngu