cape.cntl: Base module for CFD operations and processing¶
This module provides tools and templates for tools to interact with
various CFD codes and their input files. The base class is
cape.cfdx.cntl.Cntl, and the derivative classes include
cape.pycart.cntl.Cntl. This module creates folders for cases,
copies files, and can be used as an interface to perform most of the
tasks that Cape can accomplish except for running individual cases.
The control module is set up as a Python interface for thec master JSON file, which contains the settings to be used for a given CFD project.
The derivative classes are used to read input files, set up cases, submit and/or run cases, and be an interface for the various Cape options as they are customized for the various CFD solvers. The individualized modules are below.
- See also:
cape.cfdx.case
- class cape.cfdx.cntl.Cntl(fname=None)¶
Class to handle options, setup, and execution of CFD codes
- Call:
>>> cntl = cape.Cntl(fname="cape.json")
- Inputs:
- fname:
str Name of JSON settings file from which to read options
- fname:
- Outputs:
- cntl:
cape.cfdx.cntl.Cntl Instance of Cape control interface
- cntl.opts:
cape.cfdx.options.Options Options interface
- cntl.x:
cape.runmatrix.RunMatrix Run matrix interface
- cntl.RootDir:
str Working directory from which the class was generated
- cntl:
- Versions:
2015-09-20
@ddalle: Started2016-04-01
@ddalle: v1.0
- ApplyCases(**kw)¶
Reapply settings to one or more cases
- Call:
>>> cntl.ApplyCases(cons=[], j=None, extend=1, **kw)
- Inputs:
- Versions:
2016-12-12
@ddalle: v1.0
- ArchiveCase(i: int, test: bool = False)¶
Perform
--archivearchiving on one caseThere are no restrictions on the status of the case for this action.
- Call:
>>> cntl.CleanCase(i, test=False)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Instance of control interface
- i:
int Case index
- test:
True| {False} Log file/folder actions but don’t actually delete/copy
- cntl:
- Versions:
2024-09-18
@ddalle: v1.0
- ArchiveCases(**kw)¶
Archive completed cases and clean them up if specified
- Call:
>>> cntl.ArchiveCases() >>> cntl.ArchiveCases(cons=[], **kw)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Instance of overall control interface
- cons:
list[str] List of constraints
- I:
list[int] List of indices
- cntl:
- Versions:
2016-12-09
@ddalle: v1.02024-09-19
@ddalle: v2.0
- CaseFunction(i: int)¶
Run one or more functions at “prepare-case” hook
This function is executed at the beginning of
PrepareCase(i)().This is meant to serve as a filter if a user wants to change the settings for some subset of the cases. Using this function can change any setting, which can be dependent on the case i.
This calls the function(s) in the global
"CaseFunction"option from the JSON file. These functions must take cntl as an input and the case number i. The function(s) are usually from a module imported via the"Modules"option. See the following example:"Modules": ["testmod"], "CaseFunction": ["testmod.testfunc"]
This leads CAPE to call
testmod.testfunc(cntl, i)at the beginning ofPrepareCase()for each case i in the run matrix. The function is also called at the beginning ofApplyCase()ifpyfun --applyor similar is issued.- Call:
>>> cntl.CaseFunction(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall control interface
- i:
int Case number
- cntl:
- Versions:
2017-04-05
@ddalle: v1.0
- See also:
- CaseGetCurrentPhase()¶
Get the current phase number from the appropriate module
This function utilizes the
cape.cfdx.casemodule, and so it must be copied to the definition for each solver’s control class.- Call:
>>> j = cntl.CaseGetCurrentPhase()
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- cntl:
- Outputs:
- j:
int|None Phase number
- j:
- Versions:
2017-06-29
@ddalle: v1.02023-07-06
@ddalle: v1.1; useCaseRunner
- CheckBatch()¶
Check to see if we are running inside a batch job
This looks for environment variables to see if this is running inside a batch job. Currently supports slurm and PBS.
- Call:
>>> q = cntl.CheckBatch()
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- cntl:
- Outputs:
- jobid:
int 0if no batch environment was detected
- jobid:
- Versions:
2023-12-13
@dvicker: v1.02023-12-18
@ddalle: v1.1; debug
- CheckCase(i: int, v=False)¶
Check current status of case i
Because the file structure is different for each solver, some of this method may need customization. This customization, however, can be kept to the functions
cape.cfdx.casecntl.GetCurrentIter()andcape.cfdx.cntl.Cntl.CheckNone().- Call:
>>> n = cntl.CheckCase(i, v=False)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Index of the case to check (0-based)
- v:
True| {False} Verbose flag; prints messages if n is
None
- cntl:
- Outputs:
- n:
int|None Number of completed iterations or
Noneif not set up
- n:
- Versions:
2014-09-27
@ddalle: v1.02015-09-27
@ddalle: v2.0; generic2015-10-14
@ddalle: v2.1; nocasereq2017-02-22
@ddalle: v2.2; add verbose flag2023-11-06
@ddalle: v2.3; callsetx_i(i)
- CheckCaseStatus(i: int, jobs: dict | None = None, auto: bool = False, u: str | None = None, qstat: bool = True)¶
Determine the current status of a case
- Call:
>>> sts = cntl.CheckCaseStatus(i, jobs=None, **kw)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Index of the case to check (0-based)
- jobs:
dict Information on each job by ID number
- u:
str User name (defaults to process username)
- qstat: {
True} |False Option to call qstat/squeue to get job status
- cntl:
- Versions:
2014-10-04
@ddalle: v1.02014-10-06
@ddalle: v1.1; check queue status2023-12-13
@dvicker: v1.2; check for THIS_JOB2024-08-22
@ddalle: v1.3; add qstat
- CheckError(i)¶
Check if a case has a failure
- Call:
>>> q = cntl.CheckError(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Run index
- cntl:
- Outputs:
- q:
bool If
True, case hasFAILfile in it
- q:
- Versions:
2015-01-02
@ddalle: v1.0
- CheckFM(**kw)¶
Display missing force & moment components
- CheckLL(**kw)¶
Display missing line load components
- CheckNone(v=False)¶
Check if the current directory has the needed files to run
This function needs to be customized for each CFD solver so that it checks for the appropriate files.
- Call:
>>> q = cntl.CheckNone(v=False)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Cape control interface
- v:
True| {False} Verbose flag; prints message if q is
True
- cntl:
- Outputs:
- q:
`True| False` Whether or not case is missing files
- q:
- Versions:
2015-09-27
@ddalle: v1.02017-02-22
@ddalle: v1.1, verbosity option
- CheckPhase(i, v=False)¶
Check current phase number of run i
- Call:
>>> n = cntl.CheckPhase(i, v=False)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Index of the case to check (0-based)
- v:
True| {False} Verbose flag; prints messages if n is
None
- cntl:
- Outputs:
- j:
int|None Phase number
- j:
- Versions:
2017-06-29
@ddalle: v1.0
- CheckRunning(i)¶
Check if a case is currently running
- Call:
>>> q = cntl.CheckRunning(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Run index
- cntl:
- Outputs:
- q:
bool If
True, case hasRUNNINGfile in it
- q:
- Versions:
2014-10-03
@ddalle: v1.0
- CheckTriqFM(**kw)¶
Display missing TriqFM components
- CheckTriqPoint(**kw)¶
Display missing TriqPoint components
- CheckUsedPhase(i, v=False)¶
Check maximum phase number run at least once
- Call:
>>> j, n = cntl.CheckUsedPhase(i, v=False)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Index of the case to check (0-based)
- v:
True| {False} Verbose flag; prints messages if n is
None
- cntl:
- Outputs:
- Versions:
2017-06-29
@ddalle: v1.02017-07-11
@ddalle: v1.1, verbosity option
- CheckZombie(i)¶
Check a case for
ZOMBIEstatusA running case is declared a zombie if none of the listed files (by default
*.out) have been modified in the last 30 minutes. However, a case cannot be a zombie unless it contains aRUNNINGfile and returnsTruefromCheckRunning().- Call:
>>> q = cntl.CheckZombie(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Run index
- cntl:
- Outputs:
- q:
bool Trueif no listed files have been modified recently
- q:
- Versions:
2017-04-04
@ddalle: v1.02021-01-25
@ddalle: v1.1; use cls._zombie_files
- CleanCase(i: int, test: bool = False)¶
Perform
--cleanarchiving on one caseThere are no restrictions on the status of the case for this action.
- Call:
>>> cntl.CleanCase(i, test=False)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Instance of control interface
- i:
int Case index
- test:
True| {False} Log file/folder actions but don’t actually delete/copy
- cntl:
- Versions:
2024-09-18
@ddalle: v1.0
- CleanCases(**kw)¶
Clean a list of cases using Progress archive options only
- Call:
>>> cntl.CleanCases(**kw)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Instance of control interface
- cntl:
- Versions:
2017-03-13
@ddalle: v1.02024-09-18
@ddalle: v2.0
- CountQueuedCases(I=None, jobs=None, u=None, **kw) int¶
Count cases that have currently active PBS/Slurm jobs
- Call:
>>> n = cntl.CountQueuedCases(I=None, jobs=None, **kw)
- Inputs:
- Outputs:
- n:
int Number of running or queued jobs (not counting the job from which function is called, if applicable)
- n:
- Versions:
2024-01-12
@ddalle: v1.02024-01-17
@ddalle: v1.1; check for this_job
- CountRunningCases(I, jobs=None, u=None)¶
Count number of running cases via the batch system
Also print a status of the running jobs.
- Call:
>>> n = cntl.CountRunningCases(I, jobs=None, u=None)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- I:
list[int] List of indices
- jobs:
dict Information on each job by ID number
- u:
str User name (defaults to process username)
- cntl:
- Outputs:
- n:
int Number of running or queued jobs
- n:
- Versions:
2023-12-08
@dvicker: v1.0
- DeleteCase(i, **kw)¶
Delete a case
This function deletes a case’s PBS job and removes the entire directory. By default, the method prompts for user’s confirmation before deleting; set prompt to
Falseto delete without prompt.- Call:
>>> n = cntl.DeleteCase(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Cape control interface
- i:
int Index of the case to check (0-based)
- prompt: {
True} |False Whether or not to prompt user before deleting case
- cntl:
- Outputs:
- n:
0|1 Number of folders deleted
- n:
- Versions:
2018-11-20
@ddalle: v1.0
- Dezombie(**kw)¶
Clean up any ZOMBIE cases
- Call:
>>> cntl.Dezombie(**kw)
- Inputs:
- Versions:
2021-10-14
@ddalle: v1.0
- DisplayStatus(**kw)¶
Display current status for all cases
This prints case names, current iteration numbers, and so on. This is the function that is called when the user issues a system command like
cape -c.- Call:
>>> cntl.DisplayStatus(j=False)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- j:
bool Whether or not to display job ID numbers
- cons:
list[str] List of constraints like
'Mach<=0.5'
- cntl:
- Versions:
2014-10-04
@ddalle: v1.02014-12-09
@ddalle: v2.0,--cons
- ExecScript(**kw)¶
Execute a script in a given case folder
This function is the interface to command-line calls using the
-eflag, such aspycart -e 'ls -lh'.- Call:
>>> ierr = cntl.ExecScript(i, cmd)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Case index (0-based)
- cntl:
- Outputs:
- ierr:
None|int Exit status from the command
- ierr:
- Versions:
2016-08-26
@ddalle: v1.02024-12-09
@jfdiaz3:v1.1
- ExtendCase(i: int, n: int = 1, j: int | None = None, imax: int | None = None)¶
Add iterations to case i by repeating the last phase
- Call:
>>> cntl.ExtendCase(i, n=1, j=None, imax=None)
- Inputs:
- cntl:
cape.pyfun.cntl.Cntl CAPE main control instance
- i:
int Run index
- n: {
1} | positiveint Add n times steps to the total iteration count
- j: {
None} |int Optional phase to extend
- imax: {
None} | nonnegativeint Use imax as the maximum iteration count
- cntl:
- Versions:
2016-12-12
@ddalle: v1.02024-08-27
@ddalle: v2.0; move code toCaseRunner2024-09-28
@ddalle: v2.1; add j
- ExtendCases(**kw)¶
Extend one or more case by a number of iterations
By default, this applies to the final phase, but the phase number j can also be specified as input. The number of additional iterations is generally the nominal number of iterations that phase j would normally run.
- Call:
>>> cntl.ExtendCases(cons=[], extend=1, **kw)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Instance of overall control interface
- extend: {
True} | positiveint Extend phase j by extend nominal runs
- imax: {
None} |int Do not increase iteration number beyond imax
- j, phase: {
None} |int Optional index of phase to extend
- cons:
list[str] List of constraints
- I:
list[int] List of indices
- cntl:
- Versions:
2016-12-12
@ddalle: v1.0
- FilterUser(i, **kw)¶
Determine if case i is assigned to current user
- Call:
>>> q = cntl.FilterUser(i, **kw)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Index of the case to check (0-based)
- u, user:
str User name (default: executing process’s username) for comparing to run matrix
- cntl:
- Versions:
2017-07-10
@ddalle: v1.0
- GetCPUTime(i: int)¶
Read a CAPE-style core-hour file from a case
This function needs to be customized for each solver because it needs to know the name of the file in which timing data is saved. It defaults to
cape_time.dat. Modifying this command is a one-line fix with a call tocape.cfdx.cntl.Cntl.GetCPUTimeFromFile()with the correct file name.- Call:
>>> CPUt = cntl.GetCPUTime(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl CAPE control interface
- i:
int Case index
- cntl:
- Outputs:
- CPUt:
float|None Total core hours used in this job
- CPUt:
- Versions:
2015-12-22
@ddalle: v1.02016-08-30
@ddalle: v1.1; check forRUNNING2016-08-31
@ddalle: v1.2; useGetCPUTimeBoth2023-07-09
@ddalle: v2.0; useCaseRunner
- GetCaseIndex(frun: str) int | None¶
Get index of a case in the current run matrix
- Call:
>>> i = cntl.GetCaseIndex(frun)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Cape control interface
- frun:
str Name of case, must match exactly
- cntl:
- Outputs:
- i:
int|None Index of case with name frun in run matrix, if present
- i:
- Versions:
2024-08-15
@ddalle: v1.02024-10-16
@ddalle: v1.1; move toRunMatrix
- GetCurrentIter(i: int) int¶
Get the current iteration number (using
case)This function utilizes the
cape.cfdx.casemodule, and so it must be copied to the definition for each solver’s control class.- Call:
>>> n = cntl.GetCurrentIter(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Index of the case to check (0-based)
- cntl:
- Outputs:
- n:
int|None Number of completed iterations or
Noneif not set up
- n:
- Versions:
2015-10-14
@ddalle: v1.02023-07-07
@ddalle: v2.0; useCaseRunner
- GetLastIter(i)¶
Get minimum required iteration for a given case
- Call:
>>> nIter = cntl.GetLastIter(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Cape control interface
- i:
int Run index
- cntl:
- Outputs:
- nIter:
int Number of iterations required for case i
- nIter:
- Versions:
2014-10-03
@ddalle: v1.0
- GetPBSJobID(i: int) str | None¶
Get PBS job number if one exists
- Call:
>>> jobID = cntl.GetPBSJobID(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Run index
- cntl:
- Outputs:
- jobID:
None|str Most recent PBS/Slurm job name, if able
- jobID:
- Versions:
2014-10-06
@ddalle: v1.02024-01-12
@ddalle: v1.1; remove CheckCase() for speed
- GetPBSName(i: int) str¶
Get PBS name for a given case
- Call:
>>> lbl = cntl.GetPBSName(i, pre=None)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Run index
- pre: {
None} |str Prefix for PBS job name
- cntl:
- Outputs:
- lbl:
str Short name for the PBS job, visile via
qstat
- lbl:
- Versions:
2014-09-30
@ddalle: v1.02016-12-20
@ddalle: v1.1, moved to x
- GetPhaseBreaks()¶
Get expected iteration numbers at phase breaks
This fills in
0entries in RunControl PhaseIters and returns the filled-out list.- Call:
>>> PI = cntl.GetPhaseBreaks()
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Cape control interface
- cntl:
- Outputs:
- Versions:
2017-04-12
@ddalle: v1.0
- GetSurfCT_ExitArea(key, i, comp=None)¶
Get exit area for a CT trajectory key
This can use either the area ratio (if available) or calculate from the exit Mach number. The input area is determined from the component ID. If using the exit Mach number M2, the input Mach number M1 is also needed. The relationship between area ratio and exit Mach is given below.
\[\begin{split}\\frac{A_2}{A_1} = \\frac{M_1}{M_2}\\left( \\frac{1+\\frac{\\gamma-1}{2}M_2^2}{ 1+\\frac{\\gamma-1}{2}M_1^2} \\right) ^ {\\frac{1}{2}\\frac{\\gamma+1}{\\gamma-1}}\end{split}\]- Call:
>>> A2 = cntl.GetSurfCT_ExitArea(key, i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- key:
str Name of trajectory key to check
- i:
int Case number
- comp: {
None} |str Name of component for which to get BCs
- cntl:
- Outputs:
- Versions:
2016-04-13
@ddalle: v1.0
- GetSurfCT_ExitMach(key, i, comp=None)¶
Get exit Mach number for a CT trajectory key
This can use either the
"ExitMach"parameter (if available) or calculate from the area ratio. If using the area ratio, the input Mach number is also needed. The relationship between area ratio and exit Mach is given below.\[\frac{A_2}{A_1} = \frac{M_1}{M_2}\left( \frac{1+\frac{\gamma-1}{2}M_2^2}{ 1+\frac{\gamma-1}{2}M_1^2} \right) ^ {\frac{1}{2}\frac{\gamma+1}{\gamma-1}}\]- Call:
>>> M2 = cntl.GetSurfCT_ExitMach(key, i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- key:
str Name of trajectory key to check
- i:
int Case number
- comp: {
None} |str Name of component for which to get BCs
- cntl:
- Outputs:
- M2:
float Exit Mach number
- M2:
- Versions:
2016-04-13
@ddalle: v1.0
- GetSurfCT_RefArea(key, i)¶
Get reference area for surface CT trajectory key
This references the
"RefArea"parameter of the definition for the run matrix variable key. The user should set this parameter to1.0if thrust inputs are given as dimensional values.If this is
None, it returns the global reference area; if it is a string the reference area comes from the reference area for that component usingcntl.opts.get_RefArea(comp).- Call:
>>> Aref = cntl.GetSurfCT_RefArea(key, i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- key:
str Name of trajectory key to check
- i:
int Case number
- cntl:
- Outputs:
- Aref:
float Reference area for normalizing thrust coefficients
- Aref:
- Versions:
2016-04-13
@ddalle: v1.0
- ImportModules()¶
Import user-defined modules if specified in the options
All modules from the
"Modules"global option of the JSON file (cntl.opts["Modules"]) will be imported and saved as attributes of cntl. For example, if the user wants to use a module calleddac3, it will be imported as cntl.dac3. A noncomprehensive list of disallowed module names is below.DataBook, RootDir, jobs, opts, tri, x
The name of any method of this class is also disallowed. However, if the user wishes to import a module whose name is disallowed, he/she can use a dictionary to specify a different name to import the module as. For example, the user may import a module called
triasmytriusing the following JSON syntax."Modules": [{"tri": "mytri"}]
- Call:
>>> cntl.ImportModules()
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Instance of Cape control interface
- cntl:
- Versions:
2014-10-08
@ddalle: v1.0 (pycart)2015-09-20
@ddalle: v1.02022-04-12
@ddalle: v2.0; use self.modules
- InitFunction()¶
Run one or more functions a “initialization” hook
This calls the function(s) in the global
"InitFunction"option from the JSON file. These functions must take cntl as an input, and they are usually from a module imported via the"Modules"option. See the following example:"Modules": ["testmod"], "InitFunction": ["testmod.testfunc"]
This leads CAPE to call
testmod.testfunc(cntl).- Call:
>>> cntl.InitFunction()
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall control interface
- cntl:
- Versions:
2017-04-04
@ddalle: v1.02022-04-12
@ddalle: v2.0; use _exec_funclist()
- MarkERROR(**kw)¶
Mark one or more cases as ERROR and rewrite matrix
- Call:
>>> cntl.MarkERROR(**kw)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- I:
list[int] List of indices
- cons:
list[str] List of constraints like
'Mach<=0.5'- flag: {
"E"} |"e"|"ERROR"|"$E" Marker to use to denote status
- cntl:
- Versions:
2019-06-14
@ddalle: v1.0
- MarkPASS(**kw)¶
Mark one or more cases as PASS and rewrite matrix
- Call:
>>> cntl.MarkPASS(**kw)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- I:
list[int] List of indices
- cons:
list[str] List of constraints like
'Mach<=0.5'- flag: {
"p"} |"P"|"PASS"|"$p" Marker to use to denote status
- cntl:
- Versions:
2019-06-14
@ddalle: v1.0
- PrepareCase(i: int)¶
Prepare case for running if necessary
This function creates the folder, copies mesh files, and saves settings and input files. All of these tasks are completed only if they have not already been completed, and it needs to be customized for each CFD solver.
- Call:
>>> cntl.PrepareCase(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Index of case to analyze
- cntl:
- Versions:
2014-09-30
@ddalle: v1.02015-09-27
@ddalle: v2.0, convert to template
- PrepareConfig(i)¶
Apply rotations, translations, etc. to
Config.xml- Call:
>>> cntl.PrepareConfig(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Case index
- cntl:
- Versions:
2016-08-23
@ddalle: v1.0
- PrepareConfigFunction(key, i)¶
Apply special configuration modification function for a case
- Call:
>>> cntl.PrepareConfigFunction(key, i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- key:
str Name of key
- i:
int Index of the case to check (0-based)
- cntl:
- Versions:
2016-08-23
@ddalle: v1.02022-04-13
@ddalle: v2.0; exec_modfunction()
- PrepareConfigRotation(key, i)¶
Apply a rotation to a component or components
- Call:
>>> cntl.PrepareConfigRotation(key, i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- key:
str Name of the trajectory key
- i:
int Index of the case to check (0-based)
- cntl:
- Versions:
2016-08-23
@ddalle: v1.0
- PrepareConfigTranslation(key, i)¶
Apply a translation to a component or components
- Call:
>>> cntl.PrepareConfigTranslation(key, i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- key:
str Name of variable from which to get value
- i:
int Index of the case to check (0-based)
- cntl:
- Versions:
2016-08-23
@ddalle: v1.0
- PreparePoints(i)¶
Calculate the value of each named
"Point"for case i- Call:
>>> x = cntl.PreparePoints(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance Index of the case to check (0-based)
- cntl:
- Versions:
2022-03-07
@ddalle: v1.0
- PreparePointsRotation(key, i)¶
Apply a rotation to named config points for one col
- Call:
>>> cntl.PreparePointsRotation(key, i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- key:
str Name of the trajectory key
- i:
int Index of the case to check (0-based)
- cntl:
- Versions:
2022-03-07
@ddalle: v1.0
- PreparePointsTranslation(key, i)¶
Apply a translation to named config points for one col
- Call:
>>> cntl.PreparePointsTranslation(key, i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- key:
str Name of the trajectory key
- i:
int Index of the case to check (0-based)
- cntl:
- Versions:
2022-03-07
@ddalle: v1.0
- PrepareTri(i)¶
Rotate/translate/etc. triangulation for given case
- Call:
>>> cntl.PrepareTri(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Index of the case to check (0-based)
- cntl:
- Versions:
2014-12-01
@ddalle: v1.02016-04-05
@ddalle: v1.1, pycart -> cape
- PrepareTriFunction(key, i)¶
Apply special surf modification function for a case
- Call:
>>> cntl.PrepareTriFunction(key, i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- key:
str Name of key
- i:
int Index of the case to check (0-based)
- cntl:
- Versions:
2015-09-11
@ddalle: v1.02016-04-05
@ddalle: v1.1, pycart -> cape2022-04-13
@ddalle: v2.0; exec_modfunction()
- PrepareTriRotation(key, i)¶
Apply a rotation to a component or components
- Call:
>>> cntl.PrepareTriRotation(key, i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Index of the case to check (0-based)
- cntl:
- Versions:
2015-09-11
@ddalle: v1.02016-04-05
@ddalle: v1.1, pycart -> cape
- PrepareTriTranslation(key, i)¶
Apply a translation to a component or components
- Call:
>>> cntl.PrepareTriTranslation(key, i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Index of the case to check (0-based)
- cntl:
- Versions:
2015-09-11
@ddalle: v1.02016-04-05
@ddalle: v1.1, pycart -> cape
- ReadCaseRunner(i: int) CaseRunner¶
Read CaseRunner into slot
- Call:
>>> runner = cntl.ReadCaseRunner(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Index of the case to check (0-based)
- cntl:
- Outputs:
- runner:
CaseRunner Controller to run one case of solver
- runner:
- Versions:
2023-06-22
@ddalle: v1.0
- ReadConfig(f=False)¶
Read
Config.xmlor other surf configuration format- Call:
>>> cntl.ReadConfig(f=False)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- f:
True| {False} Option to reread existing cntl.config
- cntl:
- Versions:
2016-06-10
@ddalle: v1.02016-10-21
@ddalle: v2.0, addedConfig.json2020-09-01
@ddalle: v2.1, add f kwarg
- ReadDataBook(comp=None)¶
Read the current data book
- Call:
>>> cntl.ReadDataBook()
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl CAPE run matrix control instance
- cntl:
- Versions:
2016-09-15
@ddalle: v1.02023-05-31
@ddalle: v2.0; universalcape.cntl
- ReadDataBookPost()¶
Do
py{x}specific init actions after reading DataBook- Call:
>>> cntl.ReadDataBookPost()
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl CAPE run matrix control instance
- cntl:
- Versions:
2023-05-31
@ddalle: v1.0
- ReadFolderCaseRunner(fdir: str) CaseRunner¶
Read a
CaseRunnerfrom a folder by name- Call:
>>> runner = cntl.ReadFolderCaseRunner(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Index of the case to check (0-based)
- cntl:
- Outputs:
- runner:
CaseRunner Controller to run one case of solver
- runner:
- Versions:
2024-11-05
@ddalle: v1.0
- ReadReport(rep)¶
Read a report interface
- Call:
>>> R = cntl.ReadReport(rep)
- Inputs:
- cntl:
cape.pyfun.cntl.Cntl CAPE main control instance
- rep:
str Name of report
- cntl:
- Outputs:
- R:
pyFun.report.Report Report interface
- R:
- Versions:
2018-10-19
@ddalle: Version 1.0
- ReadTri()¶
Read initial triangulation file(s)
- Call:
>>> cntl.ReadTri()
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- cntl:
- Versions:
2014-08-30
@ddalle: v1.0
- RevertOptions()¶
Revert to cntl.opts0 as working options
- Call:
>>> cntl.ResetOptions()
- Inputs:
- cntl:
Cntl CAPE solver control interface
- cntl:
- Versions:
2021-07-31
@ddalle: v1.0
- SaveOptions()¶
Copy cntl.opts and store it as cntl.opts0
- Call:
>>> cntl.SaveOptions()
- Inputs:
- cntl:
Cntl CAPE solver control interface
- cntl:
- Versions:
2021-07-31
@ddalle: v1.0
- SkeletonCase(i: int, test: bool = False)¶
Perform
--skeletonarchiving on one caseThere are no restrictions on the status of the case for this action.
- Call:
>>> cntl.SkeletonCase(i, test=False)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Instance of control interface
- i:
int Case index
- test:
True| {False} Log file/folder actions but don’t actually delete/copy
- cntl:
- Versions:
2024-09-18
@ddalle: v1.0
- SkeletonCases(**kw)¶
Archive completed cases and delete all but a few files
- Call:
>>> cntl.SkeletonCases() >>> cntl.SkeletonCases(cons=[], **kw)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Instance of overall control interface
- cons:
list[str] List of constraints
- I:
list[int] List of indices
- cntl:
- Versions:
2016-12-14
@ddalle: v1.02024-09-19
@ddalle: v2.0
- StartCase(i: int)¶
Start a case by either submitting it or running it
This function checks whether or not a case is submittable. If so, the case is submitted via
cape.cfdx.queue.pqsub(), and otherwise the case is started using a system call.Before starting case, this function checks the folder using
cape.cfdx.cntl.CheckCase(); if this function returnsNone, the case is not started. Actual starting of the case is done usingCaseStartCase(), which has a specific version for each CFD solver.- Call:
>>> pbs = cntl.StartCase(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Index of the case to check (0-based)
- cntl:
- Outputs:
- pbs:
int|None PBS job ID if submitted successfully
- pbs:
- Versions:
2014-10-06
@ddalle: v1.02023-06-27
@ddalle: v2.0; use CaseRunner
- StopCase(i: int)¶
Stop a case if running
This function deletes a case’s PBS job and removes the
RUNNINGfile if it exists.- Call:
>>> cntl.StopCase(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Cape control interface
- i:
int Index of the case to check (0-based)
- cntl:
- Versions:
2014-12-27
@ddalle: v1.02023-06-27
@ddalle: v2.0; useCaseRunner
- SubmitBatchPBS(argv)¶
Write a PBS script for a batch run
- SubmitJobs(**kw)¶
Check jobs and prepare or submit jobs if necessary
- Call:
>>> cntl.SubmitJobs(**kw)
- Inputs:
- Versions:
2014-10-05
@ddalle: v1.02014-12-09
@ddalle: v2.0,--cons2021-08-01
@ddalle: v2.1, save/revert options2023-05-17
@ddalle: v2.2,opts.setx_i()
- UnarchiveCases(**kw)¶
Unarchive a list of cases
- Call:
>>> cntl.UnarchiveCases(**kw)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Instance of control interface
- cntl:
- Versions:
2017-03-13
@ddalle: v1.02023-10-20
@ddalle: v1.1; arbitrary-depth frun2024-09-20
@ddalle: v2.0; use CaseArchivist
- UnmarkCase(**kw)¶
Remove PASS or ERROR marking from one or more cases
- Call:
>>> cntl.UnmarkCase(**kw)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- I:
list[int] List of indices
- cons:
list[str] List of constraints like
'Mach<=0.5'
- cntl:
- Versions:
2019-06-14
@ddalle: v1.0
- UpdateCaseProp(**kw)¶
Update generic-property databook for one or more comp
- UpdateDBPyFunc(**kw)¶
Update Python function databook for one or more comp
- UpdateFM(**kw)¶
Collect force and moment data
- Call:
>>> cntl.UpdateFM(cons=[], **kw)
- Inputs:
- Versions:
2014-12-12
@ddalle: v1.0- 2014-12-22
@ddalle: v2.0 Complete rewrite of DataBook class
Eliminate “Aero” class
- 2014-12-22
2017-04-25
@ddalle: v2.1, add wildcards2018-10-19
@ddalle: v3.0, rename from Aero()
- UpdateLL(**kw)¶
Update one or more line load data books
- Call:
>>> cntl.UpdateLL(ll=None, **kw)
- Inputs:
- Versions:
2016-06-07
@ddalle: v1.02016-12-21
@ddalle: v1.1, Add pbs flag- 2017-04-25
@ddalle: v1.2 Removed pbs
Added
--delete
- 2017-04-25
- UpdateTS(**kw)¶
Update one or more time series data books
- Call:
>>> cntl.UpdateTS(ts=None, **kw)
- Inputs:
- Versions:
2016-06-07
@ddalle: v1.02016-12-21
@ddalle: v1.1, Add pbs flag- 2017-04-25
@ddalle: v1.2 Removed pbs
Added
--delete
- 2017-04-25
- UpdateTriqFM(**kw)¶
Update one or more TriqFM data books
- UpdateTriqPoint(**kw)¶
Update one or more TriqPoint point sensor data books
- WriteCaseJSON(i: int, rc: RunControlOpts | None = None)¶
Write JSON file with run control settings for case i
- Call:
>>> cntl.WriteCaseJSON(i, rc=None)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Generic control class
- i:
int Run index
- rc: {
None} |dict If specified, write specified “RunControl” options
- cntl:
- Versions:
2015-10-19
@ddalle: v1.02023-03-31
@ddalle: v2.0; manual options input2023-08-29
@ddalle: v2.1; call sample_dict()2024-08-24
@ddalle: v2.2; use CaseRunner
- WriteConditionsJSON(i, rc=None)¶
Write JSON file with run matrix settings for case i
- Call:
>>> cntl.WriteConditionsJSON(i, rc=None)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Generic control class
- i:
int Run index
- rc: {
None} |dict If specified, write specified “RunControl” options
- cntl:
- Versions:
2021-09-08
@ddalle: v1.0
- WritePBS(i: int)¶
Write the PBS script(s) for a given case
- Call:
>>> cntl.WritePBS(i)
- Inputs:
- cntl:
cape.pyfun.cntl.Cntl CAPE main control instance
- i:
int Run index
- cntl:
- Versions:
2014-10-19
@ddalle: v1.02023-10-20
@ddalle: v1.1; arbitrary frun depth2024-08-01
@ddalle: v2.0; solver-agnostic
- WritePBSHeader(fp: IOBase, i: int | None = None, j: int = 0, typ: str | None = None, wd: str | None = None)¶
Write common part of PBS or Slurm script
- Call:
>>> cntl.WritePBSHeader(fp, i=None, j=0, typ=None, wd=None)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- fp:
IOBase Open file handle
- i: {
None} |int Case index (ignore if
None); used for PBS job name- j:
int Phase number
- typ: {
None} |"batch"|"post" Group of PBS options to use
- wd: {
None} |str Folder to enter when starting the job
- cntl:
- Versions:
2015-09-30
@ddalle: v1.0, fork WritePBS()2016-09-25
@ddalle: v1.1, “BatchPBS”- 2016-12-20
@ddalle: v1.2 Consolidated to opts
Added prefix
- 2016-12-20
- 2024-08-15
@ddalle: v1.3 Use cntl.opts.name as prefix
User-controlled job name length, longer default
- 2024-08-15
- cli(*a, **kw)¶
Command-line interface to
cape- Call:
>>> cntl.cli(*a, **kw)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- kw:
dict[True|False|str] Unprocessed keyword arguments
- cntl:
- Outputs:
- cmd:
None|str Name of command that was processed, if any
- cmd:
- Versions:
2018-10-19
@ddalle: v1.0
- cli_cape(*a, **kw)¶
Common command-line interface
This function is applied after the command-line arguments are parsed using
cape.argread.readflagstar()and the control interface has already been read according to the-fflag.- Call:
>>> cmd = cntl.cli_cape(*a, **kw)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- kw:
dict Preprocessed command-line keyword arguments
- cntl:
- Outputs:
- cmd:
None|str Name of command that was processed, if any
- cmd:
- Versions:
2018-10-19
@ddalle: v1.02023-06-21
@aburkhea: v1.1; add –report options
- cli_preprocess(*a, **kw)¶
Preprocess command-line arguments and flags/keywords
- Call:
>>> a, kw = cntl.cli_preprocess(*a, **kw)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- kw:
dict[True|False|str] Command-line keyword arguments and flags
- cntl:
- Outputs:
- Versions:
2018-10-19
@ddalle: v1.0
- exec_modfunction(funcname: str, a=None, kw=None, name=None)¶
Execute a function from cntl.modules
- Call:
>>> v = cntl.exec_modfunction(funcname, a, kw, name=None)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall control interface
- func:
str Name of function to execute, e.g.
"mymod.myfunc"- a: {
None} |tuple Positional arguments to called function
- kw: {
None} |dict Keyworkd arguments to called function
- name: {
None} |str Hook name to use in status update
- cntl:
- Outputs:
- v: any
Output from execution of function
- Versions:
2022-04-12
@ddalle: v1.0
- get_pbs_jobs(force: bool = False, jobs: dict | None = None, u: str | None = None, qstat: bool = True)¶
Get dictionary of current jobs active by one user
- Call:
>>> jobs = cntl.get_pbs_jobs(force=False, **kw)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- force:
True| {False} Query current queue even if cntl.jobs exists
- jobs: {
None} |dict Preexisting PBS/Slurm job information
- u: {
None} |str User name (defaults to process username)
- cntl:
- Outputs:
- jobs:
dict Information on each job by ID number
- jobs:
- Versions:
2024-01-12
@ddalle: v1.02024-08-22
@ddalle: v1.1; add qstat option
- init_post()¶
Do
py{x}specific initialization actions- Call:
>>> cntl.init_post()
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl CAPE run matrix control instance
- cntl:
- Versions:
2023-05-31
@ddalle: v1.0
- make_case_folder(i: int)¶
Create folder(s) if needed for case i
- Call:
>>> cntl.make_case_folder(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- i:
int Index of case to analyze
- cntl:
- Versions:
2023-08-25
@ddalle: v1.0 (CreateFolder)2023-10-20
@ddalle: v2.0; support arbitrary depth
- mkdir(fdir: str)¶
Make a directory with the correct permissions
- Call:
>>> cntl.mkdir(fdir)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- fdir:
str Directory to create
- cntl:
- Versions:
2015-09-27
@ddalle: v1.0
- preprocess_kwargs(kw: dict)¶
Preprocess command-line arguments and flags/keywords
This will effect the following CLI options:
- --cons CONS
Comma-separated constraints split into a list
- -x FPY
Each
-xargument is executed (can be repeated)- -I INDS
Convert INDS like
3-6,8to[3, 4, 5, 8]
- Call:
>>> opts = cntl.cli_preprocess(*a, **kw)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Overall CAPE control instance
- kw:
dict[True|False|str] CLI keyword arguments and flags, modified in-place
- cntl:
- Versions:
2024-12-19
@ddalle: v1.0
- read_case_json(i)¶
Read
case.jsonfile from case i if possible- Call:
>>> rc = cntl.read_case_json(i)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl Instance of control class
- i:
int Case index
- cntl:
- Outputs:
- rc:
None|dict Run control interface read from
case.jsonfile
- rc:
- Versions:
2016-12-12
@ddalle: v1.02017-04-12
@ddalle: v1.1; add tocape.cfdx2023-06-29
@ddalle: v2.0; use _case_mod2023-07-07
@ddalle: v2.1; use CaseRunner
- read_options(fjson: str)¶
Read options using appropriate class
This allows users to set warning mode via an environment variable.
- Call:
>>> cntl.read_options(fjson)
- Inputs:
- cntl:
cape.cfdx.cntl.Cntl CAPE run matrix control instance
- fjson:
str Name of JSON file to read
- cntl:
- Versions:
2023-05-26
@ddalle: v1.0; forked from __init__()2023-12-13
@ddalle: v1.1; add RootDir and JSONFile
- class cape.cfdx.cntl.UgridCntl(fname=None)¶
Subclass of
Cntlfor unstructured-mesh solvers- Call:
>>> cntl = UgridCntl(fname=None)
- Inputs:
- fname: {
None} |str Name of main CAPE input (JSON) file
- fname: {
- Outputs:
- cntl:
UgridCntl Run matrix control instance for unstructured-mesh solver
- cntl:
- GetProcessedMeshFileNames()¶
Return the list of mesh files that are written
- GetProjectRootName(j: int = 0) str¶
Get the project root name
The JSON file overrides the value from the namelist file if appropriate
- PrepareMesh(i: int)¶
Prepare the mesh for case i if necessary
- Call:
>>> cntl.PrepareMesh(i)
- Inputs:
- cntl:
cape.pyfun.cntl.Cntl Instance of control class
- i:
int Case index
- cntl:
- Versions:
2015-10-19
@ddalle: v1.0 (pyfun)2024-11-04
@ddalle: v1.3 (pyfun)2024-11-07
@ddalle: v1.0
- ProcessMeshFileName(fname: str, fproj: str | None = None) str¶
Return a mesh file name using the project root name
- Call:
>>> fout = cntl.ProcessMeshFileName(fname, fproj=None)
- Inputs:
- Outputs:
- fout:
str Name of file name using project name as prefix
- fout:
- Versions:
2016-04-05
@ddalle: v1.0 (pyfun)2023-03-15
@ddalle: v1.1; add fproj2024-10-22
@ddalle: v2.0; move tocfdx
- cape.cfdx.cntl.run_rootdir(func)¶
Decorator to run a function within a specified folder
- Call:
>>> func = run_rootdir(func)
- Wrapper Signature:
>>> v = cntl.func(*a, **kw)
- Inputs:
- Versions:
2018-11-20
@ddalle: v1.02020-02-25
@ddalle: v1.1: better exceptions2023-06-16
@ddalle: v1.2; usefinally