力学分析开源软件简介

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Palabos (/)

PalaBos的是一款高效的流体模拟及其建模库,开发基于C++的STL(标准模板库),有极强的拓展性!尽管其源代码是开放,但是基于PalaBos的FlowKit公司已于2011年9月开始运营(/),主要为流体力学相关领域提供解决方案,并定制软件。主要的开发者为我的日内瓦朋友Jonas Latt博士,另外一个重要开发成员Orestis博士也是我的合作者和好朋友,其主要的贡献在于湍流模型和多块加密的代码的开发。在版本1.0中,目前二维的多块加密是可用的,三维的曲面边界可用,需要提供stl几何文件(参:examples/showCases/aneurysm)。PalaBos的主要特点在于,其在并行结构上采取并行机制与模型分离的方式,使得应用建模与并行机制不相关。这也使得PalaBos 的易于扩展。下面举例来说明其代码特点:

对于二维计算下面两个基本的文件必须包括

#include "palabos2D.h"

#include "palabos2D.hh"

#include

#include

#include

#include

#include

基本的名字空间

using namespace plb;

using namespace plb::descriptors;

using namespace std;

typedef double T;

基本模型的描述。对于PalaBos,众多模型的应用,都是通过DnQmDescriptor 来描述的。用户可自定义!

#define DESCRIPTOR D2Q9Descriptor

初场的定义,建议使用这种方法

T poiseuilleV elocity(plintiY, IncomprFlowParamconst& parameters) {

T y = (T)iY / parameters.getResolution();

return 4.*parameters.getLatticeU() * (y-y*y);

}

压力的定义

T poiseuillePressure(plintiX, IncomprFlowParamconst& parameters) {

T Lx = parameters.getNx()-1;

T Ly = parameters.getNy()-1;

return 8.*parameters.getLatticeNu()*parameters.getLatticeU() / (Ly*Ly) * (Lx/(T)2-(T)iX);

}

密度场的定义

T poiseuilleDensity(plintiX, IncomprFlowParamconst& parameters) {

return poiseuillePressure(iX,parameters)*DESCRIPTOR::invCs2 + (T)1; }

根据坐标进行速度初始化

template

class PoiseuilleV elocity {

public:

PoiseuilleV elocity(IncomprFlowParam parameters_)

: parameters(parameters_)

{ }

void operator()(plintiX, plintiY, Array& u) const {

u[0] = poiseuilleV elocity(iY, parameters);

u[1] = T();

}

private:

IncomprFlowParam parameters;

};

根据坐标进行密度初始化

template

class PoiseuilleDensity {

public:

PoiseuilleDensity(IncomprFlowParam parameters_)

: parameters(parameters_)

{ }

T operator()(plintiX, plintiY) const {

return poiseuilleDensity(iX,parameters);

}

private:

IncomprFlowParam parameters;

};

零速度场初始化

template

class PoiseuilleDensityAndZeroV elocity {

public:

PoiseuilleDensityAndZeroV elocity(IncomprFlowParam parameters_)

: parameters(parameters_)

{ }

void operator()(plintiX, plintiY, T& rho, Array& u) const {

rho = poiseuilleDensity(iX,parameters);

u[0] = T();

u[1] = T();

}

private:

IncomprFlowParam parameters;

};

枚举类型,表示边界类型

enumInletOutletT {pressure, velocity};

建立几何

void channelSetup( MultiBlockLattice2D& lattice, IncomprFlowParamconst& parameters, OnLatticeBoundaryCondition2D&boundaryCondition, InletOutletTinletOutlet )

{

constplintnx = parameters.getNx();

constplintny = parameters.getNy();

下边界

boundaryCondition.setV elocityConditionOnBlockBoundaries (

lattice, Box2D(0, nx-1, 0, 0) );

上边界

boundaryCondition.setV elocityConditionOnBlockBoundaries (

lattice, Box2D(0, nx-1, ny-1, ny-1) );

设置相关边界

if (inletOutlet == pressure) {

boundaryCondition.setPressureConditionOnBlockBoundaries (

lattice, Box2D(0,0, 1,ny-2) );

boundaryCondition.setPressureConditionOnBlockBoundaries (

lattice, Box2D(nx-1,nx-1, 1,ny-2) );

}

else {

boundaryCondition.setV elocityConditionOnBlockBoundaries (

lattice, Box2D(0,0, 1,ny-2) );

boundaryCondition.setV elocityConditionOnBlockBoundaries (

lattice, Box2D(nx-1,nx-1, 1,ny-2) );

}

设置常密度和速度,边界的速度和密度同时被施加setBoundaryDensity (

lattice, lattice.getBoundingBox(),

PoiseuilleDensity(parameters) );

setBoundaryV elocity (

lattice, lattice.getBoundingBox(),

PoiseuilleV elocity(parameters) );

初始化平衡态

相关文档
最新文档