cape.pyover.dataBook: pyOver data book module

This module contains functions for reading and processing forces, moments, and other statistics from cases in a trajectory. Data books are usually created by using the cape.pyover.cntl.Cntl.ReadDataBook() function.

# Read OVERFLOW control instance
cntl = pyOver.Cntl("pyOver.json")
# Read the data book
cntl.ReadDataBook()
# Get a handle
DB = cntl.DataBook

# Read a line load component
DB.ReadLineLoad("CORE_LL")
DBL = DB.LineLoads["CORE_LL"]
# Read a target
DB.ReadTarget("t97")
DBT = DB.Targets["t97"]

Data books can be created without an overall control structure, but it requires creating a run matrix object using cape.pyover.runmatrix.RunMatrix, so it is a more involved process.

Data book modules are also invoked during update and reporting command-line calls.

$ pyfun --aero
$ pyfun --ll
$ pyfun --triqfm
$ pyfun --report

The available components mirror those described on the template data book modules, cape.cfdx.dataBook, cape.cfdx.lineLoad, and cape.cfdx.pointSensor. However, some data book types may not be implemented for all CFD solvers.

See Also:
class cape.pyover.dataBook.CaseFM(proj, comp)

This class contains methods for reading data about an the history of an individual component for a single case. It reads the Tecplot file $proj_fm_$comp.dat where proj is the lower-case root project name and comp is the name of the component. From this file it determines which coefficients are recorded automatically.

Call:
>>> FM = pyOver.dataBook.CaseFM(proj, comp)
Inputs:
proj: str

Root name of the project

comp: str

Name of component to process

Outputs:
FM: pyOver.dataBook.FM

Instance of the force and moment class

FM.C: list[str]

List of coefficients

FM.i: numpy.ndarray shape=(0,)

List of iteration numbers

FM.CA: numpy.ndarray shape=(0,)

Axial force coefficient at each iteration

FM.CY: numpy.ndarray shape=(0,)

Lateral force coefficient at each iteration

FM.CN: numpy.ndarray shape=(0,)

Normal force coefficient at each iteration

FM.CLL: numpy.ndarray shape=(0,)

Rolling moment coefficient at each iteration

FM.CLM: numpy.ndarray shape=(0,)

Pitching moment coefficient at each iteration

FM.CLN: numpy.ndarray shape=(0,)

Yaw moment coefficient at each iteration

Versions:
  • 2016-02-02 @ddalle: First version

GetFomocoInfo(fname, comp)

Get basic stats about an OVERFLOW fomoco file

Call:
>>> ic, nc, ni = FM.GetFomocoInfo(fname, comp)
Inputs:
FM: pyOver.dataBook.CaseFM

Force and moment iterative history

fname: str

Name of file to query

comp: str

Name of component to find

Outputs:
ic: int | None

Index of component in the list of components

nc: int | None

Number of components

ni: int

Number of iterations

Versions:
  • 2016-02-03 @ddalle: First version

MakeEmpty(n=0)

Create empty CaseFM instance

Call:
>>> FM.MakeEmpty()
Inputs:
FM: pyOver.dataBook.CaseFM

Case force/moment history

Versions:
  • 2016-02-03 @ddalle: First version

ReadFomocoData(fname, ic, nc, ni, n0=0)

Read data from a FOMOCO file with known indices and size

Call:
>>> FM.ReadFomocoData(fname, ic, nc, ni, n0)
Inputs:
FM: pyOver.dataBook.CaseFM

Force and moment history

fname: str

Name of fomoco file

ic: int

Index of FM.comp in list of components in fname

nc: int

Number of components in fname

ni: int

Number of iterations in fname

n0: int

Number of iterations already read into FM.data

Versions:
  • 2016-02-03 @ddalle: First version

SaveAttributes()

Save columns of FM.data as named attributes

Call:
>>> FM.SaveAttributes()
Inputs:
FM: pyOver.dataBook.CaseFM

Case force/moment history

Versions:
  • 2016-02-03 @ddalle: First version

class cape.pyover.dataBook.CaseResid(proj)

OVERFLOW iterative residual history class

