leoncly3 / mySolverFoam

1 stars 1 forks source link

deltaT #4

Closed leoncly3 closed 4 months ago

leoncly3 commented 4 months ago

步长设置 原问题做了无量纲处理 这里是否涉及到缩放问题

leoncly3 commented 4 months ago

comsol设置为range(0,1,400),但是openfoam设置步长为1计算到第八个步长就发散了,设置为0.1或者0.01可以进行计算,还需要考虑如何设置为变步长计算

leoncly3 commented 4 months ago

变步长计算 尝试openfoam变步长计算方法

leoncly3 commented 4 months ago

库郎数和设置变步长 库郎数被影响的原因 以及如何设置

leoncly3 commented 4 months ago

直接设置adjustTimeStep并不可行,需要#include三个.H文件,但是库伦数的公式涉及到步长、速度场和网格尺寸,icoFoam以及给出的例子都是带速度场的,因此直接include不会报错,但是当前求解器并没有U,因此需要找到替换U的量,考虑用c的梯度来替换,但是目前是两个场,是否需要设置两个库郎数呢?以及设置库郎数是否需要更改openfoam的源文件?

leoncly3 commented 4 months ago

CFL应该是有明确的物理意义,即使选择一个梯度向量来替换掉U速度场,但也不能随意替换,尤其是c的梯度是三维,x、y、z三个方向,如果直接替换的话的话行不通,考虑将c的梯度的x、y方向分量赋值到U的x、y的速度,z轴方向是0,但是由于CFL需要明确的物理意义,因此公式需要说得通,暂时考虑扩散公式,即为U= -D*gard(c),D应该取什么?

leoncly3 commented 4 months ago

取消了自定义速度场通过CFL来限制步长变化,重新选用了c浓度梯度的模长来作为约束步长变化。scalar currentResidualC = computeResidual(c);//计算当前残差 scalar currentResidualU = computeResidual(u);//计算上一个步长的残差 scalar residualRatioC = currentResidualC / previousResidualC;//残差变化 scalar residualRatioU = currentResidualu / previousResidualu;//u的残差变化 scalar maxResidualRatio = max(residualRatioC, residualRatioU);//c和u的残差变化都直接考虑进去了,不需要再分开考虑了,之前考虑的速度场就只考虑了c的梯度,并没有考虑u的

if (maxResidualRatio > 1.0) { // 如果残差增加,减少时间步长 runTime.deltaT() = relaxationFactor / maxResidualRatio; } =是在赋值新的时间步长,例如ralaxtionFactor=0.5 ,此时maxRsidualRatio=2,此时新的时间步长就要赋值乘上0.25,这样就完成了时间步长调整的过程 else { // 如果残差减小,增加时间步长,其实这种情况下,增加时间步长可以视为一种尝试,目的是查看在略大一些的时间步长下,解是否仍然稳定且准确。如果增加时间步长后残差仍然控制在可接受的范围内,计算效率将提高。 runTime.deltaT() /= relaxationFactor * maxResidualRatio;//如果这里的maxResidualRatio小于等于1,这样时间步长除以后面的值就可以实现增加了 }

计算结果显式,并没有什么卵用,时间步长确实改变了,但是几乎改变为0,可以参考下comsol, BFD求解器,通过检测误差的方式来控制步长变化。因此对角矩阵残差一直为0