> On Jun 12, 2015, at 10:03 PM, Peter Lichtner <[email protected]> wrote: > > Barry: here is an attempt to explain how variable switching works in pflotran > (we may need to iterate on this if it's not clear). I will consider as an > example the 2-phase, 3-component water-supercritical CO2 system. > > Any grid cell (we use finite volume) can exist in one of three possible > states: single-phase pure liquid water (l); single-phase pure supercritical > CO2 (g); or two-phase coexistence of water and supercritical CO2 (2ph). > > Each of these states is described by three independent (nonunique) state > variables. One possibility is: > > l: (p_l, T, X_CO2^l) > g: (p_g, T, X_CO2^g) > 2ph: (p_g, T, s_g) > > where p_l,g = liquid or gas pressure, T = temperature, and s_g = volume > fraction of pore space occupied by supercritical CO2. > > Where variable switching comes into play is when a grid cell undergoes a > phase change with the following possibilities: > > l -> 2ph > g -> 2ph > 2ph -> l > 2ph -> g > > Note that we do not include directly l <-> g. > > As a consequence different regions of space have different primary variables > the boundaries of which are changing with time along with the state variables. > > Line search is not feasible with the current implementation in petsc. > > After a completed time step or Newton iteration, the stability of the > solution in each grid cell must be checked for a change of phase. For > example, if the cell is in a 2 phase state, but the solution gives s_g > 1 or > s_g < 1,
Do you mean s_q < 0 or can s_g only be 1? > then a phase change occurs from 2ph -> g or 2ph -> l, respectively, and a > change of variables is necessary: > > (p_g, T, s_g) -> (p_l, T, X_CO2^l) > > or > > (p_g, T, s_g) -> (p_g, T, X_CO2^g) what is the formula for these change of variables? how/when do g and l go to 2p_h ? Thanks Barry > > …Peter > >> On Jun 12, 2015, at 18:14, Barry Smith <[email protected]> wrote: >> >> >> John, >> >> We can provide any Fortran stubs you need but before we do could you please >> outline to us (in algebraic notation; not in reference to PETSc code) how >> you plan to handle your "variable switching". That is, what is the problem >> being solved, what are the constraints, when do you need to switch variables >> etc? >> >> I would say everyone who has tried to do variable switching in PETSc before >> has failed because we (the PETSc developers) did not help them enough and >> understand what is needed in the Newton solver. I suspect we need to provide >> a bit more functionality in PETSc to make variable switching a success and >> I'd like to understand what that is and add it to the PETSc algorithms. Also >> if you know of any references that actually explain variable switching in >> detail, that would be great, all I've found are vague hand-wavy discussions >> that leave too many important details unexplained. >> >> Thanks >> >> Barry >> >>> On Jun 12, 2015, at 5:54 PM, John O'Sullivan <[email protected]> >>> wrote: >>> >>> Hi, >>> >>> We're working on changing variables during an SNES solve so that we can >>> handle phase changes. >>> >>> I'm looking into using SNESSetUpdate but there doesn't seem to be a fortran >>> interface. I get an error: >>> >>> Undefined symbols for architecture x86_64: >>> "_snessetupdate_", referenced from: >>> _MAIN__ in phaseChange.o >>> >>> I've looked in the interface files and can't find it either. I tried >>> writing one myself but things get a bit too complicated to guess... >>> >>> Can an interface be added please? >>> >>> Is this the best to do variable switching? If not where would be the right >>> place and are there Fortran interfaces? We will be changing from Pressure, >>> Temperature to Pressure, Saturation etc. But for now I'm just working on a >>> simple example code. >>> >>> Cheers >>> John >>> -- >>> Dr John O'Sullivan >>> Lecturer >>> Department of Engineering Science >>> University of Auckland, New Zealand >>> email: >>> jp.osullivan at auckland.ac.nz >>> >>> tel: +64 (0)9 923 85353 >>> >> >
