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 ); }
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; }