|
[Sponsors] | |||||
|
|
|
#1 |
|
Member
Ronald McDonald
Join Date: Jul 2012
Posts: 36
Rep Power: 2 ![]() |
Dear openFoamers,
I'd like to add an implicit source term to my pde. It would look like this: HTML Code:
solve
(
Foam::fvm::laplacian(sigmaeff, phi) == -iagCell*((Foam::exp(alphaaa*F*(phiao-phi-EaEqgCell)/(Rg*T)))-(Foam::exp(-alphaca*F*(phiao-phi-EaEqgCell)/(Rg*T))))
);
I looked at OpenFoam documentation, specifically from this site: http://www.foamcfd.org/Nabla/guides/...sGuidese9.html And it talks about using Su, Sp, and SuSp. I would like to use those things but I'm not sure how to. In the documentation it talks about a rho and phi, where rho can either be a dimensioned scalar or a volscalarField, and phi is the volscalarfield. Now in my pde I do not know what rho would be. Also, I found another link talking about this: http://openfoamwiki.net/index.php/Ho...sport_equation Any help you, the community, could provide would be great! Sincerely, Benjamin |
|
|
|
|
|
|
|
|
#2 |
|
Senior Member
Lieven
Join Date: Dec 2011
Location: Mol, Belgium
Posts: 155
Rep Power: 4 ![]() |
Hi Benjamin,
If you do a incompressible simulation, rho is simply 1.0. Now, regarding your source term. The fact that it is inside the exponential function makes it impossible to included implicitly. This is only possible for linear systems. The closest you will probably get is something like Code:
fvm::Sp(exp(...)/phi,phi) Cheers, L |
|
|
|
|
|
|
|
|
#3 |
|
Member
Ronald McDonald
Join Date: Jul 2012
Posts: 36
Rep Power: 2 ![]() |
Dear openFoamers,
Thank you for your response, Lieven. I suppose I cannot implement an implicit source term in that manner, specifically using the Foam::fvm::Sp function of openFoam. Then I am stumped on how to implement the pde in openFoam. My equation with more clarity is attached to this file using Latex. where phi_e is the volscalarField and all others are either constant or independent of phi. When I put this equation into openFoam directly I get some funky results, incorrect as compared to similar simulations. Thus, I think it has to do with the phi on the right side of the equation and the equation as an implicit pde. Any help would be really great as I feel that this is my last and final hurdle to get my simulation running smoothly. Sincerely, Benjamin |
|
|
|
|
|
|
|
|
#4 |
|
Senior Member
Henrik Rusche
Join Date: Mar 2009
Location: Braunschweig, Niedersachsen, Germany
Posts: 262
Rep Power: 7 ![]() |
Dear Benjamin,
Yes, I am not surprised that you are having trouble with that source ... Did you try to underrelax? fvMatrix phiEqn ( fvm::laplacian(sigmaeff, phi) == -iagCell*((Foam::exp(alphaaa*F*(phiao-phi-EaEqgCell)/(Rg*T)))-(Foam::exp(-alphaca*F*(phiao-phi-EaEqgCell)/(Rg*T)))) ); phiEqn.relax(0.5); phiEqn.solve(); Make sure to b build/solve multiple times! I order to make it (more) implicit, you need to linearise your source term. There are many ways, but I suggest to use Picard's method. http://www.cfd-online.com/Wiki/Sourc..._linearization Once you get through the maths, the code will look volScalarField Sp = // derived equations volScalarField Sc = // derived equations fvMatrix phiEqn ( fvm::laplacian(sigmaeff, phi) == fvm::Sp(Sp, phi) + Sc ); phiEqn.relax(0.5); phiEqn.solve(); Best Regards, Henrik Last edited by henrik; May 1, 2013 at 10:14. |
|
|
|
|
|
|
|
|
#5 |
|
Member
Ronald McDonald
Join Date: Jul 2012
Posts: 36
Rep Power: 2 ![]() |
Dear openFoamers,
Thank you, Henrik, for your help. I am still trying to linearize but I have another idea. I would like to do the following: Etta = phiao - phi - EaEqgCell; If Etta > .5 then Etta = .5; Else Etta = phiao - phi -EaEqgCell; fvMatrix phiEqn ( fvm::laplacian(sigmaeff, phi) == -iagCell*((Foam::exp(alphaaa*F*(Etta)/(Rg*T)))-(Foam::exp(-alphaca*F*(Etta)/(Rg*T)))) ); phiEqn.relax(0.5); phiEqn.solve(); It's the if statement I am having trouble with. How would I do that in my solver? How to create an if statement? Sincerely, Benjamin |
|
|
|
|
|
|
|
|
#6 |
|
Senior Member
Henrik Rusche
Join Date: Mar 2009
Location: Braunschweig, Niedersachsen, Germany
Posts: 262
Rep Power: 7 ![]() |
Benjamin,
Did you try to underrelax? Did it make a difference? Having a switch is nasty - especially if you try to linearise. Anyway, the way to do it is to use the pos and neg functions. Alternatively, you can loop through the field cell by cell and use raw C++. Henrik |
|
|
|
|
|
|
|
|
#7 | |
|
Member
Ronald McDonald
Join Date: Jul 2012
Posts: 36
Rep Power: 2 ![]() |
Dear OpenFoamers,
Hi Henrik. I did try to underrelax and it didn't make a difference, I got an error right away. I did put an if-statement in and it ran without an error. However, it leads to another problem I have. Currently, my solver looks like this: HTML Code:
Info<< "\nCalculating concentration distribution\n" << endl;
while (simple.loop())
{
Info<< "Time = " << runTime.timeName() << nl << endl;
//**Add laplacians to all four species: O2, N2, H2O, H2
while (simple.correctNonOrthogonal())
{
#include "diffusion.H"
#include "partialpressure.H"
#include "equilibriumpotential.H"
#include "currentdensity.H"
#include "mapToCell.H"
#include "Etta.H"
#include "chargedensity.H"
#include "electricpotential.H"
}
//#include "mapFromCell.H"
#include "write.H"
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
<< " ClockTime = " << runTime.elapsedClockTime() << " s"
<< nl << endl;
}
Info<< "End\n" << endl;
return 0;
Now I think there is something going on with the "solve" command that allows openFoam to be able to get the old value and put it back into the equation. It seems like outside and BEFORE the solve equation it is not reading the old values back. But AFTER the solve equation it seems to work well. Now to my question: how do I read back the output of the solve equation, place it before my electricpotential.H file (so that I can edit it) and then place it back into my pde? In essence, I would like to see phi changing when I check on it BEFORE my solve equation of the pde. What do you, the community of openFoamers, think about this obfuscating situation? Sincerely, Benjamin Quote:
|
||
|
|
|
||
|
|
|
#8 |
|
Senior Member
Henrik Rusche
Join Date: Mar 2009
Location: Braunschweig, Niedersachsen, Germany
Posts: 262
Rep Power: 7 ![]() |
Benjamin,
underrelaxation MUST change the residuals - If they do not change, you are not under-relaxing! I am entirely sure that I understand what you are trying to do, but I will provide enough rope to you in order to hang yourself ![]() The solve statement writes the result into field it is operating on. If you put loops into your code, the explicit terms see the new (time) values. The idea here is to iterate until the (non-linear) system of equations converges. Of course, ddt() needs the old time values to function correctly and that's why they are stored automagically. You can retrieve them by calling .oldTime() on the field. Henrik |
|
|
|
|
|
![]() |
| Thread Tools | |
| Display Modes | |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| transient source term | strakakl | OpenFOAM | 22 | February 17, 2013 16:28 |
| funkySetFields compilation error | tayo | OpenFOAM | 39 | December 3, 2012 05:18 |
| Problem of SOURCE term gradient in UDS | wind | Fluent UDF and Scheme Programming | 4 | March 11, 2010 07:50 |
| Adding implicit source term to momentum equation | fs82 | OpenFOAM | 6 | September 23, 2009 03:29 |
| Compiling gmshFoam with OpenFOAM-1.5 | BlGene | Open Source Meshers: Gmsh, Netgen, CGNS, ... | 10 | August 6, 2009 04:26 |