KratosMultiphysics
KRATOS Multiphysics (Kratos) is a framework for building parallel, multi-disciplinary simulation software, aiming at modularity, extensibility, and high performance. Kratos is written in C++, and counts with an extensive Python interface.
|
Variables | |
bool | do_simplifications = False |
Settings explanation DIMENSION TO COMPUTE: This symbolic generator is valid for both 2D and 3D cases. More... | |
string | dim_to_compute = "Both" |
string | linearisation = "Picard" |
bool | divide_by_rho = True |
bool | artificial_compressibility = True |
bool | asgs_stabilization = True |
string | mode = "c" |
list | dim_vector = [2] |
templatefile = open("embedded_ausas_navier_stokes_cpp_template.cpp") | |
Read the template file. More... | |
outstring = templatefile.read() | |
int | nnodes = 3 |
int | strain_size = 3 |
bool | impose_partion_of_unity = False |
N | |
DN | |
v = DefineMatrix('v',nnodes,dim) | |
Unknown fields definition. More... | |
vn = DefineMatrix('vn',nnodes,dim) | |
vnn = DefineMatrix('vnn',nnodes,dim) | |
p = DefineVector('p',nnodes) | |
pn = DefineVector('pn',nnodes) | |
pnn = DefineVector('pnn',nnodes) | |
w = DefineMatrix('w',nnodes,dim) | |
Test functions definition. More... | |
q = DefineVector('q',nnodes) | |
f = DefineMatrix('f',nnodes,dim) | |
Other data definitions. More... | |
C = DefineSymmetricMatrix('C',strain_size,strain_size) | |
Constitutive matrix definition. More... | |
stress = DefineVector('stress',strain_size) | |
Stress vector definition. More... | |
c = sympy.Symbol('c',positive= True) | |
Other simbols definition. More... | |
dt = sympy.Symbol('dt', positive = True) | |
rho = sympy.Symbol('rho', positive = True) | |
nu = sympy.Symbol('nu', positive = True) | |
mu = sympy.Symbol('mu', positive = True) | |
h = sympy.Symbol('h', positive = True) | |
dyn_tau = sympy.Symbol('dyn_tau', positive = True) | |
stab_c1 = sympy.Symbol('stab_c1', positive = True) | |
stab_c2 = sympy.Symbol('stab_c2', positive = True) | |
bdf0 = sympy.Symbol('bdf0') | |
Backward differences coefficients. More... | |
bdf1 = sympy.Symbol('bdf1') | |
bdf2 = sympy.Symbol('bdf2') | |
f_gauss = f.transpose()*N | |
Data interpolation to the Gauss points. More... | |
v_gauss = v.transpose()*N | |
vconv = DefineMatrix('vconv',nnodes,dim) | |
Convective velocity definition. More... | |
vmesh = DefineMatrix('vmesh',nnodes,dim) | |
vconv_gauss = vconv.transpose()*N | |
float | vconv_gauss_norm = 0.0 |
Compute the stabilization parameters. More... | |
float | tau1 = 1.0/((rho*dyn_tau)/dt + (stab_c2*rho*vconv_gauss_norm)/h + (stab_c1*mu)/(h*h)) |
tau2 = mu + (stab_c2*rho*vconv_gauss_norm*h)/stab_c1 | |
tuple | accel_gauss = (bdf0*v + bdf1*vn + bdf2*vnn).transpose()*N |
Compute the rest of magnitudes at the Gauss points. More... | |
p_gauss = p.transpose()*N | |
tuple | pder_gauss = (bdf0*p + bdf1*pn + bdf2*pnn).transpose()*N |
w_gauss = w.transpose()*N | |
q_gauss = q.transpose()*N | |
grad_w = DfjDxi(DN,w) | |
Gradients computation (fluid dynamics gradient) More... | |
grad_q = DfjDxi(DN,q) | |
grad_p = DfjDxi(DN,p) | |
grad_v = DfjDxi(DN,v) | |
grad_vconv = DfjDxi(DN,vconv) | |
div_w = div(DN,w) | |
div_v = div(DN,v) | |
div_vconv = div(DN,vconv) | |
grad_sym_v = grad_sym_voigtform(DN,v) | |
grad_w_voigt = grad_sym_voigtform(DN,w) | |
tuple | convective_term = (vconv_gauss.transpose()*grad_v) |
tuple | rv_galerkin = rho*w_gauss.transpose()*f_gauss - rho*w_gauss.transpose()*accel_gauss - rho*w_gauss.transpose()*convective_term.transpose() - grad_w_voigt.transpose()*stress + div_w*p_gauss + grad_q.transpose()*v_gauss |
Compute galerkin functional Navier-Stokes functional. More... | |
tuple | vel_residual = rho*f_gauss - rho*accel_gauss -rho*convective_term.transpose() - grad_p |
Stabilization functional terms Momentum conservation residual Note that the viscous stress term is dropped since linear elements are used. More... | |
mas_residual = -div_v | |
float | vel_subscale = tau1*vel_residual |
mas_subscale = tau2*mas_residual | |
float | rv_stab = grad_q.transpose()*vel_subscale |
tuple | rv = rv_galerkin + rv_stab |
Add the stabilization terms to the original residual terms. More... | |
dofs = sympy.zeros(nnodes*(dim+1), 1) | |
Define DOFs and test function vectors. More... | |
testfunc = sympy.zeros(nnodes*(dim+1), 1) | |
rhs = Compute_RHS(rv.copy(), testfunc, do_simplifications) | |
Compute LHS and RHS For the RHS computation one wants the residual of the previous iteration (residual based formulation). More... | |
rhs_out = OutputVector_CollectingFactors(rhs, "rhs", mode) | |
lhs = Compute_LHS(rhs, testfunc, dofs, do_simplifications) | |
lhs_out = OutputMatrix_CollectingFactors(lhs, "lhs", mode) | |
out = open("embedded_ausas_navier_stokes.cpp",'w') | |
Write the modified template. More... | |
tuple generate_embedded_ausas_navier_stokes_element.accel_gauss = (bdf0*v + bdf1*vn + bdf2*vnn).transpose()*N |
Compute the rest of magnitudes at the Gauss points.
bool generate_embedded_ausas_navier_stokes_element.artificial_compressibility = True |
bool generate_embedded_ausas_navier_stokes_element.asgs_stabilization = True |
generate_embedded_ausas_navier_stokes_element.bdf0 = sympy.Symbol('bdf0') |
Backward differences coefficients.
generate_embedded_ausas_navier_stokes_element.bdf1 = sympy.Symbol('bdf1') |
generate_embedded_ausas_navier_stokes_element.bdf2 = sympy.Symbol('bdf2') |
generate_embedded_ausas_navier_stokes_element.C = DefineSymmetricMatrix('C',strain_size,strain_size) |
Constitutive matrix definition.
generate_embedded_ausas_navier_stokes_element.c = sympy.Symbol('c',positive= True) |
Other simbols definition.
tuple generate_embedded_ausas_navier_stokes_element.convective_term = (vconv_gauss.transpose()*grad_v) |
string generate_embedded_ausas_navier_stokes_element.dim_to_compute = "Both" |
list generate_embedded_ausas_navier_stokes_element.dim_vector = [2] |
bool generate_embedded_ausas_navier_stokes_element.divide_by_rho = True |
generate_embedded_ausas_navier_stokes_element.DN |
bool generate_embedded_ausas_navier_stokes_element.do_simplifications = False |
Settings explanation DIMENSION TO COMPUTE: This symbolic generator is valid for both 2D and 3D cases.
Since the element has been programed with a dimension template in Kratos, it is advised to set the dim_to_compute flag as "Both". In this case the generated .cpp file will contain both 2D and 3D implementations. LINEARISATION SETTINGS: FullNR considers the convective velocity as "v-vmesh", hence v is taken into account in the derivation of the LHS and RHS. Picard (a.k.a. QuasiNR) considers the convective velocity as "a", thus it is considered as a constant in the derivation of the LHS and RHS. DIVIDE BY RHO: If set to true, divides the mass conservation equation by rho in order to have a better conditioned matrix. Otherwise the original form is kept. ARTIFICIAL COMPRESSIBILITY: If set to true, the time derivative of the density is introduced in the mass conservation equation together with the state equation dp/drho=c^2 (being c the sound velocity). Besides, the velocity divergence is not considered to be 0. These assumptions add some extra terms to the usual Navier-Stokes equations that are intended to act as a soft artificial compressibility, which is controlled by the value of "c". In the derivation of the residual equations the space variations of the density are considered to be close to 0.
Symbolic generation settings
generate_embedded_ausas_navier_stokes_element.dofs = sympy.zeros(nnodes*(dim+1), 1) |
Define DOFs and test function vectors.
generate_embedded_ausas_navier_stokes_element.dt = sympy.Symbol('dt', positive = True) |
generate_embedded_ausas_navier_stokes_element.dyn_tau = sympy.Symbol('dyn_tau', positive = True) |
generate_embedded_ausas_navier_stokes_element.f = DefineMatrix('f',nnodes,dim) |
Other data definitions.
generate_embedded_ausas_navier_stokes_element.f_gauss = f.transpose()*N |
Data interpolation to the Gauss points.
Gradients computation (fluid dynamics gradient)
generate_embedded_ausas_navier_stokes_element.h = sympy.Symbol('h', positive = True) |
bool generate_embedded_ausas_navier_stokes_element.impose_partion_of_unity = False |
generate_embedded_ausas_navier_stokes_element.lhs = Compute_LHS(rhs, testfunc, dofs, do_simplifications) |
generate_embedded_ausas_navier_stokes_element.lhs_out = OutputMatrix_CollectingFactors(lhs, "lhs", mode) |
string generate_embedded_ausas_navier_stokes_element.linearisation = "Picard" |
generate_embedded_ausas_navier_stokes_element.mas_residual = -div_v |
generate_embedded_ausas_navier_stokes_element.mas_subscale = tau2*mas_residual |
string generate_embedded_ausas_navier_stokes_element.mode = "c" |
generate_embedded_ausas_navier_stokes_element.mu = sympy.Symbol('mu', positive = True) |
generate_embedded_ausas_navier_stokes_element.N |
int generate_embedded_ausas_navier_stokes_element.nnodes = 3 |
generate_embedded_ausas_navier_stokes_element.nu = sympy.Symbol('nu', positive = True) |
generate_embedded_ausas_navier_stokes_element.out = open("embedded_ausas_navier_stokes.cpp",'w') |
Write the modified template.
generate_embedded_ausas_navier_stokes_element.outstring = templatefile.read() |
generate_embedded_ausas_navier_stokes_element.p = DefineVector('p',nnodes) |
generate_embedded_ausas_navier_stokes_element.p_gauss = p.transpose()*N |
tuple generate_embedded_ausas_navier_stokes_element.pder_gauss = (bdf0*p + bdf1*pn + bdf2*pnn).transpose()*N |
generate_embedded_ausas_navier_stokes_element.pn = DefineVector('pn',nnodes) |
generate_embedded_ausas_navier_stokes_element.pnn = DefineVector('pnn',nnodes) |
generate_embedded_ausas_navier_stokes_element.q = DefineVector('q',nnodes) |
generate_embedded_ausas_navier_stokes_element.q_gauss = q.transpose()*N |
generate_embedded_ausas_navier_stokes_element.rho = sympy.Symbol('rho', positive = True) |
generate_embedded_ausas_navier_stokes_element.rhs = Compute_RHS(rv.copy(), testfunc, do_simplifications) |
Compute LHS and RHS For the RHS computation one wants the residual of the previous iteration (residual based formulation).
By this reason the stress is included as a symbolic variable, which is assumed to be passed as an argument from the previous iteration database.
generate_embedded_ausas_navier_stokes_element.rhs_out = OutputVector_CollectingFactors(rhs, "rhs", mode) |
tuple generate_embedded_ausas_navier_stokes_element.rv = rv_galerkin + rv_stab |
Add the stabilization terms to the original residual terms.
tuple generate_embedded_ausas_navier_stokes_element.rv_galerkin = rho*w_gauss.transpose()*f_gauss - rho*w_gauss.transpose()*accel_gauss - rho*w_gauss.transpose()*convective_term.transpose() - grad_w_voigt.transpose()*stress + div_w*p_gauss + grad_q.transpose()*v_gauss |
Compute galerkin functional Navier-Stokes functional.
float generate_embedded_ausas_navier_stokes_element.rv_stab = grad_q.transpose()*vel_subscale |
generate_embedded_ausas_navier_stokes_element.stab_c1 = sympy.Symbol('stab_c1', positive = True) |
generate_embedded_ausas_navier_stokes_element.stab_c2 = sympy.Symbol('stab_c2', positive = True) |
int generate_embedded_ausas_navier_stokes_element.strain_size = 3 |
generate_embedded_ausas_navier_stokes_element.stress = DefineVector('stress',strain_size) |
Stress vector definition.
float generate_embedded_ausas_navier_stokes_element.tau1 = 1.0/((rho*dyn_tau)/dt + (stab_c2*rho*vconv_gauss_norm)/h + (stab_c1*mu)/(h*h)) |
generate_embedded_ausas_navier_stokes_element.templatefile = open("embedded_ausas_navier_stokes_cpp_template.cpp") |
Read the template file.
generate_embedded_ausas_navier_stokes_element.testfunc = sympy.zeros(nnodes*(dim+1), 1) |
generate_embedded_ausas_navier_stokes_element.v = DefineMatrix('v',nnodes,dim) |
Unknown fields definition.
generate_embedded_ausas_navier_stokes_element.v_gauss = v.transpose()*N |
generate_embedded_ausas_navier_stokes_element.vconv = DefineMatrix('vconv',nnodes,dim) |
Convective velocity definition.
generate_embedded_ausas_navier_stokes_element.vconv_gauss = vconv.transpose()*N |
generate_embedded_ausas_navier_stokes_element.vconv_gauss_norm = 0.0 |
Compute the stabilization parameters.
tuple generate_embedded_ausas_navier_stokes_element.vel_residual = rho*f_gauss - rho*accel_gauss -rho*convective_term.transpose() - grad_p |
Stabilization functional terms Momentum conservation residual Note that the viscous stress term is dropped since linear elements are used.
float generate_embedded_ausas_navier_stokes_element.vel_subscale = tau1*vel_residual |
generate_embedded_ausas_navier_stokes_element.vmesh = DefineMatrix('vmesh',nnodes,dim) |
generate_embedded_ausas_navier_stokes_element.vn = DefineMatrix('vn',nnodes,dim) |
generate_embedded_ausas_navier_stokes_element.vnn = DefineMatrix('vnn',nnodes,dim) |
generate_embedded_ausas_navier_stokes_element.w = DefineMatrix('w',nnodes,dim) |
Test functions definition.
generate_embedded_ausas_navier_stokes_element.w_gauss = w.transpose()*N |