【求助】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?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这个东西用的时候需要注意什么?
-
tmp
是可用不可用都行的。5年前曾无聊测试过tmp,能节省内存。你看tmpI.H里面的代码,有个clear()函数,一旦tmp指向了真实的volScalarField,tmp就释放了。求解器里面也有类似的使用,
UEqn.clear();
tmp只是内存优化的产物,面向对象和面向过程也一样。指针、引用、const、tmp都是指上添花的东西,如果用起来感觉麻烦,可以按照最简单的来然后在优化。
-
js
是什么类型?怎么声明的?
-
@wwzhao js是一个矢量场,其物理意义是电流
volVectorField js { IOobject ( "js", runTime.timeName(), mesh, IOobject::NO_READ, IOobject::AUTO_WRITE ), mesh, dimensionedVector("js", dimensionSet(0,-2,0,0,0,1,0), Zero) };