张量二阶偏导数 偏(A_j B_i)/偏(x_i x_j) 如何编程
- 
							
							
							
							
							
							
想计算一个源项: 
 $$
 \frac{\partial^2 (\overline{\rho} \overline{U}_j u_i^\prime) }{\partial x_i \partial x_j}
 $$
 其中上横线表示时间平均量,上标撇表示脉动量。
 我把rhoMean、UMean和UPrime都计算好了,它们的类型分别是
 volScalarField rhoMean; volVectorField UMean; volScalarField UPrime;
 展开后是
 $$
 \begin{multline}
 [{\frac{{{\partial ^2}}}{{\partial x_1^2}}(\bar \rho {{\bar U}_1}u_1^\prime ) + \frac{{{\partial ^2}}}{{\partial {x_1}\partial {x_2}}}(\bar \rho {{\bar U}_2}u_1^\prime ) + \frac{{{\partial ^2}}}{{\partial {x_1}\partial {x_3}}}(\bar \rho {{\bar U}_3}u_1^\prime ) + \frac{{{\partial ^2}}}{{\partial {x_2}\partial {x_1}}}(\bar \rho {{\bar U}_1}u_2^\prime ) +
 \\
 \frac{{{\partial ^2}}}{{\partial x_2^2}}(\bar \rho {{\bar U}_2}u_2^\prime ) + \frac{{{\partial ^2}}}{{\partial {x_2}\partial {x_3}}}(\bar \rho {{\bar U}_3}u_2^\prime ) + \frac{{{\partial ^2}}}{{\partial {x_3}\partial {x_1}}}(\bar \rho {{\bar U}_1}u_3^\prime ) + \frac{{{\partial ^2}}}{{\partial {x_3}\partial {x_2}}}(\bar \rho {{\bar U}_2}u_3^\prime ) + \frac{{{\partial ^2}}}{{\partial x_3^2}}(\bar \rho {{\bar U}_3}u_3^\prime )}]
 \end{multline}
 $$
 然后该如何写这个偏导数呢?和AI战斗了好久它还是没懂,它一直想用fvc::laplacian(),但是fvc::laplacian()的含义是$\frac{\partial ^2}{\partial x_1^2}+\frac{\partial ^2}{\partial x_2^2}+\frac{\partial ^2}{\partial x_3^2}$。
- 
							
							
							
							
@学流体的小明 
 问了AI,OpenFOAM需要手动做两次梯度计算#include "fvCFD.H" // OpenFOAM 的核心头文件,包含 mesh、field、fvc/fvm 工具 #include "fvcGrad.H" // 显式声明 fvc::grad int main(int argc, char *argv[]) { #include "setRootCase.H" #include "createTime.H" #include "createMesh.H" // 创建速度场 U volVectorField U ( IOobject ( "U", runTime.timeName(), mesh, IOobject::MUST_READ, IOobject::AUTO_WRITE ), mesh ); // 把 u1 分离出来 volScalarField u1 = U.component(vector::X); // 或者 U.x() // 1. 计算 u1 的一阶梯度 ∇u1 volVectorField gradU1 = fvc::grad(u1); // gradU1.x() = ∂u1/∂x1 // gradU1.y() = ∂u1/∂x2 // gradU1.z() = ∂u1/∂x3 // 2. 对 ∂u1/∂x1 这个标量场,在 x2(Y)方向再求一次梯度 // fvc::grad(gradU1.x()) 是一个 volVectorField, // 其中 .y() 即 ∂(∂u1/∂x1)/∂x2 = ∂²u1/∂x1∂x2 volScalarField d2u1dx1dx2 = fvc::grad( gradU1.x() ).y(); // 写入结果 d2u1dx1dx2.write(); return 0; }
 
			
