Fast: Flexible Aerodynamic Solver Technolgy

Preamble

Fast is a common/front module for all Fast series solvers.

Fast is only available for use with the pyTree interface. You must import the module:

import Fast.PyTree as Fast

List of functions

– Actions

Fast.PyTree.setNum2Base(a, num)

Set numeric data dictionary in bases.

Fast.PyTree.setNum2Zones(a, num)

Set numeric data dictionary in zones.

Fast.PyTree.load([fileName, fileNameC, …])

Load tree and connectivity tree.

Fast.PyTree.save(t[, fileName, split, NP, …])

Save tree and connectivity tree.

Fast.PyTree.loadFile([fileName, split, …])

Load tree and connectivity tree.

Fast.PyTree.saveFile(t[, fileName, split, …])

Save tree in file.

Contents

Actions

Fast.PyTree.setNum2Base(a, numb)

Set the numb dictionary to bases. Exists also as in place version (_setNum2Base) that modifies a and returns None.

Parameters
  • a (Base, pyTree) – input data

  • numb (dictionary) – numerics for base

the keys of numb dictionary are:

Example of use:

# - setNum2Base (pyTree) -
import Converter.PyTree as C
import Converter.Internal as Internal
import Fast.PyTree as Fast

a = C.newPyTree(['Base'])

numb = { 'temporal_scheme': 'explicit',
         'ss_iteration': 30,
         'modulo_verif':20 }

Fast._setNum2Base(a, numb)
Internal.printTree(a)

Fast.PyTree.setNum2Zones(a, numz)

Set the numz dictionary to zones. Exists also as in place version (_setNum2Zones) that modifies a and returns None.

Parameters
  • a (Zone, Base, pyTree) – input data

  • numz (dictionary) – input data

