【求助】OpenFOAM求解时候出现的错误
-
在OpenFOAM求解的时候,出现了下面的错误:
[0] [0] [0] -->FOAM FATAL ERROR [0] Attempt to create more than 2 tmp's referring to the same object of type tmp<N4Foam14GeometricFieldINS_6VectorIdEENS_12fvPatchFieldENS_7volMeshEEE> [0] [0] From function void Foam::tmp<T>::operator++() [with T = Foam::GeometricField<Foam::Vector<double>, Foam::fvPatchField, Foam::volMesh>] [0] in file /opt/openfoam6/src/OpenFOAM/lnInclude/tmpI.H at line 38. [0]
问题代码应该是这几句
fvVectorMatrix AEqn ( fvm::laplacian(A) == -fvc::Su(miu0*js, A) ); AEqn.relax(); AEqn.solve(); B = fvc::curl(A);
A是一个矢量场,miu0是一个标量,js是一个矢量场
这个问题觉得代码没写错
另外,什么时候回用到tmp这个类型?tmp<volScalarField> t_scalarField 与 volScalarField scalarField 这两种声明方式主要区别是什么?
请各位不吝赐教: -
@东岳 我的代码里没有用到tmp。这个程序是基于laplacianFoam写的,用于简单电磁场的求解,里面只有两个传输方程:
fvScalarMatrix phieEqn ( fvm::laplacian(phi_e) ); phieEqn.relax(); phieEqn.solve(); js = fvc::reconstruct ( -fvc::interpolate(conduct) * fvc::snGrad(phi_e) * mesh.magSf() ); fvVectorMatrix AEqn ( fvm::laplacian(A) == -fvc::Su(miu0*js, A) ); AEqn.relax(); AEqn.solve(); B = fvc::curl(A);
phi_e是电势;conduct是电导率,这里是一个非均匀场,所以计算电流密度js的时候差值了一下;A是磁矢势;miu0为真空磁导率
在运行的时候,phieEqn是可以顺利求解的,但是AEqn求解的时候就出错误了
另外,在很多OpenFOAM的底层文件中,经常用tmp<volScalarField>来声明变量,我的理解是:volScalarField声明的变量是在需要在内存中指定一块地址给这个变量的,而tmp<volScalarField>是指向一个volScalarField的指针。可是在volScalarField变量之间做赋值和参数传递的时候也只是传递的数据指针,函数调用volScalarField类型变量的时候用的也是引用传参,这样的话好像tmp可用可不用呀。
在求解器的编写中基本上见不到tmp这个东西,但是在底层的一些代码中tmp就满天飞。有哪些场合必须用tmp<volScalarField>而不用volScalarField?tmp这个东西用的时候需要注意什么?