7#ifndef KERNEL_ASSEMBLY_BURGERS_CARREAU_ASSEMBLY_JOB_HPP 
    8#define KERNEL_ASSEMBLY_BURGERS_CARREAU_ASSEMBLY_JOB_HPP 1 
   10#include <kernel/assembly/base.hpp> 
   11#include <kernel/assembly/asm_traits.hpp> 
   12#include <kernel/cubature/dynamic_factory.hpp> 
   13#include <kernel/lafem/dense_vector.hpp> 
   14#include <kernel/lafem/sparse_matrix_bcsr.hpp> 
   15#include <kernel/lafem/dense_vector_blocked.hpp> 
   16#include <kernel/global/vector.hpp> 
  103    template<
typename DataType_, 
typename Space_, 
typename ConvVector_>
 
  156      DataType_ 
mu_inf, mu_0, lambda, n, a, reg_eps;
 
  187        lambda(DataType_(0.)),
 
  190        reg_eps(DataType_(1e-100))
 
  203      template<
typename IndexType_, 
int conv_dim_>
 
  206        const auto* vals = convect.
elements();
 
  207        DataType_ r = DataType_(0);
 
  225      template<
typename LocalVector_, 
typename Mirror_>
 
  228        const auto* gate = convect.
get_gate();
 
  241      template<
typename VectorType_>
 
  273    template<
typename Job_, 
typename DataType_>
 
  295      static constexpr int conv_dim = ConvVectorType::BlockSize;
 
  331      const bool need_diff, need_conv, need_conv_frechet, need_reac, need_streamdiff, need_carreau, need_carreau_frechet;
 
  334      DataType_ 
mu_inf, mu_0, lambda, n, a, reg_eps;
 
  414        need_carreau(job_.carreau),
 
  415        need_carreau_frechet(job_.frechet_carreau),
 
  421        reg_eps(job_.reg_eps),
 
  425        need_loc_grad_v(need_conv_frechet || need_carreau),
 
  426        need_mean_v(need_streamdiff),
 
  427        need_local_h(need_streamdiff),
 
  433        cubature_rule(Cubature::ctor_factory, job_.cubature_factory),
 
  478        if(need_mean_v || need_local_h || need_streamdiff)
 
  529        if(
need_loc_v || need_conv || need_streamdiff)
 
  538        if(need_loc_grad_v || need_conv_frechet || need_carreau)
 
  566          nu_loc = this->mu_inf + (this->mu_0 - this->
mu_inf) * 
Math::pow((DataType_(1.0)
 
  567                                          + 
Math::pow(this->lambda * this->gamma_dot, this->a)), (this->n-
DataType(1.0)) / this->a);
 
  612    template<
typename Job_, 
typename DataType_, 
int block_size_>
 
  619      typedef DataType_ DataType;
 
  663              const DataType 
value = this->nu_loc * weight * 
Tiny::dot(this->
space_data.phi[i].grad, this->space_data.phi[j].grad);
 
  684            if(this->need_carreau_frechet)
 
  686              const DataType_ mu_prime = (this->mu_0 - this->
mu_inf) * ((this->n-DataType_(1.0)) / this->a) *
 
  688                this->a * this->lambda * 
Math::pow(this->lambda * this->gamma_dot, this->a-DataType(1.0));
 
  689              const DataType fac =  mu_prime / (this->gamma_dot + this->reg_eps);
 
  729        if(this->need_conv_frechet)
 
  800        for(
int point(0); point < this->
cubature_rule.get_num_points(); ++point)
 
  837    template<
typename Matrix_, 
typename Space_, 
typename ConvVector_ = 
typename Matrix_::VectorTypeR>
 
  851      static_assert(Matrix_::BlockHeight == Matrix_::BlockWidth, 
"only square matrix blocks are supported here");
 
  876        const Space_& space_, 
const String& cubature_name) :
 
  877        BaseClass(conv_vector, space_, cubature_name),
 
  932    template<
