Beispiel #1
0
void FlowConditions::initParameters ( FSIOperator&  Oper,
                                      const int&    outflowFlag)
{

    UInt flag = 1;
    Epetra_SerialDenseVector fluidQuantities (1); // M_area0
    Epetra_SerialDenseVector solidQuantities (2); // M_beta and M_rhos


    if (Oper.isFluid() )
    {

        fluidQuantities (0) = Oper.fluid().area (outflowFlag);

    }

    M_area0      = fluidQuantities (0);
    M_outRadius0 = std::sqrt (M_area0 / pi);
    M_inRadius0 = M_outRadius0;

    Oper.displayer().leaderPrint ( "  Outflow BC : area0     = ", M_area0 );
    Oper.displayer().leaderPrint ( "  Outflow BC : radius    = ", M_outRadius0 );
    if (Oper.isSolid() )
    {
        solidQuantities (0) =  ( ( Oper.solid().thickness() * Oper.solid().young ( flag )     ) / ( 1 - Oper.solid().poisson ( flag ) * Oper.solid().poisson ( flag ) ) * pi / M_area0 );

        solidQuantities (1) = Oper.solid().rho( );

        Oper.displayer().leaderPrint ( "  Outflow BC : thickness = " , Oper.solid().thickness() );
        Oper.displayer().leaderPrint ( "  Outflow BC : young     = " , Oper.solid().young ( flag ) );
        Oper.displayer().leaderPrint ( "  Outflow BC : poisson   = " , Oper.solid().poisson ( flag ) );

    }

    //Oper.worldComm().Broadcast( solidQuantities.Values(), solidQuantities.Length(),
    //Oper.getSolidLeaderId() );


    M_beta  = solidQuantities (0);
    M_rhos  = solidQuantities (1);
    Oper.displayer().leaderPrint ( "  Outflow BC : beta      = " , M_beta );
    Oper.displayer().leaderPrint ( "  Outflow BC : rho       = " , M_rhos );


}
Beispiel #2
0
void FlowConditions::renewParameters ( FSISolver&  oper_,
                                       const int&    outflowFlag,
                                       const FSIOperator::vector_Type& fluidSolution)
{

    Epetra_SerialDenseVector fluidQuantities (2); // Flux and Area
    //Epetra_SerialDenseVector solidQuantities(0); // M_beta and M_rhos
    FSIOperator* Oper (oper_.FSIOper().get() );

    if (Oper->isFluid() )
    {
        fluidQuantities (0) = Oper->fluid().flux (outflowFlag, fluidSolution );
        fluidQuantities (1) = Oper->fluid().area (outflowFlag);
    }

    Oper->worldComm()->Broadcast ( fluidQuantities.Values(), fluidQuantities.Length(),
                                   Oper->getFluidLeaderId() );


    Real qn;
    Real area;
    Real area0;

    qn   = fluidQuantities (0);
    area = fluidQuantities (1);
    area0 = 0.0034212;
    // Fluid density
    // Real density = 1.0;
    UInt flag   = 1;

    // Setting parameters for our simulation:
    // if imposing the absorbing boundary condition through the pressure:
    if (bcOnFluid)
    {

        // Moura et al.
        //Alexandra's Abc
        Real exp  = 5 / 4;
        Real beta = ( std::sqrt (PI) * Oper->solid().thickness() * Oper->solid().young ( flag ) ) / (1 - Oper->solid().poisson ( flag ) * Oper->solid().poisson ( flag ) );
        Real R    = ( std::sqrt (Oper->solid().rho( ) * beta ) ) / ( std::sqrt (2.0) * std::pow (area0, exp) );

        M_outP       = R * qn;

        // Nobile & Vergara
        // M_outP =  pow((sqrt(density)/(2.*sqrt(2))*qn/area + sqrt(M_beta*sqrt(M_area0))),2)
        //           - M_beta*sqrt(M_area0);
        FlowConditions::outputVector[conditionNumber] = M_outP;

        Oper->displayer().leaderPrint ( " Flow rate = " , qn );
        Oper->displayer().leaderPrint ( " outflow pressure   = " , M_outP );

        M_outDeltaRadius = 0;


    }
    else
    {
        // if imposing the absorbing boundary condition through change in radius: --> Not ready
#ifdef  TESTING
        M_outP = Pout;

        area = qn * std::sqrt (M_rhos) / ( (2.*std::sqrt (2) ) *
                                           std::sqrt ( M_outP + M_beta * sqrt (M_area0) ) - std::sqrt ( M_beta * sqrt (M_area0) ) );

        assert (area >= 0 );
        if (area < 1e-8 * M_area0)
        {
            area = M_area0;
        }

        M_outDeltaRadius = std::sqrt ( area / pi  ) - M_outRadius0;

        Oper->displayer().leaderPrint ( " outflow A = " , area );
        Oper->displayer().leaderPrint ( " outflow dr = " , M_outDeltaRadius );
        Oper->displayer().leaderPrint ( " Flow rate = " , qn );
        Oper->displayer().leaderPrint ( " outflow pressure   = " , M_outP );
#endif

    }

    // for now applying absBC only at outflow
    M_inDeltaRadius = 0;
    //    M_inP = Pin;

}