//==== Add New Link ====// bool LinkMgrSingleton::AddLink( const string& pidA, const string& pidB ) { //==== Make Sure Parm Are Not Already Linked ====// for ( int i = 0 ; i < ( int )m_LinkVec.size() ; i++ ) { if ( m_LinkVec[i]->GetParmA() == pidA && m_LinkVec[i]->GetParmB() == pidB ) { return false; } } //==== Check If ParmIDs Are Valid ====// Parm* pA = ParmMgr.FindParm( pidA ); Parm* pB = ParmMgr.FindParm( pidB ); if ( pA == NULL || pB == NULL ) { return false; } Link* pl = new Link(); pl->SetParmA( pidA ); pl->SetParmB( pidB ); pl->SetOffsetFlag( true ); pl->m_Offset.Set( pB->Get() - pA->Get() ); pl->SetScaleFlag( false ); pl->m_Scale.Set( 1.0 ); m_LinkVec.push_back( pl ); m_CurrLinkIndex = ( int )m_LinkVec.size() - 1; return true; }
void WingDriverGroup::UpdateGroup( vector< string > parmIDs ) { Parm* AR = ParmMgr.FindParm( parmIDs[AR_WSECT_DRIVER] ); Parm* span = ParmMgr.FindParm( parmIDs[SPAN_WSECT_DRIVER] ); Parm* area = ParmMgr.FindParm( parmIDs[AREA_WSECT_DRIVER] ); Parm* taper = ParmMgr.FindParm( parmIDs[TAPER_WSECT_DRIVER] ); Parm* aveC = ParmMgr.FindParm( parmIDs[AVEC_WSECT_DRIVER] ); Parm* rootC = ParmMgr.FindParm( parmIDs[ROOTC_WSECT_DRIVER] ); Parm* tipC = ParmMgr.FindParm( parmIDs[TIPC_WSECT_DRIVER] ); Parm* secsw = ParmMgr.FindParm( parmIDs[SECSWEEP_WSECT_DRIVER] ); Parm* sweep = ParmMgr.FindParm( parmIDs[SWEEP_WSECT_DRIVER] ); Parm* sweeploc = ParmMgr.FindParm( parmIDs[SWEEPLOC_WSECT_DRIVER] ); Parm* secswloc = ParmMgr.FindParm( parmIDs[SECSWEEPLOC_WSECT_DRIVER] ); vector< bool > uptodate; uptodate.resize( m_Nvar ); for( int i = 0; i < m_Nvar; i++ ) { uptodate[i] = false; } for( int i = 0; i < m_Nchoice; i++ ) { uptodate[m_CurrChoices[i]] = true; } bool parallel = false; if( vector_contains_val( m_CurrChoices, ( int ) SECSWEEP_WSECT_DRIVER ) ) { if ( sweep->Get() == secsw->Get() ) { parallel = true; } } if( vector_contains_val( m_CurrChoices, ( int ) TAPER_WSECT_DRIVER ) ){ if ( taper->Get() == 1.0 ) { parallel = true; } } if( vector_contains_val( m_CurrChoices, ( int ) TIPC_WSECT_DRIVER ) && vector_contains_val( m_CurrChoices, ( int ) ROOTC_WSECT_DRIVER ) ) { if ( tipC->Get() == rootC->Get() ) { parallel = true; } } if( vector_contains_val( m_CurrChoices, ( int ) AVEC_WSECT_DRIVER ) && vector_contains_val( m_CurrChoices, ( int ) ROOTC_WSECT_DRIVER ) ) { if ( aveC->Get() == rootC->Get() ) { parallel = true; } } if( vector_contains_val( m_CurrChoices, ( int ) TIPC_WSECT_DRIVER ) && vector_contains_val( m_CurrChoices, ( int ) AVEC_WSECT_DRIVER ) ) { if ( tipC->Get() == aveC->Get() ) { parallel = true; } } if( parallel ) { taper->Set( 1.0 ); uptodate[TAPER_WSECT_DRIVER] = true; secsw->Set( sweep->Get() ); uptodate[SECSWEEP_WSECT_DRIVER] = true; if( vector_contains_val( m_CurrChoices, ( int ) ROOTC_WSECT_DRIVER ) ) { tipC->Set( rootC->Get() ); uptodate[TIPC_WSECT_DRIVER] = true; aveC->Set( rootC->Get() ); uptodate[AVEC_WSECT_DRIVER] = true; } else if( vector_contains_val( m_CurrChoices, ( int ) TIPC_WSECT_DRIVER ) ) { rootC->Set( tipC->Get() ); uptodate[ROOTC_WSECT_DRIVER] = true; aveC->Set( tipC->Get() ); uptodate[AVEC_WSECT_DRIVER] = true; } else if( vector_contains_val( m_CurrChoices, ( int ) AVEC_WSECT_DRIVER ) ) { tipC->Set( aveC->Get() ); uptodate[TIPC_WSECT_DRIVER] = true; rootC->Set( aveC->Get() ); uptodate[ROOTC_WSECT_DRIVER] = true; } } int niter = 0; while( vector_contains_val( uptodate, false ) ) { if( !uptodate[AR_WSECT_DRIVER] ) { if( uptodate[SPAN_WSECT_DRIVER] && uptodate[AREA_WSECT_DRIVER] ) { AR->Set( span->Get() * span->Get() / area->Get() ); uptodate[AR_WSECT_DRIVER] = true; } else if( uptodate[SPAN_WSECT_DRIVER] && uptodate[AVEC_WSECT_DRIVER] ) { AR->Set( span->Get() / aveC->Get() ); uptodate[AR_WSECT_DRIVER] = true; } else if( uptodate[AREA_WSECT_DRIVER] && uptodate[AVEC_WSECT_DRIVER] ) { AR->Set( area->Get() / ( aveC->Get() * aveC->Get() ) ); uptodate[AR_WSECT_DRIVER] = true; } else if( uptodate[SECSWEEP_WSECT_DRIVER] && uptodate[TAPER_WSECT_DRIVER] && !parallel) { double tan1 = tan( sweep->Get() * DEG_2_RAD ); double tan2 = tan( secsw->Get() * DEG_2_RAD ); AR->Set( -2.0 * ( ( 1.0 - taper->Get() ) / ( 1.0 + taper->Get() )) * ( sweeploc->Get() - secswloc->Get() ) / ( tan1 - tan2 ) ); uptodate[AR_WSECT_DRIVER] = true; } } if( !uptodate[SPAN_WSECT_DRIVER] ) { if( uptodate[AVEC_WSECT_DRIVER] && uptodate[AREA_WSECT_DRIVER] ) { span->Set( area->Get() / aveC->Get() ); uptodate[SPAN_WSECT_DRIVER] = true; } else if( uptodate[AR_WSECT_DRIVER] && uptodate[AREA_WSECT_DRIVER] ) { span->Set( sqrt( AR->Get() * area->Get() ) ); uptodate[SPAN_WSECT_DRIVER] = true; } else if( uptodate[AR_WSECT_DRIVER] && uptodate[AVEC_WSECT_DRIVER] ) { span->Set( AR->Get() * aveC->Get() ); uptodate[SPAN_WSECT_DRIVER] = true; } else if( uptodate[SECSWEEP_WSECT_DRIVER] && uptodate[ROOTC_WSECT_DRIVER] && uptodate[TIPC_WSECT_DRIVER] && !parallel) { double tan1 = tan( sweep->Get() * DEG_2_RAD ); double tan2 = tan( secsw->Get() * DEG_2_RAD ); span->Set( ( rootC->Get() - tipC->Get() ) * ( sweeploc->Get() - secswloc->Get() ) / ( tan2 - tan1 ) ); uptodate[SPAN_WSECT_DRIVER] = true; } } if( !uptodate[AREA_WSECT_DRIVER] ) { if( uptodate[SPAN_WSECT_DRIVER] && uptodate[AVEC_WSECT_DRIVER] ) { area->Set( span->Get() * aveC->Get() ); uptodate[AREA_WSECT_DRIVER] = true; } else if( uptodate[SPAN_WSECT_DRIVER] && uptodate[AR_WSECT_DRIVER] ) { area->Set( span->Get() * span->Get() / AR->Get() ); uptodate[AREA_WSECT_DRIVER] = true; } else if( uptodate[AR_WSECT_DRIVER] && uptodate[AVEC_WSECT_DRIVER] ) { area->Set( AR->Get() * aveC->Get() * aveC->Get() ); uptodate[AREA_WSECT_DRIVER] = true; } } if( !uptodate[AVEC_WSECT_DRIVER] ) { if( uptodate[TIPC_WSECT_DRIVER] && uptodate[ROOTC_WSECT_DRIVER] ) { aveC->Set( ( tipC->Get() + rootC->Get() ) / 2.0 ); uptodate[AVEC_WSECT_DRIVER] = true; } else if( uptodate[SPAN_WSECT_DRIVER] && uptodate[AREA_WSECT_DRIVER] ) { aveC->Set( area->Get() / span->Get() ); uptodate[AVEC_WSECT_DRIVER] = true; } else if( uptodate[SECSWEEP_WSECT_DRIVER] && uptodate[TAPER_WSECT_DRIVER] && uptodate[SPAN_WSECT_DRIVER] && !parallel) { double tan1 = tan( sweep->Get() * DEG_2_RAD ); double tan2 = tan( secsw->Get() * DEG_2_RAD ); aveC->Set( -span->Get() * ( tan1 - tan2 ) * ( 1.0 + taper->Get() ) / ( 2.0 * ( sweeploc->Get() - secswloc->Get() ) * ( 1 - taper->Get() ) ) ); uptodate[AVEC_WSECT_DRIVER] = true; } } if( !uptodate[TIPC_WSECT_DRIVER] ) { if( uptodate[TAPER_WSECT_DRIVER] && uptodate[ROOTC_WSECT_DRIVER] ) { tipC->Set( taper->Get() * rootC->Get() ); uptodate[TIPC_WSECT_DRIVER] = true; } else if( uptodate[TAPER_WSECT_DRIVER] && uptodate[AVEC_WSECT_DRIVER] ) { tipC->Set( 2.0 * aveC->Get() / ( 1.0 + ( 1.0 / taper->Get() ) ) ); uptodate[TIPC_WSECT_DRIVER] = true; } else if( uptodate[ROOTC_WSECT_DRIVER] && uptodate[AVEC_WSECT_DRIVER] ) { tipC->Set( 2.0 * aveC->Get() - rootC->Get() ); uptodate[TIPC_WSECT_DRIVER] = true; } else if( uptodate[SECSWEEP_WSECT_DRIVER] && uptodate[ROOTC_WSECT_DRIVER] && uptodate[SPAN_WSECT_DRIVER] ) { double tan1 = tan( sweep->Get() * DEG_2_RAD ); double tan2 = tan( secsw->Get() * DEG_2_RAD ); tipC->Set( rootC->Get() + span->Get() * ( tan1 - tan2 ) / ( sweeploc->Get() - secswloc->Get() ) ); uptodate[TIPC_WSECT_DRIVER] = true; } else if( uptodate[SECSWEEP_WSECT_DRIVER] && uptodate[ROOTC_WSECT_DRIVER] && uptodate[AREA_WSECT_DRIVER] ) { double tan1 = tan( sweep->Get() * DEG_2_RAD ); double tan2 = tan( secsw->Get() * DEG_2_RAD ); double coeff = 2.0 * area->Get() * ( tan1 - tan2 ) / ( sweeploc->Get() - secswloc->Get() ); tipC->Set( sqrt( -1.0 * ( rootC->Get() * rootC->Get() + coeff ) ) ); uptodate[TIPC_WSECT_DRIVER] = true; } } if( !uptodate[ROOTC_WSECT_DRIVER] ) { if( uptodate[TAPER_WSECT_DRIVER] && uptodate[TIPC_WSECT_DRIVER] ) { rootC->Set( tipC->Get() / taper->Get() ); uptodate[ROOTC_WSECT_DRIVER] = true; } else if( uptodate[TAPER_WSECT_DRIVER] && uptodate[AVEC_WSECT_DRIVER] ) { rootC->Set( 2.0 * aveC->Get() / ( 1.0 + taper->Get() ) ); uptodate[ROOTC_WSECT_DRIVER] = true; } else if( uptodate[TIPC_WSECT_DRIVER] && uptodate[AVEC_WSECT_DRIVER] ) { rootC->Set( 2.0 * aveC->Get() - tipC->Get() ); uptodate[ROOTC_WSECT_DRIVER] = true; } else if( uptodate[SECSWEEP_WSECT_DRIVER] && uptodate[TIPC_WSECT_DRIVER] && uptodate[SPAN_WSECT_DRIVER] ) { double tan1 = tan( sweep->Get() * DEG_2_RAD ); double tan2 = tan( secsw->Get() * DEG_2_RAD ); rootC->Set( tipC->Get() - span->Get() * ( tan1 - tan2 ) / ( sweeploc->Get() - secswloc->Get() ) ); uptodate[ROOTC_WSECT_DRIVER] = true; } else if( uptodate[SECSWEEP_WSECT_DRIVER] && uptodate[TIPC_WSECT_DRIVER] && uptodate[AREA_WSECT_DRIVER] ) { double tan1 = tan( sweep->Get() * DEG_2_RAD ); double tan2 = tan( secsw->Get() * DEG_2_RAD ); double coeff = 2.0 * area->Get() * ( tan1 - tan2 ) / ( sweeploc->Get() - secswloc->Get() ); rootC->Set( sqrt( tipC->Get() * tipC->Get() - coeff ) ); uptodate[ROOTC_WSECT_DRIVER] = true; } } if( !uptodate[TAPER_WSECT_DRIVER] ) { if( uptodate[TIPC_WSECT_DRIVER] && uptodate[ROOTC_WSECT_DRIVER] ) { if ( rootC->Get() == 0.0 ) { if ( tipC->Get() == 0.0 ) { taper->Set( 1.0 ); } else { taper->Set( taper->GetUpperLimit() ); } } else { taper->Set( tipC->Get() / rootC->Get() ); } uptodate[TAPER_WSECT_DRIVER] = true; } else if( uptodate[SECSWEEP_WSECT_DRIVER] && uptodate[AR_WSECT_DRIVER] ) { double tan1 = tan( sweep->Get() * DEG_2_RAD ); double tan2 = tan( secsw->Get() * DEG_2_RAD ); double coeff = AR->Get() * ( tan1 - tan2 ) / ( 2.0 * ( sweeploc->Get() - secswloc->Get() ) ); taper->Set( ( 1.0 + coeff ) / ( 1.0 - coeff ) ); uptodate[TAPER_WSECT_DRIVER] = true; } } if( !uptodate[SECSWEEP_WSECT_DRIVER] ) { if( uptodate[TAPER_WSECT_DRIVER] && uptodate[AR_WSECT_DRIVER] ) { double tan2 = CalcTanSweepAt( secswloc->Get(), sweep->Get(), sweeploc->Get(), AR->Get(), taper->Get() ); secsw->Set( atan( tan2 ) * RAD_2_DEG ); uptodate[SECSWEEP_WSECT_DRIVER] = true; } else if( uptodate[ROOTC_WSECT_DRIVER] && uptodate[TIPC_WSECT_DRIVER] && uptodate[SPAN_WSECT_DRIVER] ) { double tan1 = tan( sweep->Get() * DEG_2_RAD ); double tan2 = tan1 + ( rootC->Get() - tipC->Get() ) * ( sweeploc->Get() - secswloc->Get() ) / span->Get(); secsw->Set( atan( tan2 ) * RAD_2_DEG ); uptodate[SECSWEEP_WSECT_DRIVER] = true; } } // Each pass through the loop should update at least one variable. // With m_Nvar variables and m_Nchoice initially known, all should // be updated in ( m_Nvar - m_Nchoice ) iterations. If not, we're // in an infinite loop. assert( niter < ( m_Nvar - m_Nchoice ) ); niter++; } }