OpenFOAM代码

本文介绍了如何在OpenFOAM中计算patch的面积,包括获取patchID、创建PolyPatch、计算单个面的面积并累加,以及处理网格相关的量和边界条件。同时提及了时间步长、函数执行时间测量和标量场IO操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算Patch的面积

// 计算某个patch的面积  patchID表示面的边界条件标识符
label patchID = mesh.boundaryMesh().findPatchID("inlet");
// 创建一个polyPatch为了循环
const polyPatch& myPatch = mesh.boundaryMesh()[patchID];

// 初始化patchArea
scalar patchArea = 0.0;

// 循环polyPatch的所有面,添加其表面大小
forAll(myPatch, faceI)
{
    patchArea += mesh.magSf().boundaryField()[patchID][faceI]; // 获取指定面的面积
}

获取Patch的名字

Info << "patch name is " << U.boundaryField()[patch].patch().name() << endl;

网格相关量

const scalarField& V = mesh.V();   				//网格体积
const surfaceVectorField& Sf = mesh.Sf();   	//网格面矢量
const surfaceScalarField& magSf = mesh.magSf(); //网格面积的模(网格面积)
const surfaceVectorField& N = Sf/magSf;         //网格面法向

给定patch调用网格

如果p是一个fvPatch

const fvMesh& mesh = p.boundaryMesh().mesh();

类内调用时间步长

假定mesh_是类内可以调用的成员变量

const scalar deltaT = mesh_.time().deltaT().value();

如果mesh_不可获取,U_可获取:

const scalar deltaT = U_.mesh().time().deltaT().value();

声明一个tmp变量

dimless是一个表示无量纲的单位类型。
下面这段代码的意思是创建一个名为deltaLambdaTvolScalarField类型的临时变量,该变量有指定的名称、网格和初始值(1.0),这个变量可以在后续的计算中使用。

tmp<volScalarField> deltaLambdaT
(
	volScalarField::New
	(
    	"deltaLambdaT",
    	mesh_,
    	dimensionedScalar(dimless, 1.0)
    )
);

codeFixedValue

inlet
{
		type            codedFixedValue;
        value           uniform (0 0 0); //default value
        name           linearTBC; //name of new BC type
        code
        #{
            //const fvPatch& boundaryPatch = patch();
            //const fvBoundaryMesh& boundaryMesh = boundaryPatch.boundaryMesh();
            //const fvMesh& mesh = boundaryMesh.mesh();
            //const scalar &t = this->db().time().deltaTValue();
            
            scalar inletS = 0.0;
            const fvPatch& inletPatch = this->patch();
            
            forAll(inletPatch, faceI)
            {
                inletS += inletPatch.magSf()[faceI];
            } 

            scalar outletS = 0.0019304;
            scalar alphain = 0.1;

            vectorField& vf = *this; 

            forAll(vf, i)
            { 
                vf[i].y() = 0.01*outletS/inletS/alphain;
                vf[i].x() = 0.0; 
                vf[i].z() = 0.0; 
            }
        #};    
}

获得某个函数的计算时间

#include<chrono>
auto start = std::chrono::steady_clock::now();
// Functions here
auto end = std::chrono::steady_clock::now();
auto diff = end - start;
Info << "Calculate nodes and weights, using " 
    << std::chrono::duration<double, std::milli> (diff).count() << " ms" << endl;

在某个文件夹下输出scalarField

创建一个IOField<scalar>类型的对象,命名为utau,用于处理标量场的输入输出操作。它定义了IO对象的属性,包括名称、路径、关联的网格等,并提供了自动写入文件的功能。
其中totalFSize表示标量场的大小,这里根据具体的情况指定。0,0表示初始化标量场中的元素为0。

IOField<scalar> utau
(
	IOobject
	(
    	"utau",
    	runTime.constant(),
    	"../postProcessing",
    	mesh,
    	IOobject::NO_READ,
    	IOobject::AUTO_WRITE
    ),
    scalarField(totalFSize, 0, 0)
);

对网格进行赋值

forAll(T, C) // 遍历网格,T为场数据 C为索引
{
    T[C] = min(nu[C], 100); //对T的第C个网格,赋值第C个网格的nu与100的最小值
}

OpenFOAM二维数组

PtrList<PtrList<scalar>> te(4);
forAll(te, i)
{
    te.set(i, new PtrList<scalar>(4));
    forAll(te[i], j)
    {
        te[i].set(j, new scalar (0.0));
    }
}

OpenFOAM中将控制点缩放(改变尺寸)

// 进行缩放 将单位m改为mm
transformPoints -scale '(0.001 0.001 0.001)'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值