This class provides an interface to residuals for a given case by reading the files resid.out, resid.tmp, run.resid, turb.out, species.out, etc.

Call:
>>> H = pyOver.dataBook.CaseResid(proj)
Inputs:
proj: str

Project root name

Outputs:
H: pyOver.databook.CaseResid

Instance of the residual histroy class

Versions:
  • 2016-02-03 @ddalle: Started

GetNOrders(nStats=1)

Get the number of orders of magnitude of residual drop

Call:
>>> nOrders = hist.GetNOrders(nStats=1)
Inputs:
hist: pyCart.dataBook.CaseResid

Instance of the DataBook residual history

nStats: int

Number of iterations to use for averaging the final residual

Outputs:
nOrders: float

Number of orders of magnitude of residual drop

Versions:
  • 2015-01-01 @ddalle: First versoin

PlotL2(n=None, nFirst=None, nLast=None, **kw)

Plot the L2 residual

Call:
>>> h = hist.PlotL2(n=None, nFirst=None, nLast=None, **kw)
Inputs:
hist: cape.cfdx.dataBook.CaseResid

Instance of the DataBook residual history

n: int

Only show the last n iterations

nFirst: int

Plot starting at iteration nStart

nLast: int

Plot up to iteration nLast

FigWidth: float

Figure width

FigHeight: float

Figure height

Outputs:
h: dict

Dictionary of figure/plot handles

Versions:
  • 2014-11-12 @ddalle: First version

  • 2014-12-09 @ddalle: Moved to AeroPlot

  • 2015-02-15 @ddalle: Transferred to dataBook.Aero

  • 2015-03-04 @ddalle: Added nStart and nLast

  • 2015-10-21 @ddalle: Referred to PlotResid()

ReadGlobalHist(fname)

Read a condensed global residual file for faster read times

Call:
>>> i, L = H.ReadGlobalHist(fname)
Inputs:
H: pyOver.dataBook.CaseResid

Iterative residual history class