typename Vector_, 
typename Space_, 
typename ConvVector_ = Vector_>
 
  976        const ConvVector_& conv_vector, 
const Space_& space_, 
const String& cubature_name) :
 
  977        BaseClass(conv_vector, space_, cubature_name),
 
  981        XASSERTM(&rhs_vector_ != &sol_vector_, 
"rhs and solution vectors must not be the same object");
 
  983        XASSERTM((
void*)&rhs_vector_ != (
void*)&conv_vector, 
"rhs and convection vectors must not be the same object");
 
 1022        void prepare(
const Index cell)
 
 1029            this->local_sol_dofs.
format();
 
 1046                this->local_vector[i].add_mat_vec_mult(this->local_matrix(i,j), this->local_sol_dofs[j]);
 
 1052                this->local_vector[i].add_mat_vec_mult(this->local_matrix(i,j), this->
local_conv_dofs[j]);
 
 1089    template<
typename Job_, 
typename DataType_>
 
 1096      typedef DataType_ DataType;
 
 1138              local_matrix[i][j] += this->nu_loc * weight
 
 1153              local_matrix[i][j] += this->
beta * weight
 
 1168              local_matrix[i][j] += this->
theta * weight
 
 1207        for(
int point(0); point < this->
cubature_rule.get_num_points(); ++point)
 
 1244    template<
typename Matrix_, 
typename Space_, 
typename ConvVector_>
 
 1277        const Space_& space_, 
const String& cubature_name) :
 
 1278        BaseClass(conv_vector, space_, cubature_name),
 
 1333    template<
typename Vector_, 
typename Space_, 
typename ConvVector_>
 
 1374        const ConvVector_& conv_vector, 
const Space_& space_, 
const String& cubature_name) :
 
 1375        BaseClass(conv_vector, space_, cubature_name),
 
 1379        XASSERTM(&rhs_vector_ != &sol_vector_, 
"rhs and solution vectors must not be the same object");
 
 1415        void prepare(
const Index cell)
 
 1420          this->local_sol_dofs.
format();
 
 1430          this->local_vector.
