[FLASH-USERS] ensuring div B = 0 when adjusting evolution

Joshua Wall joshua.e.wall at gmail.com
Tue May 30 18:48:57 EDT 2017


Klaus,

    Thanks for the clarification. Indeed, I tend to be a bit paranoid at
this point and do both Eos_wrapped and fill guard cells when I do these
type of changes. Also, thanks for catching my bad syntax on the guard cell
filling, I confess I was responding at the airport on my phone.

Cordially,

Josh

On Wed, May 31, 2017, 12:01 AM Klaus Weide <klaus at flash.uchicago.edu> wrote:

> On Fri, 26 May 2017, Joshua Wall wrote:
>
> > Hello Jon,
> >
> >      There's two ways to do the EOS update. One is to call Eos_wrapped at
> > the end of the block loop on each block you update as you go through the
> > loop. Make sure you pass which mode you want based on the variables you
> > updated, which here sounds like pressure and internal energy.
>
> That's usually the way to do it.
>
> > So that would
> > look something like:
> >
> >
> > do blk=1, numBlocks
> >
> > blockID = blockList(blk)
> >
> > call Grid_getBlkLimits(blockID, blkLimits, blkLimitsGC)
> >
> > call Grid_getBlkPtr(blockID, solnData)
> >    do i
> >      do j
> >        do k
> >
> >           solnData(DENS_VAR,i,j,k) = stuff
> >           solnData(EINT_VAR,i,j,k) = stuff
>
> To make sure the Eos_wrapped call below does not get confused,
> one should also modify ENER_VAR when modifying EINT_VAR.
> Usually by adding the same amount to both variables.
> (Even more variables should be modified if using 3T Hydro
> and Eos.)
>
> >
> >          end do
> >       end do
> >     end do
> >
> >     call Eos_wrapped(MODE_DENS_EI, blkLimits, blockID)
> >
> > end do
> >
> > The other way to do it is to:
> >
> >  call Grid_fillGuardCells(CENTER, ALL_DIR, LEAF, doEos=.true.,
> > eosMode=MODE_DENS_EI)
>
> 1. This call is not valid as written, or at least extremely confusing.
> I assume the "LEAF" is meant as a value for the (optional)
> "selectBlockType" dummy argument; if that is true, the call should be
> written as
>
> |  call Grid_fillGuardCells(CENTER, ALL_DIR, selectBlockType=LEAF,
> |   doEos=.true.,eosMode=MODE_DENS_EI)
>
> Otherwise the compiler will interpret it as ...,minLayers=LEAF,...,
> which is probably not intended.
>
> 1. This call does *not* apply the Eos to interior cells, but only to
> (some) guard cells. In some previous version of FLASH, the doEos may have
> applied to all cells (interior+guard), but that has not been the case
> for several releases. Now the Eos is only applied to guard cells that
> correspond to neighboring blocks at a different refinement.
>
> > This method ensures that whatever happens next, not only is the EOS
> updated
> > all values for each cell, *but also those values are valid in guard cells
> > on other processors*. I mention this method because using the Eos_wrapped
> > and forgetting to fill guard cells after has been a "gotcha" moment for
> me
> > in the past, and was a very tricky error to track down. But guard cell
> > filling is also expensive, so if you know its safe to not do it,
> > Eos_wrapped is the way to go.
>
> The general rule should be:
>
>  * call Eos_wrapped at the end of your code, if you have modified any
>    variables that could make the thermodynamic state inconsistent;
>  * call Grid_fillGuardCells at the beginning of your code if you need
>    to refer to any variables in guard cells - with or without doEos
>    depending on the needs of your code.
>
> unless you *really* understand the consequences of deviating from this
> convention.
>
> Klaus
>
-- 
Joshua Wall
Doctoral Candidate
Department of Physics
Drexel University
3141 Chestnut Street
Philadelphia, PA 19104
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://flash.rochester.edu/pipermail/flash-users/attachments/20170530/d7edf91f/attachment-0001.htm>


More information about the flash-users mailing list