i: numpy.ndarray (:class:

Versions:
  • 2016-02-04 @ddalle: First version

ReadGlobalL2(grid=None)

Read entire global L2 history

The file history.L2.dat is also updated.

Call:
>>> H.ReadGlobalL2(grid=None)
Inputs:
H: pyOver.dataBook.CaseResid

Iterative residual history class

grid: {None} | int | str

If used, read only one grid

Versions:
  • 2016-02-04 @ddalle: First version

  • 2017-04-19 @ddalle: Added grid option

ReadGlobalLInf(grid=None)

Read entire L-infinity norm history

The file history.LInf.dat is also updated

Call:
>>> H.ReadGlobalLInf(grid=None)
Inputs:
H: pyOver.dataBook.CaseResid

Iterative residual history class

grid: {None} | int | str

If used, read only one grid

Versions:
  • 2016-02-06 @ddalle: First version

  • 2017-04-19 @ddalle: Added grid option

ReadResidGlobal(fname, coeff='L2', n=None, grid=None)

Read a global residual using numpy.loadtxt() from one file

Call:
>>> i, L2 = H.ReadResidGlobal(fname, coeff="L2", **kw)
>>> i, LInf = H.ReadResidGlobal(fname, coeff="LInf", **kw)
Inputs:
H: pyOver.dataBook.CaseResid

Iterative residual history class

fname: str

Name of file to process

coeff: str

Name of coefficient to read

n: {None} | int

Number of last iteration that’s already processed

grid: {None} | int | str

If used, read only one grid

Outputs:
i: np.ndarray[float]

Array of iteration numbers

L2: np.ndarray[float]

Array of weighted global L2 norms

LInf: np.ndarray[float]

Array of global L-infinity norms

Versions:
  • 2016-02-04 @ddalle: First version

  • 2017-04-19 @ddalle: Added grid option

ReadResidGrid(fname, grid=None, coeff='L2', n=None)

Read a global residual using numpy.loadtxt() from one file

Call:
>>> i, L2 = H.ReadResidGrid(fname, grid=None, coeff="L2", **kw)
>>> i, LInf = H.ReadResidGrid(fname, grid=None, coeff="LInf", **kw)
Inputs:
H: pyOver.dataBook.CaseResid

Iterative residual history class

fname: str

Name of file to process

grid: {None} | int | str

If used, read history of a single grid

coeff: str

Name of coefficient to read

n: int | None

Number of last iteration that’s already processed

Outputs:
i: np.ndarray[float]

Array of iteration numbers

L2: np.ndarray[float]

Array of weighted global L2 norms

LInf: np.ndarray[float]

Array of global L-infinity norms

Versions:
  • 2017-04-19 @ddalle: First version

ReadSpeciesResidL2(grid=None)

Read the global L2 norm of the species equations

The file history.species.L2.dat is also updated

Call:
>>> H.ReadSpeciesResidL2(grid=None)
Inputs:
H: pyOver.dataBook.CaseResid

Iterative residual history class

grid: {None} | int | str

If used, read only one grid

Versions:
  • 2016-02-06 @ddalle: First version

  • 2017-04-19 @ddalle: Added grid option

ReadSpeciesResidLInf(grid=None)

Read the global L-infinity norm of the species equations

The file history.species.LInf.dat is also updated

Call:
>>> H.ReadSpeciesResidLInf(grid=None)
Inputs:
H: pyOver.dataBook.CaseResid

Iterative residual history class

grid: {None} | int | str

If used, read only one grid

Versions:
  • 2016-02-06 @ddalle: First version

  • 2017-04-19 @ddalle: Added grid option

ReadTurbResidL2(grid=None)

Read the entire L2 norm of the turbulence residuals

The file history.turb.L2.dat is also updated

Call:
>>> H.ReadTurbResidL2(grid=None)
Inputs:
H: pyOver.dataBook.CaseResid

Iterative residual history class

grid: {None} | int | str

If used, read only one grid

Versions:
  • 2016-02-06 @ddalle: First version

  • 2017-04-19 @ddalle: Added grid option

ReadTurbResidLInf(grid=None)

Read the global L-infinity norm of the turbulence residuals

The file history.turb.LInf.dat is also updated

Call:
>>> H.ReadTurbResidLInf()
Inputs:
H: pyOver.dataBook.CaseResid

Iterative residual history class

grid: {None} | int | str

If used, read only one grid

Versions:
  • 2016-02-06 @ddalle: First version

  • 2017-04-19 @ddalle: Added grid option

WriteGlobalHist(fname, i, L, n=None)

Write a condensed global residual file for faster read times

Call:
>>> H.WriteGlobalHist(fname, i, L, n=None)
Inputs:
H: pyOver.dataBook.CaseResid

Iterative residual history class

i: np.ndarray (float | int)

Vector of iteration numbers

L: np.ndarray[float]

Vector of residuals to write

n: int | None

Last iteration already written to file.

Versions:
  • 2016-02-04 @ddalle: First version

class cape.pyover.dataBook.DBComp(comp, cntl, targ=None, check=False, lock=False, **kw)

Individual component data book

This class is derived from cape.cfdx.dataBook.DBBase.

Call:
>>> DBc = DBComp(comp, x, opts)
Inputs:
comp: str

Name of the component

x: pyOver.runmatrix.RunMatrix

RunMatrix for processing variable types

opts: pyOver.options.Options

Global pyCart options instance

targ: {None} | str

If used, read a duplicate data book as a target named targ

Outputs:
DBc: pyOver.dataBook.DBComp

An individual component data book

Versions:
  • 2016-09-15 @ddalle: First version

class cape.pyover.dataBook.DBTarget(targ, x, opts, RootDir=None)

Class to handle data from data book target files. There are more constraints on target files than the files that data book creates, and raw data books created by pyCart are not valid target files.

Call:
>>> DBT = DBTarget(targ, x, opts)
Inputs:
targ: pyOver.options.DataBook.DBTarget

Instance of a target source options interface

x: pyOver.runmatrix.RunMatrix

Run matrix interface

opts: pyOver.options.Options

Global pyCart options instance to determine which fields are useful

Outputs:
DBT: pyOver.dataBook.DBTarget

Instance of the pyCart data book target data carrier

Versions:
  • 2014-12-20 @ddalle: Started

class cape.pyover.dataBook.DBTriqFM(x, opts, comp, **kw)

Force and moment component extracted from surface triangulation

Call:
>>> DBF = DBTriqFM(x, opts, comp, RootDir=None)
Inputs:
x: cape.runmatrix.RunMatrix

RunMatrix/run matrix interface

opts: cape.options.Options

Options interface

comp: str

Name of TriqFM component

RootDir: {None} | st

Root directory for the configuration

Outputs:
DBF: pyFun.dataBook.DBTriqFM

Instance of TriqFM data book

Versions:
  • 2017-03-28 @ddalle: First version

GetTriqFile()

Get most recent triq file and its associated iterations

Call:
>>> qpre, fq, n, i0, i1 = DBF.GetTriqFile()
Inputs:
DBL: pyOver.dataBook.DBTriqFM

Instance of TriqFM data book

Outputs:
qpre: {False}

Whether or not to convert file from other format

fq: str

Name of q file

n: int

Number of iterations included

i0: int

First iteration in the averaging

i1: int

Last iteration in the averaging

Versions:
  • 2016-12-19 @ddalle: Added to the module

PreprocessTriq(fq, **kw)

Perform any necessary preprocessing to create triq file

Call:
>>> ftriq = DBF.PreprocessTriq(fq, qpbs=False, f=None)
Inputs:
DBL: pyOver.dataBook.DBTriqFM

TriqFM data book

ftriq: str

Name of q file

qpbs: True | {False}

Whether or not to create a script and submit it

f: {None} | file

File handle if writing PBS script

Versions:
  • 2016-12-20 @ddalle: First version

  • 2016-12-21 @ddalle: Added PBS

ReadTriq(ftriq)

Read a triq annotated surface triangulation

Call:
>>> DBF.ReadTriq(ftriq)
Inputs:
DBF: pyOver.dataBook.DBTriqFM

Instance of TriqFM data book

ftriq: str

Name of triq file

Versions:
  • 2017-03-29 @ddalle: First version

class cape.pyover.dataBook.DataBook(cntl, RootDir=None, targ=None, **kw)

This class provides an interface to the data book for a given CFD run matrix.

Call:
>>> DB = pyFun.dataBook.DataBook(x, opts)
Inputs:
x: pyFun.runmatrix.RunMatrix

The current pyFun trajectory (i.e. run matrix)

opts: pyFun.options.Options

Global pyFun options instance

Outputs:
DB: pyFun.dataBook.DataBook

Instance of the pyFun data book class

Versions:
  • 2015-10-20 @ddalle: Started

GetCurrentIter()

Determine iteration number of current folder

Call:
>>> n = DB.GetCurrentIter()
Inputs:
DB: pyOver.dataBook.DataBook

Instance of data book class

Outputs:
n: int | None

Iteration number

Versions:
  • 2017-04-13 @ddalle: First separate version

ReadCaseFM(comp)

Read a CaseFM object

Call:
>>> FM = DB.ReadCaseFM(comp)
Inputs:
DB: cape.cfdx.dataBook.DataBook

Instance of data book class

comp: str

Name of component

Outputs:
FM: pyOver.dataBook.CaseFM

Residual history class

Versions:
  • 2017-04-13 @ddalle: First separate version

ReadCaseResid()

Read a CaseResid object

Call:
>>> H = DB.ReadCaseResid()
Inputs:
DB: cape.cfdx.dataBook.DataBook

Instance of data book class

Outputs:
H: pyOver.dataBook.CaseResid

Residual history class

Versions:
  • 2017-04-13 @ddalle: First separate version

ReadDBComp(comp, check=False, lock=False)

Initialize data book for one component

Call:
>>> DB.ReadDBComp(comp, check=False, lock=False)
Inputs:
DB: pyCart.dataBook.DataBook

Instance of the pyCart data book class

comp: str

Name of component

check: True | {False}

Whether or not to check LOCK status

lock: True | {False}

If True, wait if the LOCK file exists

Versions:
  • 2015-11-10 @ddalle: First version

  • 2016-06-27 @ddalle: Added targ keyword

  • 2017-04-13 @ddalle: Self-contained and renamed

ReadPointSensor(name)

Read a point sensor group if it is not already present

Call:
>>> DB.ReadPointSensor(name)
Inputs:
DB: pyOver.dataBook.DataBook

Instance of the pycart data book class

name: str

Name of point sensor group

Versions:
  • 2015-12-04 @ddalle: Copied from pyCart

ReadTriqFM(comp, check=False, lock=False)

Read a TriqFM data book if not already present

Call:
>>> DB.ReadTriqFM(comp)
Inputs:
DB: pyOver.dataBook.DataBook

Instance of pyOver data book class

comp: str

Name of TriqFM component

check: True | {False}

Whether or not to check LOCK status

lock: True | {False}

If True, wait if the LOCK file exists

Versions:
  • 2017-03-29 @ddalle: First version

cape.pyover.dataBook.ImportPyPlot()

Import matplotlib.pyplot if not loaded

Call:
>>> pyOver.dataBook.ImportPyPlot()
Versions:
  • 2014-12-27 @ddalle: First version

  • 2016-01-02 @ddalle: Copied from pyCart

cape.pyover.dataBook.ReadFomocoComps(fname)

Get list of components in an OVERFLOW fomoco file

Call:
>>> comps = pyOver.dataBook.ReadFomocoComps(fname)
Inputs:
fname: str

Name of the file to read

Outputs:
comps: list[str]

List of components

Versions:
  • 2016-02-03 @ddalle: First version

cape.pyover.dataBook.ReadFomocoNIter(fname, nComp=None)

Get number of iterations in an OVERFLOW fomoco file

Call:
>>> nIter = pyOver.dataBook.ReadFomocoNIter(fname)
>>> nIter = pyOver.dataBook.ReadFomocoNIter(fname, nComp)
Inputs:
fname: str

Name of file to read

nComp: int | None

Number of components in each record

Outputs:
nIter: int

Number of iterations in the file

Versions:
  • 2016-02-03 @ddalle: First version

cape.pyover.dataBook.ReadResidFirstIter(fname)

Read the first iteration number in an OVERFLOW residual file

Call:
>>> iIter = pyOver.dataBook.ReadResidFirstIter(fname)
>>> iIter = pyOver.dataBook.ReadResidFirstIter(f)
Inputs:
fname: str

Name of file to query

f: file

Already opened file handle to query

Outputs:
iIter: int

Iteration number from first line

Versions:
  • 2016-02-04 @ddalle: First version

cape.pyover.dataBook.ReadResidGrids(fname)

Get list of grids in an OVERFLOW residual file

Call:
>>> grids = pyOver.dataBook.ReadResidGrids(fname)
Inputs:
fname: str

Name of file to read

Outputs:
grids: list[str]

List of grids

Versions:
  • 2016-02-04 @ddalle: First version

cape.pyover.dataBook.ReadResidLastIter(fname)

Read the first iteration number in an OVERFLOW residual file

Call:
>>> nIter = pyOver.dataBook.ReadResidLastIter(fname)
>>> nIter = pyOver.dataBook.ReadResidLastIter(f)
Inputs:
fname: str

Name of file to query

f: file

Already opened file handle to query

Outputs:
nIter: int

Iteration number from last line

Versions:
  • 2016-02-04 @ddalle: First version

cape.pyover.dataBook.ReadResidNGrids(fname)

Get number of grids from an OVERFLOW residual file

Call:
>>> nGrid = pyOver.dataBook.ReadResidNGrids(fname)
Inputs:
fname: str

Name of file to read

Outputs:
nGrid: int

Number of grids

Versions:
  • 2016-02-04 @ddalle: First version

cape.pyover.dataBook.ReadResidNIter(fname)

Get number of iterations in an OVERFLOW residual file

Call:
>>> nIter = pyOver.dataBook.ReadResidNIter(fname)
Inputs:
fname: str

Name of file to query

Outputs:
nIter: int

Number of iterations

Versions:
  • 2016-02-04 @ddalle: Version 1.0

  • 2022-01-09 @ddalle: Version 1.1; Python 3 int division