CFD Online Discussion Forums

CFD Online Discussion Forums (http://www.cfd-online.com/Forums/)
-   OpenFOAM (http://www.cfd-online.com/Forums/openfoam/)
-   -   Need ur help (http://www.cfd-online.com/Forums/openfoam/108617-need-ur-help.html)

Rocky4 October 28, 2012 22:44

Need ur help
 
Dear Foamers,

i have a volScalarField (say X) whose value at the patches and cells depends on the cell values of another volScalarField (sayY). i am able to change the value of X at the cells using

forAll(X, celli)
{ if (Y[celli] ==0)
{X[celli] =a;}
else
{X[celli]=b;}}

however i am unable to do the same for the patches of X
i.e if Y[celli] =0 where celli is any boundary cell then X[patchi] should be set to 'a' else it should be set to 'b'.something like this

forAll(X.boundaryField(), patchi)
{ //if (Y[celli] ==0) ,this represents any boundary cell value of field Y
{X.boundaryField()[patchi] =a;}
else
{X.boundaryField()[patchi]=b;}}

can someone can give a detailed code to accomplish this task?
i m new to openfoam. any kind of help is greatly appreciated. thanks in advance.

adhiraj October 29, 2012 00:30

I would do this:-
Code:

forAll(X.boundaryField(), patchi)
{
 forAll(X.boundaryField()[patchi],celli)
 {
  if(Y.boundaryField()[patchi][celli]==0)
      X.boundaryField()[patchi][celli]=a;
  else
    X.boundaryField()[patchi][celli]=b;
 }
}

NOTE:
  1. By the way, you have a typo in the if loop: you probably mean
    Code:

    Y[celli]==0
  2. For doubles or floats, comparison directly like this may fail. You may be better off checking if the absolute value is within a small region around zero.
  3. The volScalarFields can be directly copied and assigned to each other.
    I don't know if something like this would work:
    Code:

    X=(Y==0)?a:b

Rocky4 October 29, 2012 00:46

Hi Adhiraj
thanks a lot for your kind help .i will just try it out .and yes i had typo in the if loop.
thanks alot.
regards
mandeep

Rocky4 October 29, 2012 13:32

Hi Adhiraj,
I tried it and worked great.in my actual code the x field is assigned value 'a' if 0<y<1 and 'b' if y=1. so the issue of 0 didn't comeup.once again thanks alot for ur kind help
regards
mandeep

adhiraj October 31, 2012 06:54

Good that it worked. :)

The issue is not with zero in particular; two doubles should not be compared directly like this
Code:

x==y
Rather you want to check if
Code:

abs(x-y)<=epsilon
where epsilon is a small number.


All times are GMT -4. The time now is 21:14.