CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM (https://www.cfd-online.com/Forums/openfoam/)
-   -   codedFixedValue boundaries in parallel (https://www.cfd-online.com/Forums/openfoam/123674-codedfixedvalue-boundaries-parallel.html)

Hiroshiman September 18, 2013 11:15

codedFixedValue boundaries in parallel
 
Hello,
I'm using the codedFixedValue to set the pressure on the outlet on my case (flowRate at the inlet, pressure on the outlets).
I used the flowRate on the outlets to set the pressure. When the run is sequential, everything works fine but in parallel, the pressure isn't applied correctly.

My codeDict:
Code:


//reading the pressure on the considered patch     
        const volScalarField& p = db().lookupObject<volScalarField>("p");
        const fvPatchField<scalar>& pip = patch().patchField<volScalarField, scalar>(p);

//reading the flowRate on the considered patch     
        const surfaceScalarField& phi = db().lookupObject<surfaceScalarField>("phi");
        const fvsPatchField<scalar>& phip = patch().patchField<surfaceScalarField, scalar>(phi);


        int k=0;
        dimensionedScalar h("h",dimless, tstep.value());
        dimensionedScalar pp("pp",dimless, average(pip));    //average pressure on the patch
        dimensionedScalar res("res",dimless,1E6);
        dimensionedScalar p0("p0",dimless, 1E6);     
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

      pp += h * sum(phip); //test

        (*this)==(pp.value());
        #};

The average of the pressure isn't working well in parallel as it tries to do it where there the patch area is null:
Code:

--> FOAM Warning :
    From function average(const UList<Type>&)
    in file /home/apps/Logiciels/OpenFOAM/OpenFOAM-2.2.x/src/OpenFOAM/lnInclude/FieldFunctions.C at line 467
    empty field, returning zero


I guess I'm reading and writing the pressure and flowRate correctly but I don't really know what to do.



edit : I think the problem is only the access of the data on the processor patch and not the whole BC ; how can I get these data ?
If someone is able to help, thank you a lot.

Florian

jherb September 19, 2013 04:47

I think you have to use the OpenFOAM reduce functions to collect the data of all processors. These examples should help:
http://www.cfd-online.com/Forums/ope...tml#post429245
https://github.com/OpenFOAM/OpenFOAM...patchAverage.C

Hiroshiman September 19, 2013 13:45

Thank you for the answer.
Actually, I'm a bit lost :
I'm using the codedFixedValue BC and the structure of the code is quite different from what I see in the "real" BCs codes.
For example, to get the patch area, I do :
Code:

dimensionedScalar area("area",dimless, gSum(patch().magSf()));
and even if the patch is shared between several cpus, the area is ok. However, the pressure applied is not ok (several different values on the patch, dependant on the cpu).
I tried to assign on cpu for each outlets but it simply crashes...

gschaider September 19, 2013 19:58

Quote:

Originally Posted by Hiroshiman (Post 452594)
Thank you for the answer.
Actually, I'm a bit lost :
I'm using the codedFixedValue BC and the structure of the code is quite different from what I see in the "real" BCs codes.
For example, to get the patch area, I do :
Code:

dimensionedScalar area("area",dimless, gSum(patch().magSf()));
and even if the patch is shared between several cpus, the area is ok. However, the pressure applied is not ok (several different values on the patch, dependant on the cpu).
I tried to assign on cpu for each outlets but it simply crashes...

It never occurred to you that there might be a difference between gSum and sum (which you're using in your BC)?

Hiroshiman September 19, 2013 20:52

Ahem, I totally missed that obviously... Thank you for noticing, I'll try with the global sum and see how it behaves.

----------

edit
Thank you very much, my results are identical between sequential and parallel runs.

Best regards,

Florian

smodh October 5, 2016 11:00

I am using codedFixedValue bc for implementing ΔV=0 ;where V=x2+y2+z2
my boundarycondition at 0/phi is:
inlet
{
type codedFixedValue;
value uniform 0;
redirectType velocitySquareInlet;

code
#{
const fvPatch& boundaryPatch = patch();
const vectorField& Cf = boundaryPatch.Cf();

scalarField& field = *this;

forAll(Cf, faceI)
{
(
(Cf[faceI].x()=0) &&
(Cf[faceI].y()=0) &&
(Cf[faceI].z()=0)
)
{
field[faceI] = ((Cf[faceI].x()*Cf[faceI].x())
+(Cf[faceI].y()*Cf[faceI].y())
+(Cf[faceI].z()*Cf[faceI].z()));
}
}
#};


and I will have following error at terminal
Using dynamicCode for patch inlet on field phi at line 25 in "/home/sachin/OpenFOAM/Conduction/charge-20/0/phi.boundaryField.inlet"
Creating new library in "dynamicCode/velocitySquareInlet/platforms/linux64GccDPInt32Opt/lib/libvelocitySquareInlet_f5eecc7ba736b15b9d60f3aa108 fc0cf20d513de.so"
Invoking "wmake -s libso /home/sachin/OpenFOAM/Conduction/charge-20/dynamicCode/velocitySquareInlet"
wmakeLnInclude: linking include files to ./lnInclude
Making dependency list for source file fixedValueFvPatchFieldTemplate.C
/home/sachin/OpenFOAM/Conduction/charge-20/0/phi.boundaryField.inlet: In member function ‘virtual void Foam::velocitySquareInletFixedValueFvPatchScalarFi eld::updateCoeffs()’:
/home/sachin/OpenFOAM/Conduction/charge-20/0/phi.boundaryField.inlet:39:35: error: assignment of read-only location ‘(&(& Cf)->Foam::Field<Foam::Vector<double> >::<anonymous>.Foam::List<Foam::Vector<double> >::<anonymous>.Foam::UList<T>:perator[]<Foam::Vector<double> >(faceI))->Foam::Vector<Cmpt>::x<double>()’
/home/sachin/OpenFOAM/Conduction/charge-20/0/phi.boundaryField.inlet:40:35: error: assignment of read-only location ‘(&(& Cf)->Foam::Field<Foam::Vector<double> >::<anonymous>.Foam::List<Foam::Vector<double> >::<anonymous>.Foam::UList<T>:perator[]<Foam::Vector<double> >(faceI))->Foam::Vector<Cmpt>::y<double>()’
/home/sachin/OpenFOAM/Conduction/charge-20/0/phi.boundaryField.inlet:41:35: error: assignment of read-only location ‘(&(& Cf)->Foam::Field<Foam::Vector<double> >::<anonymous>.Foam::List<Foam::Vector<double> >::<anonymous>.Foam::UList<T>:perator[]<Foam::Vector<double> >(faceI))->Foam::Vector<Cmpt>::z<double>()’
/home/sachin/OpenFOAM/Conduction/charge-20/0/phi.boundaryField.inlet:43:17: error: expected ‘;’ before ‘{’ token
/home/sachin/OpenFOAM/Conduction/charge-20/0/phi.boundaryField.inlet:34:26: warning: unused variable ‘field’ [-Wunused-variable]
/opt/openfoam4/wmake/rules/General/transform:8: recipe for target 'Make/linux64GccDPInt32Opt/fixedValueFvPatchFieldTemplate.o' failed
make: *** [Make/linux64GccDPInt32Opt/fixedValueFvPatchFieldTemplate.o] Error 1


--> FOAM FATAL IO ERROR:
Failed wmake "dynamicCode/velocitySquareInlet/platforms/linux64GccDPInt32Opt/lib/libvelocitySquareInlet_f5eecc7ba736b15b9d60f3aa108 fc0cf20d513de.so"


file: /home/sachin/OpenFOAM/Conduction/charge-20/0/phi.boundaryField.inlet from line 25 to line 30.

From function void Foam::codedBase::createLibrary(Foam::dynamicCode&, const Foam::dynamicCodeContext&) const
in file db/dynamicLibrary/codedBase/codedBase.C at line 206.

FOAM exiting




Does anyone know the solution?
Thanks in advance!!!!!

smodh October 6, 2016 09:34

solve the problem....


inlet
{
type codedFixedValue;
value uniform 0;
redirectType velocitySquareInlet;

code
#{
const fvPatch& boundaryPatch = patch();
const vectorField& Cf = boundaryPatch.Cf();

scalarField& field = *this;

forAll(Cf, faceI)
{

{
field[faceI] = ((Cf[faceI].x()*Cf[faceI].x())
+(Cf[faceI].y()*Cf[faceI].y())
+(Cf[faceI].z()*Cf[faceI].z()));
}
}
#};


solve it!!!!


All times are GMT -4. The time now is 19:08.