Debug

时间步长 5e-7,50个步长左右就发散了

  1. 改成udmi
  2. source 收敛性
  3. message

为了试验,

A omega = 40e-6 * 2*pi* 2e+4 = 5.0265

A omega * rho/c = 3.3833

发现 v 分量的边界条件,可能有问题

DEFINE_ADJUST(axis_BC, d)
{
    Thread *t;
    face_t f;
    int zone_ID = 3;
    cell_t c;
    //Thread *t0 ;
    t = Lookup_Thread(d, zone_ID);
    if(NULL != THREAD_STORAGE(t,SV_UDS_I(2))
    {
        begin_f_loop(f,t)
        {    
           c0 = F_C0(f,t);    
           C_UDSI(c0,t->t0,2) = 0.;
        }
        end_f_loop(f,t)
    } 
}

既然轴对称边界上没有 F_UDSI,

Note that F_UDSI is available for wall and flow boundary faces, only. If a UDS attempts to access any other face zone, then an error will result.

那么

DEFINE_PROFILE(axis_boundary, t, i)
{
    face_t f0;
    Domain *d = Get_Domain(1);
    Thread *t0 = Lookup_Thread(d, 3);
    begin_f_loop(f0, t0) 
    {    
        F_PROFILE(f0, t0, i) = 0.;
    }
    end_f_loop(f0, t0)
}

1. 标量波动方程(无流场)

$$\frac{\partial \rho}{\partial t} + \rho_0 \nabla \cdot v^\prime = 0$$

$$\rho_0 \frac{\partial v^\prime}{\partial t} = -\nabla p$$

速度分解

$$v^\prime = \nabla \phi + \nabla \times \mathbf{A}$$

$$\begin{cases}\nabla \cdot v^\prime = \zeta\ \nabla \times v^\prime = \vec{\omega} \end{cases}$$

轴对称

$$v^\prime = v_r^\prime\hat{r} + v_z^\prime \hat{z}$$

$$\begin{cases} \nabla\cdot v^\prime = \frac{1}{r} \frac{\partial r v_r^\prime}{\partial r} + \frac{\partial v_z^\prime}{\partial z}\ \nabla\times v^\prime = \frac{\partial v^\prime_r}{\partial z} - \frac{\partial v_z^\prime}{\partial r} \end{cases} $$

波动方程的标量形式

$$\frac{\partial\rho}{\partial t} + \rho_0 \nabla\cdot v^\prime = 0$$

$$\rho_0 \frac{\partial \nabla \cdot v^\prime}{\partial t} = - \nabla^2 p$$

$$\rho_0 \frac{\partial \nabla \times v^\prime}{\partial t} = 0$$

也即

$$\begin{cases} \frac{\partial \rho^\prime}{\partial t} + \rho_0 \zeta = 0 \ \rho_0\frac{\partial \zeta}{\partial t} = -c^2 \nabla^2 \rho^\prime \ \frac{\partial \omega}{\partial t} = 0 \end{cases}$$

边界条件

# include "udf.h"
# include "sg.h"

enum 
{
    RHO,
    ZETA,
    N_REQURIED_UDS
}

DEFINE UDS_UNSTEADY(uds_time, c, t, i, apu, su)
{
    real physical_dt, vol, rho0 = 998.2, phi_old;
    physical_dt = RP_Get_Real("physical-time-step");
    vol = C_VOLUME(c,t);

    if(i == RHO) {
        *apu = -vol / physical_dt;
        *su  = vol*C_STORAGE_R(c,t,SV_UDSI_M1(i))/physical_dt;
    } else if(i == ZETA){
        *apu = -rho0*vol / physical_dt;
        *su  = rho0*vol*C_STORAGE_R(c,t,SV_UDSI_M1(i))/physical_dt;  
    }
}

DEFINE UDS_FLUX(uds_flux, f, t, i)
{
    real k = 1483.0*1483.0;
    cell_t c0, c1;
    THREAD *t1, *t0;
    real A[ND_ND], dRHO[ND_ND], dr0[ND_ND], dr1[ND_ND], es[ND_ND], A_by_ds, ds;
    c0 = F_C0(f, t);
    t0 = THREAD_T0(t);

    if (i != ZETA) return 0.;

    if (BOUNDARY_FACE_THREAD_P(t)) 
    {
        if(NULL != THREAD_STORAGE(t, SV_UDS_I(RHO)) ) {
            BOUNDARY_FACE_GEOMETRY(f, t, A, ds, es, A_by_es, dr0);
            source = k * (F_UDSI(f, t, RHO) - C_UDSI(c0, t0, RHO)) * A_by_es / ds;    
            if( NULL != T_STORAGE_R_NV(t0, SV_UDSI_G(RHO)) {
                BOUNDARY_SECONDARY_GRADIENT_SOURCE(GSource, SV_UDSI_G(RHO), dRHO, es, A_by_es, k);
                source += GSource;
            }
        } else {
            source = 0.;                
        }   
    } else {
        c1 = F_C1(f, t);
        t1 = THREAD_T1(t);
        INTERIOR(f, t, A, ds, es, A_by_es, dr0, dr1);
        source = k * (C_UDSI(c1, t1, rho) - C_UDSI(c0, t0, rho)) * A_by_es / ds;
        if( NULL != T_STORAGE_R_NV(t0, SV_UDSI_G(RHO)) {
            BOUNDARY_SECONDARY_GRADIENT_SOURCE(GSource, SV_UDSI_G(RHO), dRHO, es, A_by_es, k);
            source += GSource;
        }
    }
    return source;
}

DEFINE SOURCE(uds0, c, t, dS, eqn) 
{
    real rho0 = 998.2;
    dS[eqn] = 0.;
    return - rho0 * C_UDSI(zeta);
}

// Initial Condition

//----- Boundary Condition -------//
DEFINE PROFILE(f, t, i)
{
    //real A[ND_ND], dRHO[ND_ND], dr0[ND_ND], dr1[ND_ND], es[ND_ND], A_by_ds, ds;
    cell_t c0 = F_C0(f, t);
    THREAD *t0 = THREAD_T0;
    begin_f_loop(f, t)
    {
        BOUNDARY_FACE_GEOMETRY(f, t, A, ds, es, A_by_es, dr0);
        f_profile(f,t,i) = C_UDSI(c0, t0, ZETA)/ ds;
    }
    end_f_loop(f, t)
}

DEFINE PROFILE(f, t, i)
{
    //
    begin_f_loop(f, t);
    THREAD *t0 = THREAD_T0;
    begin_f_loop(f, t)
    {
        f_profile(f, t, i) = 5.026
    }
    end_f_loop(f, t)

2. 标量波动方程

$$(\frac{\partial }{\partial t} + \bar{v} \cdot \nabla) \rho + \rho_0 \nabla \cdot v^\prime = 0$$

$$\rho_0 [\frac{\partial v^\prime}{\partial t} + (v^\prime \cdot \nabla ) \bar{v} + (\bar{v} \cdot \nabla) v^\prime + (\bar{v}\cdot\nabla)\bar{v} ] = \rho_0\nabla (\bar{v^\prime v^\prime}) - \nabla p^\prime + \mu \nabla^2 v^\prime $$

所以用速度势

$$\rho_0 {\frac{\partial \nabla \cdot v^\prime}{\partial t} + \nabla\cdot [(v^\prime \cdot \nabla) \bar{v}] + \nabla\cdot[(\bar{v}\cdot\nabla)v^\prime] + \nabla \cdot [(\bar{v}\cdot\nabla)\bar{v}]} = \nabla^2 (\bar{v^\prime v^\prime}) - \nabla^2 p^\prime + \mu \nabla^2 \nabla \cdot v^\prime$$

$$\rho_0 {\frac{\partial \nabla\times v^\prime}{\partial t} + \nabla\times[(v^\prime \cdot \nabla ) \bar{v}] + \nabla\times[ (\bar{v} \cdot \nabla) v^\prime] + \nabla\times[ (\bar{v}\cdot\nabla)\bar{v} ]} = \mu \nabla^2 \nabla\times v^\prime $$

利用

$$\nabla \cdot[(\bar{v}\cdot \nabla)v^\prime] = (\bar{v}\cdot \nabla) (\nabla \cdot v^\prime) + \nabla v^\prime : \nabla\bar{v}$$

$$\nabla\times[(v^\prime \cdot \nabla ) \bar{v}]=(v^\prime \cdot \nabla ) (\nabla \times \bar{v}) + (\nabla \times v^\prime)\cdot \nabla \bar{v}$$

综合

$$\begin{cases}(\frac{\partial}{\partial t} + \bar{v} \cdot \nabla) \rho + \rho_0 \zeta= 0 \ \rho_0 [\frac{\partial \zeta}{\partial t} + \bar{v} \cdot \nabla \zeta + 2 \nabla v^\prime : \nabla \bar{v} + \nabla \bar{v} : \nabla \bar{v}] = - \nabla^2 p^\prime +\mu \nabla^2 \zeta \ \rho_0 [\frac{\partial \omega}{\partial t} + (v^\prime \cdot\nabla )\bar{\omega} + (\bar{v}\cdot \nabla) \omega] = \mu \nabla^2 \omega \end{cases}$$

其中。速度$$v^\prime = \nabla \phi - \nabla \times \vec{\psi}$$ 根据这两个方程,

$$\begin{cases} \nabla^2 \phi = \zeta\ \nabla^2 \psi = \omega\ \end{cases}$$

边界条件

#include "udf.h"

enum {
    RHO,
    ZETA,
    OMEGA,
    N_REQUIRED_UDS
}

DEFINE_FLUX(zeta, f, t, i)
{
    real k = 1483.0*1483.0;
    cell_t c0, c1;
    THREAD *t1, *t0;
    real A[ND_ND], dRHO[ND_ND], dr0[ND_ND], dr1[ND_ND], es[ND_ND], A_by_ds, ds;
    c0 = F_C0(f, t);
    t0 = THREAD_T0(t);

    if (i != ZETA) return 0.;

    if (BOUNDARY_FACE_THREAD_P(t)) {
        if(NULL != THREAD_STORAGE(t, SV_UDS_I(RHO)) ) {
            BOUNDARY_FACE_GEOMETRY(f, t, A, ds, es, A_by_es, dr0);
            source = k * (F_UDSI(f, t, RHO) - C_UDSI(c0, t0, RHO)) * A_by_es / ds;
            if( NULL != T_STORAGE_R_NV(t0, SV_UDSI_G(RHO)) {
                BOUNDARY_SECONDARY_GRADIENT_SOURCE(GSource, SV_UDSI_G(RHO), dRHO, es, A_by_es, k);
                source += GSource;
            }
        } else {
            source = 0.;
        }
        if(NULL != THREAD_STORAGE(t, SV_UDS_I(ZETA))
            zeta =F_UDSI(f, t, ZETA);
        } else if(NULL != T_STORAGE_R_NV(t0, SV_UDSI_G(ZETA)) {
            BOUNDARY_FACE_GEOMETRY(f, t, A, ds, es, A_by_es, dr0);
            zeta =C_UDSI(c0, t0, ZETA) + NV_DOT(C_UDSI_G(c0, t0, ZETA), dr0);
        } else {
            zeta =C_UDSI(c0, t0, ZETA);
        }
        NV_DS(V, =, F_U(f,t), F_V(c,t), 0, *, zeta);
        return rho0*NV_DOT(V, A) + source;
    } else {
        c1 = F_C1(f, t);
        t1 = THREAD_T1(t);

        INTERIOR_FACE_GEOMETRY(f, t, A, ds, es, A_by_es, dr0, dr1); 
        source = k * (C_UDSI(c1, t1, rho) - C_UDSI(c0, t0, rho)) * A_by_es / ds;
        if( NULL != T_STORAGE_R_NV(t0, SV_UDSI_G(RHO)) {
            SECONDARY_GRADIENT_SOURCE(GSource, SV_UDSI_G(RHO), dRHO, es, A_by_es, k);
            source += GSource;
        }

        if(NULL != T_STORAGE_R_NV(t0, SV_UDSI_G(ZETA)) {
            //INTERIOR_FACE_GEOMETRY(f, t, A, ds, es, A_by_es, dr0, dr1);
            ZETA = C_UDSI(c0, t0, ZETA) + NV_DOT(C_UDSI_G(c0, t0, ZETA), dr0);
        } else {
            ZETA = (C_UDSI(c0, t0, ZETA) + C_UDSI(c1, t1, ZETA))/2.0;
        }
        NV_D(V, =, C_U(c0, t0), C_V(c0, t0), 0);
        NV_D(V,+=, C_U(c1, t1), C_V(c1, t1), 0);
        return rho0*NV_DOT(V, A)/2.0*zeta + source; 
    }
}

DEFINE_FLUX(omega, f, t, i)
{
    c0 = F_C0(f, t);
    t0 = THREAD_T0(t);

    if (i != OMEGA) return 0.;

    if (BOUNDARY_FACE_THREAD_P(t)) {
        if(NULL != THREAD_STORAGE(t, SV_UDS_I(OMEGA)) ) {
            omega = F_UDSI(f, t);
        } else if ( NULL != T_STORAGE_R_NV(t0, SV_UDSI_G(OMEGA) ) {
            BOUNDARY_FACE_GEOMETRY(f, t, A, ds, es, A_by_es, dr0);
            omega = C_UDSI(c0, t0) + NV_DOT(C_UDSI_G(c0, t0, OMEGA), dr0);
        } else {
            omega = C_UDSI(c0, t0); 
        }
        NV_D(V, =, F_U(f, t), F_V(f, t), 0, omega);
        return rho0*NV_DOT(V, A);
    } else {
        c1 = F_C1(f, t);
        t1 = THREAD_T1(t);
        if(NULL != T_STORAGE_R_NV(t0, SV_UDSI_G(OMEGA)) {
            INTERIOR_FACE_GEOMETRY(f, t, A, ds, es, A_by_es, dr0, dr1);
            omega = C_UDSI(c0, t0, OMEGA) + NV_DOT(C_UDSI_G(c0, t0, OMEGA), dr0);
        } else {
            omega = (C_UDSI(c0, t0, OMEGA) + C_UDSI(c1, t1, OMEGA))/2.0;
        }
        NV_D(V, =, C_U(c0, t0), C_V(c0, t0), 0);
        NV_D(V,+=, C_U(c1, t1), C_V(c1, t1), 0);
        return rho0*NV_DOT(V, A)/2.0*omega; 
    }
}


DEFINE_FLUX(rho, f, t, i)
{
    c0 = F_C0(f, t);
    t0 = THREAD_T0(t);

    if (i != RHO) return 0.;

    if (BOUNDARY_FACE_THREAD_P(t)) {
        if(NULL != THREAD_STORAGE(t, SV_UDS_I(RHO)) ) {
            rho = F_UDSI(f, t);
        } else if ( NULL != T_STORAGE_R_NV(t0, SV_UDSI_G(RHO) ) {
            BOUNDARY_FACE_GEOMETRY(f, t, A, ds, es, A_by_es, dr0);
            rho = C_UDSI(c0, t0) + NV_DOT(C_UDSI_G(c0, t0, RHO), dr0);
        } else {
            rho = C_UDSI(c0, t0);
        }
        NV_D(V, =, F_U(f, t), F_V(f, t), 0, RHO);
        return rho0*NV_DOT(V, A);
    } else {
        c1 = F_C1(f, t);
        t1 = THREAD_T1(t);
        if(NULL != T_STORAGE_R_NV(t0, SV_UDSI_G(RHO)) {
            INTERIOR_FACE_GEOMETRY(f, t, A, ds, es, A_by_es, dr0, dr1);
            rho = C_UDSI(c0, t0, RHO) + NV_DOT(C_UDSI_G(c0, t0, RHO), dr0);
        } else {
            rho = (C_UDSI(c0, t0, RHO) + C_UDSI(c1, t1, RHO))/2.0;
        }
        NV_D(V, =, C_U(c0, t0), C_V(c0, t0), 0);
        NV_D(V,+=, C_U(c1, t1), C_V(c1, t1), 0);
        return rho0*NV_DOT(V, A)/2.0*rho;
    }
}

DEFINE_SOURCE(source_rho, c, t, i)
{
    real rho0 = 998.2;
    return - rho0* 
}


results matching ""

    No results matching ""