CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Programming & Development (https://www.cfd-online.com/Forums/openfoam-programming-development/)
-   -   set fvMatrix coefficients equal to those of another cell (https://www.cfd-online.com/Forums/openfoam-programming-development/91093-set-fvmatrix-coefficients-equal-those-another-cell.html)

akimbrell July 31, 2011 02:37

set fvMatrix coefficients equal to those of another cell
 
Hello all,

I have a problem in which I want to set the solution dependency of a particular subset of cells to that of another subset of cells, i.e. I need to set the fvMatrix coefficients in UEqn for a particular subset equal to a different subset, iterating per cell. I have done considerable reading about the addressing format for the lduMatrix but it isn't clear to me whether I can do what I need. Also I have looked at the setValues function in fvMatrix but that involves setting the value within the cell to a constant value. I want to preserve the dependency of the other cell on its neighbors when the equation is solved.

Is this possible using the current mechanics of the fvMatrix, or would I need to create my own addressing system to allow me to do this? Any help would be great, I am kind of stuck and my thesis is dependent on getting this to work.

Thanks,

Austin

santiagomarquezd August 1, 2011 14:59

Austin, changing the coeffs in a fvMatrix is possible like in negSumDiag (lduMatrixOperations.C) method, for example. In this method info from non-diagonal coeffs is readed and subtracted from diagonal coeffs.

Code:

00050 void Foam::lduMatrix::negSumDiag()
00051 {
00052    const scalarField& Lower = const_cast<const lduMatrix&>(*this).lower();
00053    const scalarField& Upper = const_cast<const lduMatrix&>(*this).upper();
00054    scalarField& Diag = diag();
00055
00056    const labelUList& l = lduAddr().lowerAddr();
00057    const labelUList& u = lduAddr().upperAddr();
00058
00059    for (register label face=0; face<l.size(); face++)
00060    {
00061        Diag[l[face]] -= Lower[face];
00062        Diag[u[face]] -= Upper[face];
00063    }
00064 }

I think you can use this method and others from the same file to prepare your code.

Feel free to do more questions. Regards.

akimbrell August 8, 2011 01:12

Thank you for the bit of code, it was most helpful.

After further searching I came upon a sample solver on the openfoamwiki site called icoBlockedCellFoam which also does similar operations on the fvMatrix coefficients. Between your code and this other code I have been able to understand what the coefficients are doing within the matrix.

Fortunately I have also discovered that the method I am trying to implement does not in fact require me to operate on these coefficients directly - instead I can operate on the actual values of phi and U to obtain the needed results.

santiagomarquezd August 8, 2011 08:32

Austin, good to hear you managed the problem.

Best wishes with your thesis.


All times are GMT -4. The time now is 07:29.