Hi all,

Please consider me as a beginner in editing the Nektar++ solvers.
I'd like to implement Sub-Grid-Scale Smagorinsky model into IncNavierStokesSolver. This would require:
1. local element size,
2. calculation of the velocity gradient at each point in physical space,
3. adding turbulent viscosity nu_turb=func( size_element, grad(v) ) to the viscosity in physical space.

I had a look into the code focusing on my requirements and have a few questions:
1. Re documentation, is there any developer guide for the IncNavierStokesSolver as a starting point?
2. Re the implementation, I'm using the velocity correction scheme. Please suggest if the strategy below makes sense (performance-wise):
    2.a) For the solution points separation in space,  repeat the same as in SVVVarDiffCoeff() function to calculate h/p:
                {    h = max(h, exp3D->GetGeom3D()->GetEdge(i)->GetVertex(0)->dist(
                             *(exp3D->GetGeom3D()->GetEdge(i)->GetVertex(1))));
                }
                for(int i = 0; i < 3; ++i)
                {
                    p = max(p,exp3D->GetBasisNumModes(i)-1);
                }
    2.b) Obtain grad(v) using  PhysDeriv(space, var, gradvar). However, I need some help here. Is it possible to access different components of the gradients (du_dx, du_dy, du_dz etc.) of the advected fields without going into the loops as done in ProcessModules/ProcessGrad.cpp?
    2.c) Add the above changes in VelocityCorrectionScheme.cpp as commented:
    /**
     * Solve velocity system
     */
    void   VelocityCorrectionScheme::v_SolveViscous(
        const Array<OneD, const Array<OneD, NekDouble> > &Forcing,
        Array<OneD, Array<OneD, NekDouble> > &outarray,
        const NekDouble aii_Dt)
    {
        StdRegions::ConstFactorMap factors;
        StdRegions::VarCoeffMap varCoeffMap = StdRegions::NullVarCoeffMap;
        MultiRegions::VarFactorsMap varFactorsMap =
            MultiRegions::NullVarFactorsMap;

        AppendSVVFactors(factors,varFactorsMap);
         
        // // // Smagorinsky model Start // // // 

// Find ele_size i.e. h/p as in SVVVarDiffCoeff()
// Find du_dxi, dv_dxi, dw_dxi, dAnotherField_dxi, where i=1,2,3
// nu_t = sq(const*ele_size)*sqrt(2.0*S_ijS_ij)
// add nu_t field to m_diffCoeff

// // // Smagorinsky model End // // //

        // Solve Helmholtz system and put in Physical space
        for(int i = 0; i < m_nConvectiveFields; ++i)
        {
            // Setup coefficients for equation
            factors[StdRegions::eFactorLambda] = 1.0/aii_Dt/m_diffCoeff[i];
            m_fields[i]->HelmSolve(Forcing[i], m_fields[i]->UpdateCoeffs(),
                                   NullFlagList,  factors, varCoeffMap,
                                   varFactorsMap);
            m_fields[i]->BwdTrans(m_fields[i]->GetCoeffs(),outarray[i]);
        }
    }

3. Since the velocity field is not C1 continuous at element boundaries, does anyone see a problem due to that?

General comments are welcome on the methodology.

Sorry for a long email.

BR,
Vishal

---
Vishal SAINI

PhD Student
Loughborough University