format();
 
 1433              this->local_vector[i] += this->local_matrix(i,j) * this->local_sol_dofs[j];
 
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
Common single-space assembly traits class template.
TrafoType::template Evaluator< ShapeType, DataType >::Type TrafoEvaluator
trafo evaluator type
SpaceEvaluator::template ConfigTraits< space_config >::EvalDataType SpaceEvalData
space evaluation data types
Intern::CubatureTraits< TrafoEvaluator >::RuleType CubatureRuleType
cubature rule type
SpaceType::TrafoType TrafoType
trafo type
SpaceType::DofMappingType DofMapping
dof-mapping types
TrafoEvaluator::template ConfigTraits< trafo_config >::EvalDataType TrafoEvalData
trafo evaluation data type
SpaceType::template Evaluator< TrafoEvaluator >::Type SpaceEvaluator
space evaluator types
Base class for Burgers Careau assembly jobs.
static DataType calc_sd_v_norm(const Global::Vector< LocalVector_, Mirror_ > &convect)
Calculates the convection field norm  for the streamline diffusion parameter delta_T.
DataType_ sd_nu
viscosity parameter nu_S for streamline diffusion (usually equal to nu)
const Space_ & space
the test-/trial-space to be used
Space_ SpaceType
the space type
DataType_ theta
scaling parameter for reactive operator M
DataType_ nu
scaling parameter for diffusive operator L (aka viscosity)
Cubature::DynamicFactory cubature_factory
the cubature factory to use
DataType_ beta
scaling parameter for convective operator K
BurgersCarreauAssemblyJobBase(const ConvVector_ &conv_vector, const Space_ &space_, const String &cubature)
Constructor.
const ConvVector_ & convection_vector
the convection vector to be used
bool frechet_carreau
Assemble full Jacobian for Carreau?
DataType_ sd_delta
scaling parameter for streamline diffusion stabilization operator S
DataType_ frechet_beta
scaling parameter for Frechet derivative of convective operator K'
DataType_ mu_inf
Carreau Data Parameter.
static DataType calc_sd_v_norm(const LAFEM::DenseVectorBlocked< DataType_, IndexType_, conv_dim_ > &convect)
Calculates the convection field norm  for the local streamline diffusion parameter delta_T.
DataType_ sd_v_norm
velocity norm for streamline diffusion
bool deformation
specifies whether to use the deformation tensor
ConvVector_ ConvVectorType
the convection vector type
void set_sd_v_norm(const VectorType_ &convect)
Sets the convection field norm  for the local streamline diffusion parameter delta_T.
DataType_ DataType
the datatype we use here
bool carreau
Assemble Carreau coefficient?
Base class for Burgers assembly tasks.
const DataType frechet_beta
scaling parameter for Frechet derivative of convective operator K'
AsmTraits::DofMapping dof_mapping
the space dof-mapping
Job_::ConvVectorType ConvVectorType
the convection vector type
static constexpr int max_local_dofs
maximum number of local dofs
const bool deformation
specifies whether to use the deformation tensor
const DataType sd_v_norm
velocity norm for streamline diffusion
void finish()
Finishes the assembly on the current cell.
AsmTraits::TrafoEvaluator trafo_eval
the trafo evaluator
const DataType sd_delta
scaling parameter for streamline diffusion stabilization operator S
const DataType beta
scaling parameter for convective operator K
AsmTraits::SpaceEvaluator space_eval
the space evaluator
static constexpr bool need_combine
this task doesn't need to combine
DataType_ DataType
the data type to be used by the assembly
const bool need_diff
keep track what we need to assemble
const DataType theta
scaling parameter for reactive operator M
void combine()
Finalizes the assembly.
Tiny::Vector< DataType, shape_dim > barycenter
reference element barycenter
void prepare(const Index cell)
Prepares the assembly task for a cell/element.
Job_::SpaceType SpaceType
the space type
DataType local_h
local mesh width for streamline diffusion
Tiny::Vector< DataType, conv_dim > loc_v
local convection field value
const DataType tol_eps
tolerance for checks == 0: sqrt(eps)
Tiny::Vector< Tiny::Vector< DataType, conv_dim >, max_local_dofs > local_conv_dofs
local convection field dofs
Tiny::Matrix< DataType, conv_dim, conv_dim > strain_rate_tensor_2
strain rate tensor
AsmTraits::SpaceEvalData space_data
the space evaluation data
ConvVectorType::GatherAxpy gather_conv
convection vector gather-axpy object
AsmTraits::TrafoEvalData trafo_data
the trafo evaluation data
AsmTraits1< DataType, SpaceType, TrafoTags::jac_det, SpaceTags::value|SpaceTags::grad > AsmTraits
our assembly traits
const AsmTraits::TrafoType & trafo
the cubature factory used for integration
const SpaceType & space
the test-/trial-space to be used
const DataType sd_nu
viscosity parameter nu_S for streamline diffusion (usually equal to nu)
static constexpr int conv_dim
the convection vector dimension
const Job_ & job
a reference to our job object
bool need_loc_v
enable computation of certain quantities
int num_local_dofs
actual number of local dofs on current element
static constexpr bool need_scatter
this task needs to scatter
AsmTraits::CubatureRuleType cubature_rule
the cubature rule used for integration
Tiny::Vector< DataType, max_local_dofs > streamdiff_coeffs
local streamline diffusion coefficients
BurgersCarreauAssemblyTaskBase(const Job_ &job_)
Constructor.
DataType local_delta
local delta for streamline diffusion
static constexpr int shape_dim
the shape dimension
DataType_ gamma_dot
Some local data needed for Carreau.
Tiny::Matrix< DataType, conv_dim, conv_dim > loc_grad_v
local convection field gradient
DataType_ mu_inf
Carreau Data Parameter.
const DataType nu
scaling parameter for diffusive operator L (aka viscosity)
void prepare_point(int cubature_point)
Prepares the task for a cubature point.
Base class for blocked Burgers Carreau assembly tasks.
static constexpr int max_local_dofs
maximum number of local dofs
BurgersCarreauBlockedAssemblyTaskBase(const Job_ &job_)
Constructor.
void assemble_burgers_point(const DataType weight)
Assembles the Burger operator in a single cubature point.
void assemble()
Performs the assembly of the local matrix.
void assemble_streamline_diffusion(const DataType weight)
Assembles the Streamline Diffusion stabilization operator in a single cubature point.
int num_local_dofs
actual number of local dofs on current element
Tiny::Matrix< DataType_, block_size_, block_size_ > MatrixValue
our local matrix data
MatrixType::ScatterAxpy scatter_matrix
matrix scatter-axpy object
void scatter()
scatters the local matrix
Task(const BurgersCarreauBlockedMatrixAssemblyJob &job_)
constructor
Burgers Carreau assembly job for block matrix.
static constexpr int block_size
the block size
MatrixType::DataType DataType
the data type
BurgersCarreauAssemblyJobBase< DataType, Space_, ConvVector_ > BaseClass
our base class
Matrix_ MatrixType
the matrix type
MatrixType & matrix
the matrix to be assembled
BurgersCarreauBlockedMatrixAssemblyJob(Matrix_ &matrix_, const ConvVector_ &conv_vector, const Space_ &space_, const String &cubature_name)
Constructor.
void scatter()
scatters the local vector
VectorType::ScatterAxpy scatter_vec_rhs
rhs vector scatter-axpy object
void compute_local_vector()
Computes the local vector by multiplying the local matrix by the solution vector.
VectorType::GatherAxpy gather_vec_sol
sol vector gather-axpy object
Task(const BurgersCarreauBlockedVectorAssemblyJob &job_)
constructor
Tiny::Vector< Tiny::Vector< DataType, block_size >, max_local_dofs > local_vector
local rhs vector dofs
Tiny::Vector< Tiny::Vector< DataType, block_size >, max_local_dofs > local_sol_dofs
local solution vector dofs
const bool sol_equals_conv
specifies whether the solution vector and the convection vector are the same object
Burgers Carreau assembly job for block right-hand-side vector.
VectorType & vector_rhs
the RHS vector to be assembled
BurgersCarreauBlockedVectorAssemblyJob(Vector_ &rhs_vector_, const Vector_ &sol_vector_, const ConvVector_ &conv_vector, const Space_ &space_, const String &cubature_name)
Constructor.
const VectorType & vector_sol
the solution vector
VectorType::DataType DataType
the data type
BurgersCarreauAssemblyJobBase< DataType, Space_, ConvVector_ > BaseClass
our base class
Vector_ VectorType
the vector type
static constexpr int block_size
the block size
Base class for scalar Burgers Carreau assembly tasks.
void assemble()
Performs the assembly of the local matrix.
Tiny::Matrix< DataType, max_local_dofs, max_local_dofs > LocalMatrixType
our local matrix data
static constexpr int max_local_dofs
maximum number of local dofs
void assemble_streamline_diffusion(const DataType weight)
Assembles the Streamline Diffusion stabilization operator in a single cubature point.
void assemble_burgers_point(const DataType weight)
Assembles the Burger operator in a single cubature point.
BurgersCarreauScalarAssemblyTaskBase(const Job_ &job_)
Constructor.
int num_local_dofs
actual number of local dofs on current element
void scatter()
scatters the local matrix
Task(const BurgersCarreauScalarMatrixAssemblyJob &job_)
constructor
MatrixType::ScatterAxpy scatter_matrix
matrix scatter-axpy object
Burgers Carreau assembly job for scalar matrix.
Matrix_ MatrixType
the matrix type
BurgersCarreauScalarMatrixAssemblyJob(Matrix_ &matrix_, const ConvVector_ &conv_vector, const Space_ &space_, const String &cubature_name)
Constructor.
BurgersCarreauAssemblyJobBase< DataType, Space_, ConvVector_ > BaseClass
our base class
MatrixType & matrix
the matrix to be assembled
MatrixType::DataType DataType
the data type
Task(const BurgersCarreauScalarVectorAssemblyJob &job_)
constructor
void compute_local_vector()
Computes the local vector by multiplying the local matrix by the solution vector.
VectorType::GatherAxpy gather_vec_sol
sol vector gather-axpy object
Tiny::Vector< DataType, max_local_dofs > local_vector
local rhs vector dofs
Tiny::Vector< DataType, max_local_dofs > local_sol_dofs
local solution vector dofs
VectorType::ScatterAxpy scatter_vec_rhs
rhs vector scatter-axpy object
void scatter()
scatters the local vector
Burgers Carreau assembly job for scalar right-hand-side vector.
BurgersCarreauScalarVectorAssemblyJob(Vector_ &rhs_vector_, const Vector_ &sol_vector_, const ConvVector_ &conv_vector, const Space_ &space_, const String &cubature_name)
Constructor.
VectorType & vector_rhs
the RHS vector to be assembled
const VectorType & vector_sol
the solution vector
BurgersCarreauAssemblyJobBase< DataType, Space_, ConvVector_ > BaseClass
our base class
VectorType::DataType DataType
the data type
Vector_ VectorType
the vector type
DataType max(DataType x) const
Computes the maximum of a scalar variable over all processes.
Global vector wrapper class template.
const GateType * get_gate() const
Returns a const pointer to the internal gate of the vector.
LocalVector_ & local()
Returns a reference to the internal local LAFEM vector object.
Blocked Dense data vector class template.
auto elements() const -> const typename Intern::DenseVectorBlockedPerspectiveHelper< DT_, BlockSize_, perspective_ >::Type *
Retrieve a pointer to the data array.
Index size() const
The number of elements.
String class implementation.
Tiny Matrix class template.
CUDA_HOST_DEVICE Matrix & add_scalar_main_diag(DataType alpha)
Adds a value onto the matrix's main diagonal.
CUDA_HOST_DEVICE Matrix & add_outer_product(const Vector< T_, m_, snx_ > &x, const Vector< T_, n_, sny_ > &y, const DataType alpha=DataType(1))
Adds the outer product of two vectors onto the matrix.
CUDA_HOST_DEVICE Matrix & set_transpose(const Matrix< T_, n_, m_, sma_, sna_ > &a)
Sets this matrix to the transpose of another matrix.
CUDA_HOST_DEVICE Matrix & axpy(DataType alpha, const Matrix< T_, m_, n_, sma_, sna_ > &a)
Adds another scaled matrix onto this matrix.
CUDA_HOST_DEVICE void format(DataType alpha=DataType(0))
Formats the matrix.
CUDA_HOST_DEVICE DataType norm_frobenius() const
Returns the Frobenius norm of the matrix.
Tiny Vector class template.
CUDA_HOST_DEVICE void format(DataType alpha=DataType(0))
Formats the vector.
CUDA_HOST_DEVICE Vector & axpy(DataType alpha, const Vector< T_, n_, snx_ > &x)
Adds another scaled vector onto this vector.
CUDA_HOST_DEVICE DataType norm_euclid() const
Computes the euclid norm of this vector.
T_ sqrt(T_ x)
Returns the square-root of a value.
T_ pow(T_ x, T_ y)
Returns x raised to the power of y.
T_ max(T_ a, T_ b)
Returns the maximum of two values.
CUDA_HOST_DEVICE T_ dot(const T_ &a, const T_ &b)
Computes the dot-product of two scalars.
@ value
specifies whether the space should supply basis function values
std::uint64_t Index
Index data type.
Reference cell traits structure.