SprayFoam 只喷固体该如何设置?
- 
							
							
							
							
 
 模型如图所示,我需要模拟一个辆车的尾气颗粒在一个隧道里怎么分布,颗粒与颗粒的碰撞需要考虑,这辆车只喷颗粒物质一定速度喷(比如每秒20000个),然后隧道一段以一定的速度进风。 之前@散漫守望2016 给我介绍可以看看coalchemistryFoam,但是我今天看了sprayFoam,我想着用sprayFoam应该也可以解决这个问题。 今天就花了很久在看sprayFoam 但是发现了一个问题,我可以把所有的化学反应关闭,但是在设置sprayCloudProperties的时候遇见了问题。我是基于 tutorials/lagrangian/sprayFoam/aachenBomb 这个case直接改的。这个case是喷入C7H16,我这里如果想只喷入固体颗粒,需要在singlePhaseMixtureCoeffs 下面的phases 里面写成 solid就可以了,然后再在 thermophysicalProperties 里面也改。但是运行的时候出现这个的时候出现 segmentation fault。请问什么问题。 
- 
							
							
							
							
之前写的一个pimpleCoupledKinematicParcelFoam求解器,给你共享一下,大致下面这样,这个solver的主要部分,可以求解你的那个问题。 
 主程序:
 int main(int argc, char *argv[])
 {
 argList::addOption
 (
 "cloudName",
 "name",
 "specify alternative cloud name. default is 'kinematicCloud'"
 );
 #include "setRootCase.H"
 #include "createTime.H"
 #include "createMesh.H"
 #include "readGravitationalAcceleration.H"
 #include "readTransportProperties.H"
 #include "createFields.H"
 #include "initContinuityErrs.H"
 #include "readTimeControls.H"
 #include "CourantNo.H"
 #include "setInitialDeltaT.H"pimpleControl pimple(mesh); // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // Info<< "\nStarting time loop\n" << endl; while (runTime.run()) { #include "readTimeControls.H" #include "CourantNo.H" #include "setDeltaT.H" runTime++; Info<< "Time = " << runTime.timeName() << nl << endl; Info<< "Evolving " << kinematicCloud.name() << endl; kinematicCloud.evolve(); kinematicCloud.info(); // --- Pressure-velocity PIMPLE corrector loop while (pimple.loop()) { #include "UEqn.H" // --- Pressure corrector loop while (pimple.correct()) { #include "pEqn.H" } if (pimple.turbCorr()) { turbulence->correct(); } } runTime.write(); Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" << nl << endl; } Info<< "End\n" << endl; return 0;} CreateFields.H文件 
 Info<< "Reading normalised dynamic presure field p_rgh\n" << endl;
 volScalarField p_rgh
 (
 IOobject
 (
 "p_rgh",
 runTime.timeName(),
 mesh,
 IOobject::MUST_READ,
 IOobject::AUTO_WRITE
 ),
 mesh
 );Info<< "Reading field U\n" << endl; volVectorField U ( IOobject ( "U", runTime.timeName(), mesh, IOobject::MUST_READ, IOobject::AUTO_WRITE ), mesh ); Info<< "Creating phi [m3/s] " << endl; #include "createPhi.H" Info<< "Creating turbulence model\n" << endl; singlePhaseTransportModel laminarTransport(U, phi); autoPtr<incompressible::turbulenceModel> turbulence ( incompressible::turbulenceModel::New(U, phi, laminarTransport) ); //Info<< "Creating source list\n" << endl; fv::IOoptionList fvOptions(mesh); Info<< "Calculating field g.h\n" << endl; volScalarField gh("gh", g & mesh.C()); surfaceScalarField ghf("ghf", g & mesh.Cf()); Info<< "Creating absolute pressure field p [Pa]\n" << endl; volScalarField p ( IOobject ( "p", runTime.timeName(), mesh, IOobject::NO_READ, IOobject::AUTO_WRITE ), rhoVal*(p_rgh + gh) ); Info<< "Reading field U\n" << endl; label pRefCell = 0; scalar pRefValue = 0.0; setRefCell ( p, p_rgh, mesh.solutionDict().subDict("PIMPLE"), pRefCell, pRefValue ); if (p_rgh.needReference()) { p += dimensionedScalar ( "p", p.dimensions(), pRefValue - getRefCellValue(p, pRefCell) ); } Info<< "Creating mass flux density surface field rhoPhi [kg/s] " << endl; surfaceScalarField rhoPhi ( IOobject ( "rhoPhi", runTime.timeName(), mesh, IOobject::READ_IF_PRESENT, IOobject::AUTO_WRITE ), rhoVal*linearInterpolate(U) & mesh.Sf() ); // dummy-fields to satisfy the requirements of the kinematicCloud Info<< "Creating rho field " << endl; volScalarField rho ( IOobject ( "rho", runTime.timeName(), mesh, IOobject::NO_READ, IOobject::NO_WRITE ), mesh, rhoVal, "zeroGradient" ); Info<< "Creating mu field " << endl; volScalarField mu ( IOobject ( "mu", runTime.timeName(), mesh, IOobject::NO_READ, IOobject::NO_WRITE ), mesh, rhoVal*nu, "zeroGradient" ); Info<< "Constructing kinematicCloud" << endl; basicKinematicCollidingCloud kinematicCloud ( "kinematicCloud", rho, U, mu, g );** 
 readTransportProperties文件**:
 Info<< "\nReading transportProperties\n" << endl;IOdictionary transportProperties ( IOobject ( "transportProperties", runTime.constant(), mesh, IOobject::MUST_READ_IF_MODIFIED, IOobject::NO_WRITE ) ); dimensionedScalar nu ( transportProperties.lookup("nu") ); dimensionedScalar rhoVal ( transportProperties.lookup("rho") ); Info<< "rhoVal is " << rhoVal << endl; dimensionedScalar irhoVal("irhoVal",(1.0/rhoVal));** 
 UEqn.H文件:**
 // Solve the momentum equation
 fvVectorMatrix UEqn
 (
 fvm::ddt(U)- fvm::div(phi, U)
- turbulence->divDevReff(U)
 ==
 irhoVal*kinematicCloud.SU(U)
- fvOptions(U)
 );
 UEqn.relax(); fvOptions.constrain(UEqn); if (pimple.momentumPredictor()) 
 {
 solve
 (
 UEqn
 ==
 fvc::reconstruct
 (
 -fvc::snGrad(p_rgh)*mesh.magSf()
 )
 );
 }pEqn.H文件: 
 {
 volScalarField rAU("rAU", 1.0/UEqn.A());
 surfaceScalarField rAUf("(1|A(U))", fvc::interpolate(rAU));U = rAU*UEqn.H(); phi = (fvc::interpolate(U) & mesh.Sf()); 
 //+ fvc::ddtCorr(U, phi);adjustPhi(phi, U, p_rgh); while (pimple.correctNonOrthogonal()) 
 {
 fvScalarMatrix p_rghEqn
 (
 fvm::laplacian(rAU, p_rgh) == fvc::div(phi)
 );p_rghEqn.setReference(pRefCell, getRefCellValue(p_rgh, pRefCell)); p_rghEqn.solve(mesh.solver(p_rgh.select(pimple.finalInnerIter()))); if (pimple.finalNonOrthogonalIter()) { // Calculate the conservative fluxes phi -= p_rghEqn.flux(); // Explicitly relax pressure for momentum corrector p_rgh.relax(); // Correct the momentum source with the pressure gradient flux // calculated from the relaxed pressure U -= rAU*fvc::reconstruct((p_rghEqn.flux())/rAUf); U.correctBoundaryConditions(); }} #include "continuityErrs.H" p = rhoVal*(p_rgh + gh); if (p_rgh.needReference()) 
 {
 p += dimensionedScalar
 (
 "p",
 p.dimensions(),
 pRefValue - getRefCellValue(p, pRefCell)
 );
 p_rgh = irhoVal*p - gh;
 }
 }
 
			