the keys of numz dictionary are:

  • ‘scheme’: possible values are

  • ‘slope’: possible values are

  • ‘senseurType’: only valid for ‘senseur’ scheme. Possible values are

    • 0 : correction for speed only

    • 1 : correction for speed, density and pressure

  • ‘coef_hyper’: only valid for ‘senseur_hyper’ scheme. Possible values are

    • [coeff1, coeff2] (see pdf M. Lugrin)

    • default value are [0.009, 0.015]

  • ‘motion’: possible values are

  • ‘time_step’:

    • value of time step

    • default value is 1e-4

  • ‘time_step_nature’:

    • ‘global’

    • ‘local’

    • default value is ‘global’

  • ‘epsi_newton’:

    • newton stopping criteria on Loo norm

    • default value is 0.1

  • ‘inj1_newton_tol’:

    • Newton tolerence for BCinj1 inflow condition

    • default value is 1e-5

  • ‘inj1_newton_nit’:

    • Newton Iteration for BCinj1 inflow condition

    • default value is 10

  • ‘psiroe’:

    • Harten correction

    • default value is 0.1

  • ‘cfl’:

    • usefull only if ‘time_step_nature’=’local’

    • default value is 1

  • ‘model’: possible values are

    • ‘Euler’

    • ‘NSLaminar’

    • ‘NSTurbulent’(only Spalart available)

    • ‘LBMLaminar’

    • default value is ‘Euler’

  • ‘prandtltb’:

    • turbulent Prandtl number (only active for ‘model’=’NSTurbulent’)

    • default value is 0.92

  • ‘ransmodel’: possible values are

  • ‘DES’: possible values are

  • ‘DES_debug’: possible values are

    • “none”

    • “active” (save delta and fd functions in the FlowSolution#Centers node)

    • default value is ‘none’

  • ‘sgsmodel’: possible values are

    • “Miles” (ViscosityEddy==LaminarViscosity)

    • “smsm” (Selective Mixed Scale model, Lenormand et al, (2000), LES of sub and supersonic channel flow at moderate Re. Int. J. Numer. Meth. Fluids, 32: 369–406)

    • default value is ‘Miles’

  • ‘extract_res’: possible values are

    • 0

    • 1 (save div(F_Euler-F_viscous) in the FlowSolution#Centers node)

    • 2 (save dqdt + div(F_Euler-F_viscous) in the FlowSolution#Centers node)

    • default value is 0

  • ‘source’: possible values are

    • 0

    • 1 (read a source terme in the FlowSolution#Centers node. The conservative variables centers:Density_src, centers:MomentumX_src, centers:MomentumY_src, centers:MomentumZ_src and centers:EnergyStagnationDensity_src are used.)

    • default value is 0

  • ‘ratiom’:

    • cut-off max of mut/mu

    • default value is 10000.

Example of use:

# - setNum2Zones (pyTree) -
import Converter.PyTree as C
import Converter.Internal as Internal
import Fast.PyTree as Fast
import Generator.PyTree as G

a = G.cart((0,0,0), (1,1,1), (10,10,10) )
t = C.newPyTree(['Base', a])

numz = { 'scheme': 'ausmpred',
         'time_step_nature': 'global',
         'time_step': 0.001 }

Fast._setNum2Zones(t, numz)
Internal.printTree(t)

Fast.PyTree.load(fileName='t.cgns', fileNameC='tc.cgns', fileNameS='tstat.cgns', split='single')

Load computation tree t from file. Optionaly load tc (connectivity file) or tstat (statistics file). Returns also the graph as a dictionary {‘graphID’, ‘graphIBC’, ‘procDict’, ‘procList’}. If split=’single’, a single file is loaded. If split=’multiple’, mulitple file format is loaded (restart/restart_0.cgns, …).

Parameters
  • a (pyTree) – input data

  • fileName (string) – name of file for save

  • split (string) – ‘single’ or ‘multiple’

Returns

t, tc, ts, graph

Return type

tuple

# - load (pyTree) -
import Fast.PyTree as Fast
import Converter.PyTree as C
import Generator.PyTree as G
import Converter.Internal as Internal
import Connector.PyTree as X
import Converter.Mpi as Cmpi

# Create case
if Cmpi.rank == 0:
    a = G.cart((0,0,0),(1,1,1),(11,11,11))
    a = Cmpi.setProc(a,0)
    b = G.cart((10,0,0),(1,1,1),(11,11,11))
    b = Cmpi.setProc(b,1)
    t = C.newPyTree(['Base',a,b])
    
    t = X.connectMatch(t, dim=3)
    t = Internal.addGhostCells(t,t,2,adaptBCs=0)
    C.convertPyTree2File(t, 't.cgns')
    tc = C.node2Center(t)
    tc = X.setInterpData(t, tc, loc='centers', storage='inverse')
    C.convertPyTree2File(tc, 'tc.cgns')
Cmpi.barrier()

t,tc,ts,graph = Fast.load('t.cgns', 'tc.cgns', split='single')

#print(t)
#print(tc)
#print(ts)
#print('procDict = ', graph['procDict'])
#print('graphID = ', graph['graphID'])

Fast.PyTree.save(t, fileName='restart.cgns', split='single', temporal_scheme='implicit', NP=0)

Save computation tree t in file. If you run in mpi, NP must be the number of processor. If you run in seq mode, NP must be 0 or a negative number. If split=’single’, a single file is written. If split=’multiple’, different files are created depending on the proc number of each zone (restart/restart_0.cgns, …).

Parameters
  • a (pyTree) – input data

  • fileName (string) – name of file for save

  • split (string) – ‘single’ or ‘multiple’

  • NP (int) – number of processors

Example of use:

# - save (pyTree) -
import Fast.PyTree as Fast
import Converter.PyTree as C
import Generator.PyTree as G
import Converter.Mpi as Cmpi

a = G.cart((0,0,0),(1,1,1),(11,11,11))
a = Cmpi.setProc(a,0)
b = G.cart((10,0,0),(1,1,1),(11,11,11))
b = Cmpi.setProc(b,1)
t = C.newPyTree(['Base',a,b])
Fast.save(t, fileName='t.cgns', split='single', NP=0)

Fast.PyTree.loadFile(fileName='t.cgns', split='single', mpirun=False)

Load tree from file. The tree must be already distributed (with ‘proc’ nodes). The file can be a single CGNS file (“t.cgns”) or a splitted per processor CGNS file (“t/t_1.cgns”, “t/t_2.cgns”, …)

If you run in sequential mode, mpirun must be false. The function returns a full tree.

If you run in mpi mode, mpirun must be true. The function returns a partial tree on each processor.

Parameters
  • fileName (string) – name of file for load

  • split (string) – ‘single’ or ‘multiple’

  • mpirun (boolean) – true if python is run with mpirun

Returns

t

Return type

CGNS tree

# - loadFile (pyTree) -
import Fast.PyTree as Fast
import Converter.PyTree as C
import Generator.PyTree as G
import Converter.Mpi as Cmpi

# Save a file
a = G.cart((0,0,0),(1,1,1),(11,11,11))
a = Cmpi.setProc(a,0)
b = G.cart((10,0,0),(1,1,1),(11,11,11))
b = Cmpi.setProc(b,1)
t = C.newPyTree(['Base',a,b])
Fast.saveFile(t, fileName='t.cgns', split='single', mpirun=False)

# Load it back
Fast.loadFile(fileName='t.cgns', split='single', mpirun=False)

Fast.PyTree.saveFile(fileName='t.cgns', split='single', mpirun=False)

Save tree to file. The tree must be already distributed (with ‘proc’ nodes).

The file can be a single CGNS file (“t.cgns”) or a splitted per processor CGNS file (“t/t_1.cgns”, “t_2.cgns”, …)

If you run in seq mode, mpirun must be false.

If you run in mpi mode, mpirun must be true.

Parameters
  • fileName (string) – name of file for load

  • split (string) – ‘single’ or ‘multiple’

  • mpirun – true if python is run with mpirun

# - saveFile (pyTree) -
import Fast.PyTree as Fast
import Converter.PyTree as C
import Generator.PyTree as G
import Converter.Mpi as Cmpi

a = G.cart((0,0,0),(1,1,1),(11,11,11))
a = Cmpi.setProc(a,0)
b = G.cart((10,0,0),(1,1,1),(11,11,11))
b = Cmpi.setProc(b,1)
t = C.newPyTree(['Base',a,b])
Fast.saveFile(t, fileName='t.cgns', split='single', mpirun=False)