/** * Generic function to replace the Show member function of * the model structures * * @param user : an integer TOSCREEN or TOFILE * @param pt_plan : pointer the planning structure * describing what to do * @param model : pointer to the model instance */ int Show_model_gen(int user,Planning *pt_plan,Model *model) { void* pt=(model->TypeModel); VAR *var = ((VAR*)pt); VAR _bs; int nvar = model->nvar, i, j; char *id = NULL; Fprintf(user,"##Model:%s\n",model->Name); for (i=0; i<nvar; i++) { PrintVar(pt_plan,user,&(var[i])); if (strncmp(var[i].Vname, "Annual Interest Rate", 20) == 0 || strncmp(var[i].Vname, "Annual Dividend Rate", 20) == 0 ) { if (id==NULL) { if ((id=malloc(33*sizeof(char)))==NULL) return MEMORY_ALLOCATION_FAILURE; } _bs.Vtype=DOUBLE; _bs.Val.V_DOUBLE=log(1+var[i].Val.V_DOUBLE/100); strcpy(id, "-->Instantaneous"); strcat(id, &(var[i].Vname[6])); _bs.Vname = id; _bs.Viter=FORBID; _bs.setter = NULL; _bs.Vsetable = SETABLE; if(var[i].Vtype==PNLVECT) { strcat(id, ": "); Fprintf(user, id); for(j=0; j<var[i].Val.V_PNLVECT->size; j++) { _bs.Val.V_DOUBLE=log(1+var[i].Val.V_PNLVECT->array[j]/100); Fprintf(user, "%f ", _bs.Val.V_DOUBLE); } Fprintf(user, "\n"); } else { _bs.Val.V_DOUBLE=log(1+var[i].Val.V_DOUBLE/100); PrintVar(pt_plan,user,&_bs); } } } if (id!=NULL) {free(id); id=NULL;} return (model->Check)(user,pt_plan,model); }
void Emit(char * filename) { Var * var; EmitOpen(filename); VarUse(); if (Verbose(NULL)) { PrintHeader(1, "Variables"); for(var = VarFirst(); var != NULL; var = VarNext(var)) { if (var->write >= 1 || var->read >= 1) { if (var->mode == INSTR_VAR && !VarIsReg(var) && !VarIsLabel(var)) { PrintVar(var); PrintEOL(); } } } PrintHeader(1, "Output"); } // verbose EmitLabels(); //TODO: ProcessUsedProc // if (!EmitProc(&ROOT_PROC)) goto failure; EmitProc(&ROOT_PROC); EmitProcedures(); EmitAsmIncludes(); EmitInstrOp(INSTR_CODE_END, NULL, NULL, NULL); VarEmitAlloc(); EmitInstrOp(INSTR_SRC_END, NULL, NULL, NULL); EmitClose(); }
void VarSetPrint(VarSet * set) { VarTuple * tuple; UInt16 cnt, i; for(cnt = set->count, tuple = set->arr, i = 0; cnt>0; cnt--, tuple++, i++) { PrintVar(tuple->key); PrintEOL(); } }
void cRegArchParam::PrintParam(ostream &theOut) const { theOut << "Regression with ARCH type residuals parameters:" << endl ; theOut << "-----------------------------------------------" << endl ; PrintResiduals(theOut) ; theOut << endl ; PrintMean(theOut) ; theOut << endl ; theOut << "Conditional variance parameters:" << endl ; theOut << "--------------------------------" << endl ; PrintVar(theOut) ; theOut << endl ; }
void ScriptTemplate::PrintScript( void* dataObj, ScriptStream& stm ) { char* cur = m_TText; // template parsing loop do { char* start = cur; while( *cur != '\0' && *cur != '$' ) ++cur; // flush text collected between variables stm.WriteBytes( start, cur - start ); if ( *cur == '\0' ) break; cur += 2; // skip to the name of the var start = cur; while( *cur != ')' ) ++cur; // put terminating zero temorarely *cur = '\0'; // look up variable size_t sz = m_Vars.size(); // bool found = false; for( size_t i = 0; i != sz; ++i ) { if ( strcmp( m_Vars[i]->m_Name, start ) == 0 ) { PrintVar( m_Vars[i], dataObj, stm ); *cur = ')'; // remove terminating zero ++cur; // found = 1; break; } } // variable referred by template script is not // registered to this tempalte object // ASSERT( found ); } while(1); }
//컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴 //Procedure GetKeyCommon //Author R. Hyde //Date Tue 31 Oct 1995 // //Description f // //Inputs // //Returns // //------------------------------------------------------------------------------ void ManualPilot::GetKeyCommon(AirStrucPtr const ControlledAC) { PMODEL pModel = ControlledAC->fly.pModel; //#define PRINT_STICK_RUDDER #ifdef PRINT_STICK_RUDDER SWord temp; temp = 39 + ControlledAC->fly.aileron / 1000; PrintString(temp, 0, " "); temp = 39 + ControlledAC->fly.rudder / 1000; PrintString(temp, 23, " "); temp = 12 + ControlledAC->fly.elevator / 2700; PrintString(66, temp, " "); temp = 39 + pModel->Aileron / 1000; PrintString(temp, 1, " "); temp = 39 + pModel->Rudder / 1000; PrintString(temp, 24, " "); temp = 12 + pModel->Elevator / 2700; PrintString(73, temp, " "); #endif GetStickKeys (ControlledAC2); //RDH 04Mar96 //Set control values in Model including Central deadzone and end clipping //#define PRINT_INPUT_DATA #ifdef PRINT_INPUT_DATA PrintVar(40, 15, "Raw Elev %.0f ", (FP)ControlledAC->fly.elevator); PrintVar(40, 16, "Raw Ailn %.0f ", (FP)ControlledAC->fly.aileron); PrintVar(40, 17, "Raw Rudd %.0f ", (FP)ControlledAC->fly.rudder); #endif if(_Analogue.tune[AU_ELEVATOR].mode == AM_REALISTIC) ApplyDeadZone (ControlledAC, ControlledAC->fly.elevator, pModel->Elevator, _Analogue.tune[AU_ELEVATOR].deadzones); else ApplyDeadZone2(ControlledAC, ControlledAC->fly.elevator, pModel->Elevator, _Analogue.tune[AU_ELEVATOR].deadzones); if(_Analogue.tune[AU_AILERON].mode == AM_REALISTIC) ApplyDeadZone (ControlledAC, ControlledAC->fly.aileron, pModel->Aileron, _Analogue.tune[AU_AILERON].deadzones); else ApplyDeadZone2(ControlledAC, ControlledAC->fly.aileron, pModel->Aileron, _Analogue.tune[AU_AILERON].deadzones); if(_Analogue.tune[AU_RUDDER].mode == AM_REALISTIC) ApplyDeadZone (ControlledAC, ControlledAC->fly.rudder, pModel->Rudder, _Analogue.tune[AU_RUDDER].deadzones); else ApplyDeadZone2(ControlledAC, ControlledAC->fly.rudder, pModel->Rudder, _Analogue.tune[AU_RUDDER].deadzones); FP temp = 1.0 - pModel->Speed / pModel->ControlLossV1; if(temp < 0.0) temp = 0.0; ControlledAC->fly.rudder = temp * ControlledAC->fly.rudder; pModel->Rudder = temp * pModel->Rudder; SecondaryControls (ControlledAC2); if(Save_Data.flightdifficulty[FD_SPINS]) { if(pModel->BombingPhase == 1) pModel->ElevatorTrim = 8192; if(pModel->BombingPhase == 2) { pModel->ElevatorTrim = 0; if(pModel->Elevator < -30000) pModel->Elevator = pModel->Elevator + 30000; else pModel->Elevator = 0; } pModel->Elevator += pModel->ElevatorTrim; pModel->Aileron += pModel->AileronTrim; pModel->Rudder += pModel->RudderTrim; if(Save_Data.flightdifficulty [FD_SLIPSTREAMEFFECTS]) pModel->Rudder += pModel->SlipstreamRudder; } MODLIMIT(pModel->Elevator, 32767); MODLIMIT(pModel->Aileron, 32767); MODLIMIT(pModel->Rudder, 32767); #ifdef PRINT_INPUT_DATA PrintVar(60, 15, "Mod Elev %.0f ", (FP)pModel->Elevator); PrintVar(60, 16, "Mod Ailn %.0f ", (FP)pModel->Aileron); PrintVar(60, 17, "Mod Rudd %.0f ", (FP)pModel->Rudder); #endif #ifdef PRINT_STICK_RUDDER temp = 39 + ControlledAC->fly.aileron / 1000; PrintVar(temp, 0, "%.0f", FP(ControlledAC->fly.aileron)); temp = 39 + ControlledAC->fly.rudder / 1000; PrintVar(temp, 23, "%.0f", FP(ControlledAC->fly.rudder)); temp = 12 + ControlledAC->fly.elevator / 2700; PrintVar(66, temp, "%.0f", FP(ControlledAC->fly.elevator)); temp = 39 + pModel->Aileron / 1000; PrintVar(temp, 1, "%.0f", FP(pModel->Aileron)); temp = 39 + pModel->Rudder / 1000; PrintVar(temp, 24, "%.0f", FP(pModel->Rudder)); temp = 12 + pModel->Elevator / 2700; PrintVar(73, temp, "%.0f", FP(pModel->Elevator)); #endif bool ThrottleSettingChanged = FALSE; bool PropSettingChanged = FALSE; PENGINE pEngine0 = pModel->EngineList; PENGINE pEngine1 = pModel->EngineList->List.NextItem(); if(pEngine0) { if(Key_Tests.KeyPress3d(FK_THROTTLE0)) { SLong tmpacthrust = pEngine0->ThrottleSetting; SLong delta = _Interactive.GetDelta(INST_THROTTLE, tmpacthrust); tmpacthrust += (delta*100)>>7; MODMAXMIN(tmpacthrust,0,100); pEngine0->ThrottleSetting = tmpacthrust; pModel->ModelThrottle = tmpacthrust; ControlledAC->fly.thrustpercent = tmpacthrust; } if(Key_Tests.KeyPress3d(FK_PROPPITCH0)) { SLong tmpacprop = 100.0 * pEngine0->PropSetting; SLong delta = _Interactive.GetDelta(INST_PROPPITCH, tmpacprop); tmpacprop += (delta*100)>>7; MODMAXMIN(tmpacprop,0,100); pEngine0->PropSetting = 0.01 * tmpacprop; pModel->ModelPropSetting = tmpacprop; ControlledAC->fly.propsetting = tmpacprop; }
//컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴 //Procedure DerivativeBase //Author Andrew McRae //Date Tue 17 Jun 1997 // //Description Used to calibrate model with linearized // stability derivatives // // This model is aerodynamically accurate // for small disturbances from level flight. // //Inputs // //Returns // //------------------------------------------------------------------------------ void Model::DerivativeBase () { /* Stability Derivatives Forces X,Y,Z Moments L,M,N Velocity u,v,w Angular Velocity p,q,r Roll, Pitch, Yaw inputs a,b,c Downward Acceleration wd (za) (r = density) (everything has 0.5) Forces Moments Forward Stbd Down Roll Pitch Yaw Xu rVS Yu ... Zu rVS Lu ... Mu rVSc Nu ... Xv ... Yv rVS Zv ... Lv rVSb Mv ... Nv rVSb Xw rVS Yw ... Zw rVS Lw ... Mw rVSc Nw ... Xp ... Yp rVSb Zp ... Lp rVSb2 Mp ... Np rVSb2 Xq rVSc Yq ... Zq rVSc Lq ... Mq rVSc2 Nq ... Xr ... Yr rVSb Zr ... Lr rVSb2 Mr ... Nr rVSb2 Xa ... Ya rV2S Za ... La rV2Sb Ma ... Na rV2Sb Xb rV2S Yb ... Zb rV2S Lb ... Mb rV2Sc Nb ... Xc ... Yc rV2S Zc ... Lc rV2Sb Mc ... Nc rV2Sb Xwd rSc Ywd ... Zwd rSc Lwd ... Mwd rSc2 Nwd ... */ typedef struct vel { FP u,v,w; } VEL; typedef struct rotvel { FP p,q,r; } ROTVEL; typedef struct ctrl { FP a,b,c; } CTRL; typedef struct acc { FP ud,vd,wd; } ACC; typedef struct veldervs { VEL X,Y,Z,L,M,N; } VELDERVS; typedef struct rotveldervs { ROTVEL X,Y,Z,L,M,N; } ROTVELDERVS; typedef struct ctrldervs { CTRL X,Y,Z,L,M,N; } CTRLDERVS; typedef struct accdervs { ACC X,Y,Z,L,M,N; } ACCDERVS; VELDERVS V; ROTVELDERVS RV; CTRLDERVS C; ACCDERVS A; //DeadCode AMM 24Nov99 MODEL_DT = 3; MODEL_LOOPS = 1; static Bool setup = TRUE; FP testalpha = -Degs2Rads ((FP)Elevator / 3000); if (testalpha > DEGS2RADS(10)) testalpha = DEGS2RADS(10); if (testalpha < DEGS2RADS(-10)) testalpha = DEGS2RADS(-10); if (setup) { // temp Pos.y = FT_3000; Vel.x = 0; Vel.y = 0; Vel.z = 150; Ori.x.x = 1; Ori.x.y = 0; Ori.x.z = 0; Ori.y.x = 0; Ori.y.y = 1; Ori.y.z = 0; Ori.z.x = 0; Ori.z.y = 0; Ori.z.z = 1; // RotOriXVec (Ori, testalpha); // RotOriXVec (Ori, DEGS2RADS(5)); RotOriYVec (Ori, DEGS2RADS(10)); RotVel.x = 0; RotVel.y = 0; RotVel.z = 0; RotVel.y = 0.00105; // 1 rpm RotVel.z = -0.00105; // temp end setup = FALSE; } // UpdateAirStruc (); Sky.Ambient (Pos.y, AmbDensity, AmbTemp, AmbPres); CalcAirVel (); GearTouched = FALSE; // Set Mass and Rot Inertia Mass = 0; NullVec (RotInertia); PMODEL pModel = ControlledAC->fly.pModel; PMASSPOINT pMass = MassList; while (pMass != NULL) { pMass->Process (pModel); pMass = pMass->List.NextItem (); } // ProcessEngines (); Mass = 617415; RotInertia.x = 1.49534e10; RotInertia.y = 3.59877e10; RotInertia.z = 4.98958e10; // WORK IN STANDARD UNITS // Calc Derivative Mutipliers FP B = (MainPlaneList->Area / MainPlaneList->Chord) * 0.01; FP Ch = MainPlaneList->Chord * 0.01; FP rS = 0.5 * (AmbDensity * 10000) * (MainPlaneList->Area * 0.0001); FP rVS = rS * AirSpeed; FP rVSb = rVS * B; FP rVSc = rVS * Ch; FP rVSb2 = rVSb * B; FP rVSc2 = rVSc * Ch; FP rV2S = rVS * AirSpeed; FP rV2Sb = rV2S * B; FP rV2Sc = rV2S * Ch; FP rSc = rS * Ch; FP rSc2 = rSc * Ch; // Get derivative inputs // Velocities FP u = -AirVel.z; FP v = -AirVel.x; FP w = AirVel.y; // Rotational velocities FP p = RotVel.z * 100; FP q = RotVel.x * 100; FP r = -RotVel.y * 100; // Calc Control inputs FP a = -((FP)Aileron * F2PIE * 20) / (32768 * 360); FP b = ((FP)Elevator * F2PIE * 20) / (32768 * 360); FP c = -((FP)Rudder * F2PIE * 20) / (32768 * 360); // Acceleration FP ud = 0; FP vd = 0; FP wd = 0; // Calc alpha FP alpha = CalcAngle (VecLen2D (u,v), w); if (alpha > DEGS2RADS(180)) alpha -= DEGS2RADS(360); alpha += DEGS2RADS (3); // alpha = testalpha; // if (alpha > DEGS2RADS(10)) alpha = DEGS2RADS(10); // if (alpha < DEGS2RADS(-10)) alpha = DEGS2RADS(-10); FP Sin = FSin (alpha); FP Cos = FCos (alpha); // Calc Cl, Cd FP Cl = alpha * 5.27; FP Cd = alpha * 0.29; #ifdef PRINT_DERV_DATA PrintVar (30, 16, "alp %.2f ", Rads2Degs(alpha)); PrintVar (45, 16, "Cl %.2f ", Cl); PrintVar (60, 16, "Cd %.2f ", Cd); PrintVar (30, 18, "u %.4f ", u); PrintVar (45, 18, "v %.4f ", v); PrintVar (60, 18, "w %.4f ", w); PrintVar (30, 19, "p %.4f ", p); PrintVar (45, 19, "q %.4f ", q); PrintVar (60, 19, "r %.4f ", r); #endif // Force Velocity dervs V.X.u = -Cd * u * rVS; V.Y.u = 0 * u * rVS; V.Z.u = -Cl * u * rVS; V.X.v = 0 * v * rVS; V.Y.v = -0.546 * v * rVS; V.Z.v = 0 * v * rVS; V.X.w = Cl * w * rVS; V.Y.w = 0 * w * rVS; V.Z.w = -Cd * w * rVS; // Moment Velocity dervs V.L.u = 0 * u * rVSb; V.M.u = 0 * u * rVSc; V.N.u = 0 * u * rVSb; V.L.v = -0.0654 * v * rVSb; V.M.v = 0 * v * rVSc; V.N.v = 0.118 * v * rVSb; V.L.w = 0 * w * rVSb; V.M.w = -0.44 * w * rVSc; V.N.w = 0 * w * rVSb; // ***************** // * V.M.w is iffy * // ***************** // Force RotVel dervs RV.X.p = 0; RV.Y.p = 0 * p * rVSb; RV.Z.p = 0; RV.X.q = 0 * q * rVSc; RV.Y.q = 0; RV.Z.q = 0 * q * rVSc; RV.X.r = 0; RV.Y.r = 0.1435 * r * rVSb; RV.Z.r = 0; // Moment RotVel dervs RV.L.p = -0.195 * p * rVSb2; RV.M.p = 0; RV.N.p = -0.008 * p * rVSb2; RV.L.q = 0; RV.M.q = -0.032 * q * rVSc2; RV.N.q = 0; RV.L.r = 0.0575 * r * rVSb2; RV.M.r = 0; RV.N.r = -0.067 * r * rVSb2; // Check M.q (c/2U ?????) // Force Control dervs C.X.a = 0; C.Y.a = 0 * a * rV2S; C.Z.a = 0; C.X.b = 0.43 * Sin * b * rV2S; C.Y.b = 0; C.Z.b = 0.43 * b * Cos * rV2S; C.X.c = 0; C.Y.c = 0.149 * c * rV2S; C.Z.c = 0; // Moment Control dervs C.L.a = -0.114 * a * rV2Sb; C.M.a = 0; C.N.a = 0.009 * a * rV2Sb; C.L.b = 0; C.M.b = -0.934 * b * rV2Sc; C.N.b = 0; C.L.c = 0.0057 * c * rV2Sb; C.M.c = 0; C.N.c = -0.069 * c * rV2Sb; // Z Acc dervs // use Cm alpha dot in F94A derv tables #ifdef PRINT_DERV_DATA PrintVar (30, 0, "V.X.u %.0f ", V.X.u); PrintVar (45, 0, "V.Y.u %.0f ", V.Y.u); PrintVar (60, 0, "V.Z.u %.0f ", V.Z.u); PrintVar (30, 1, "V.X.v %.0f ", V.X.v); PrintVar (45, 1, "V.Y.v %.0f ", V.Y.v); PrintVar (60, 1, "V.Z.v %.0f ", V.Z.v); PrintVar (30, 2, "V.X.w %.0f ", V.X.w); PrintVar (45, 2, "V.Y.w %.0f ", V.Y.w); PrintVar (60, 2, "V.Z.w %.0f ", V.Z.w); PrintVar (30, 4, "V.L.u %.0f ", V.L.u); PrintVar (45, 4, "V.M.u %.0f ", V.M.u); PrintVar (60, 4, "V.N.u %.0f ", V.N.u); PrintVar (30, 5, "V.L.v %.0f ", V.L.v); PrintVar (45, 5, "V.M.v %.0f ", V.M.v); PrintVar (60, 5, "V.N.v %.0f ", V.N.v); PrintVar (30, 6, "V.L.w %.0f ", V.L.w); PrintVar (45, 6, "V.M.w %.0f ", V.M.w); PrintVar (60, 6, "V.N.w %.0f ", V.N.w); PrintVar (30, 8, "RV.X.p %.0f ", RV.X.p); PrintVar (45, 8, "RV.Y.p %.0f ", RV.Y.p); PrintVar (60, 8, "RV.Z.p %.0f ", RV.Z.p); PrintVar (30, 9, "RV.X.q %.0f ", RV.X.q); PrintVar (45, 9, "RV.Y.q %.0f ", RV.Y.q); PrintVar (60, 9, "RV.Z.q %.0f ", RV.Z.q); PrintVar (30, 10, "RV.X.r %.0f ", RV.X.r); PrintVar (45, 10, "RV.Y.r %.0f ", RV.Y.r); PrintVar (60, 10, "RV.Z.r %.0f ", RV.Z.r); PrintVar (30, 12, "RV.L.p %.0f ", RV.L.p); PrintVar (45, 12, "RV.M.p %.0f ", RV.M.p); PrintVar (60, 12, "RV.N.p %.0f ", RV.N.p); PrintVar (30, 13, "RV.L.q %.0f ", RV.L.q); PrintVar (45, 13, "RV.M.q %.0f ", RV.M.q); PrintVar (60, 13, "RV.N.q %.0f ", RV.N.q); PrintVar (30, 14, "RV.L.r %.0f ", RV.L.r); PrintVar (45, 14, "RV.M.r %.0f ", RV.M.r); PrintVar (60, 14, "RV.N.r %.0f ", RV.N.r); #endif // calc forces FCRD force; force.x = V.X.u + V.X.v + V.X.w + RV.X.p + RV.X.q + RV.X.r + C.X.a + C.X.b + C.X.c; force.y = V.Y.u + V.Y.v + V.Y.w + RV.Y.p + RV.Y.q + RV.Y.r + C.Y.a + C.Y.b + C.Y.c; force.z = V.Z.u + V.Z.v + V.Z.w + RV.Z.p + RV.Z.q + RV.Z.r + C.Z.a + C.Z.b + C.Z.c; NettForce.x = force.y; NettForce.y = -force.z; NettForce.z = force.x; // calc moments FCRD moment; moment.x = V.L.u + V.L.v + V.L.w + RV.L.p + RV.L.q + RV.L.r + C.L.a + C.L.b + C.L.c; moment.y = V.M.u + V.M.v + V.M.w + RV.M.p + RV.M.q + RV.M.r + C.M.a + C.M.b + C.M.c; moment.z = V.N.u + V.N.v + V.N.w + RV.N.p + RV.N.q + RV.N.r + C.N.a + C.N.b + C.N.c; NettMoment.x = moment.y * 100; NettMoment.y = -moment.z * 100; NettMoment.z = moment.x * 100; // Engines PTHRUSTPOINT pThrust = ThrustList; while (pThrust != NULL) { pThrust->Process (); NettForce.x += pThrust->Force.x; NettForce.y += pThrust->Force.y; NettForce.z += pThrust->Force.z; pThrust = pThrust->List.NextItem (); } MODLIMIT (NettForce.x, 600000); MODLIMIT (NettForce.y, 2500000); MODLIMIT (NettForce.z, 600000); MODLIMIT (NettMoment.x, 250000000); MODLIMIT (NettMoment.y, 250000000); MODLIMIT (NettMoment.z, 250000000); CalcAcc (); //TempCode ARM 15Jul97 { //TempCode ARM 15Jul97 OldAcc.x = Acc.x; //TempCode ARM 15Jul97 OldAcc.y = Acc.y; //TempCode ARM 15Jul97 OldAcc.z = Acc.z; //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 Acc.x = (NettForce.x / Mass); //TempCode ARM 15Jul97 Acc.y = (NettForce.y / Mass); //TempCode ARM 15Jul97 Acc.z = (NettForce.z / Mass); //TempCode ARM 15Jul97 } CalcRotAcc (); //TempCode ARM 15Jul97 { //TempCode ARM 15Jul97 OldRotAcc.x = RotAcc.x; //TempCode ARM 15Jul97 OldRotAcc.y = RotAcc.y; //TempCode ARM 15Jul97 OldRotAcc.z = RotAcc.z; //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 RotAcc.x = (NettMoment.x / RotInertia.x); //TempCode ARM 15Jul97 RotAcc.y = (NettMoment.y / RotInertia.y); //TempCode ARM 15Jul97 RotAcc.z = (NettMoment.z / RotInertia.z); //TempCode ARM 15Jul97 } TransInt (ALL); //TempCode ARM 15Jul97 { //TempCode ARM 15Jul97 FCRD acc; //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 acc.x = (OldAcc.x + Acc.x) * 0.5; //TempCode ARM 15Jul97 acc.y = (OldAcc.y + Acc.y) * 0.5; //TempCode ARM 15Jul97 acc.z = (OldAcc.z + Acc.z) * 0.5; //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 TnsPnt (acc, acc, Ori); //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 OldVel.x = Vel.x; //TempCode ARM 15Jul97 OldVel.y = Vel.y; //TempCode ARM 15Jul97 OldVel.z = Vel.z; //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 Vel.x += acc.x * MODEL_DT; //TempCode ARM 15Jul97 Vel.y += (acc.y - GRAVITY) * MODEL_DT; //TempCode ARM 15Jul97 Vel.z += acc.z * MODEL_DT; //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 OldPos.x = Pos.x; //TempCode ARM 15Jul97 OldPos.y = Pos.y; //TempCode ARM 15Jul97 OldPos.z = Pos.z; //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 Pos.x += ((OldVel.x + Vel.x) * MODEL_DT) * 0.5; //TempCode ARM 15Jul97 Pos.y += ((OldVel.y + Vel.y) * MODEL_DT) * 0.5; //TempCode ARM 15Jul97 Pos.z += ((OldVel.z + Vel.z) * MODEL_DT) * 0.5; //TempCode ARM 15Jul97 } RotInt (ALL); //TempCode ARM 15Jul97 { //TempCode ARM 15Jul97 OldRotVel.x = RotVel.x; //TempCode ARM 15Jul97 OldRotVel.y = RotVel.y; //TempCode ARM 15Jul97 OldRotVel.z = RotVel.z; //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 RotVel.x += ((OldRotAcc.x + RotAcc.x) * MODEL_DT) * 0.5; //TempCode ARM 15Jul97 RotVel.y += ((OldRotAcc.y + RotAcc.y) * MODEL_DT) * 0.5; //TempCode ARM 15Jul97 RotVel.z += ((OldRotAcc.z + RotAcc.z) * MODEL_DT) * 0.5; //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 RotVelInt (); //TempCode ARM 15Jul97 } // UpdateAirStruc (); // Ground (); // Instruments (ControlledAC); }
//컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴 //Procedure ComplexEngineProcess //Author Craig Beeston //Date Wed 01 Dec 1999 // //Description Complex features for the Piston prop engines // Magnetos, Fuel cocks, Primer pump, Starter button, Temperature // //Inputs // //Returns // //------------------------------------------------------------------------------ void Engine::ComplexEngineProcess(AirStrucPtr const ControlledAC, FP fDamage, FP& fPower, FP& dTorque) { FP fuel = 0; //Check fuel tanks for(SWord i = 0; i < 4; i++) if((ControlledAC->fly.use_this_tank[i]) && (ControlledAC->fly.fuel_content[i] > 0)) fuel = 1; if((pModel->Type == AT_SPITFIRE) || (pModel->Type == AT_HURRICANE)) //Engines cut-out under negative G if(pModel->Inst.I_NormalAcc < 0) fuel = 0; if(fuel == 0) FuelInPipes -= 0.010 * MODEL_DT; else FuelInPipes += 0.001 * MODEL_DT; MODMAXMIN(FuelInPipes, 0, 1); fPower = 1; if(FuelInPipes < 0.75) { if(FuelInPipes < 0.25) fPower = 0; else if(Math_Lib.rnd(500) > 1000.0 * FuelInPipes - 250.0) fPower = 0; } //DeadCode CSB 3Jul00 fPower *= fDamage; if(fDamage < 1.0) { if(ThrottleSetting > -100.0 + 200.0 * fDamage) if(Math_Lib.rnd(200) < ThrottleSetting + 100.0 - 200.0 * fDamage) fPower = 0; } if(ControlledAC != Persons2::PlayerSeenAC) return; FP MaxSafeThrottle; if(Save_Data.flightdifficulty [FD_ENGINEMANAGMENT]) { FP MagFactor = 0.9; if(Magnetos == 0) MagFactor = 0; if(Magnetos == 3) MagFactor = 1; fPower *= MagFactor; switch(Starter) { case ES_ELECTRIC: { if(Starting) dTorque += p0 * 0.075; break; } case ES_INERTIA: { FP DeltaVel = -StarterSpeed; if(Starting) DeltaVel += 1; else dTorque += p0 * 0.4 * StarterSpeed; StarterSpeed += (DeltaVel * MODEL_ENGINE_DT) / 400.0; MODMAXMIN(StarterSpeed, 0, 1); break; } } FP frpm = Speed * 954.9296586 / Rpm100; if(fPower > 0) { FP temp = 0.4 - 0.0025 * Temperature; if(Priming > 0) temp = 0.15; //DEADCODE CSB 18/01/00 PrintVar(40, 18, "MinRpm %.0f ", FP(temp * Rpm100)); if(frpm < temp) fPower = 0; //DEADCODE CSB 11/01/00 else //DEADCODE CSB 11/01/00 fPower *= 1 - 0.00005 * (100.0 - Temperature) * (100.0 - Temperature); } Priming -= frpm * MODEL_ENGINE_DT * 0.0075; if(Priming < 0) Priming = 0; FP MaxSafeThrottle = -90.0 + 180.0 * fDamage; MODMAXMIN(MaxSafeThrottle, 0, 100); FP DesTemp = 100.0 + 2.0 * (ThrottleSetting - MaxSafeThrottle); //Max Throttle of 90 % MODMAXMIN(DesTemp, 100, 150); if((Power100 <= 0) || (fPower == 0)) //Engine Stopped DesTemp = 0; if(Temperature < DesTemp) Temperature += (DesTemp - Temperature) * 0.00005 * MODEL_ENGINE_DT; else Temperature -= Temperature * 0.000025 * MODEL_ENGINE_DT; } else { //Automated Stuff Magnetos = 3; //Both ON MaxSafeThrottle = -100.0 + 200.0 * fDamage; MODMAXMIN(MaxSafeThrottle, 0, 100); FP DesTemp = 100.0 + 2.0 * (ThrottleSetting - MaxSafeThrottle); //Max Throttle of 90 % MODMAXMIN(DesTemp, 100, 150); if((Power100 <= 0) || (fPower == 0)) //Engine Stopped DesTemp = 0; if(Temperature < DesTemp) Temperature += 0.001 * MODEL_ENGINE_DT; else Temperature -= 0.001 * MODEL_ENGINE_DT; } AircraftAnimData* adptr = (AircraftAnimData*) ControlledAC->Anim; SWord Damage = adptr->ENGINELEFT; if(pThrustPoint->Pos.x > 0) Damage = adptr->ENGINERIGHT; if((Damage < 254) && (Temperature > 100) && (Temperature - 100 > Math_Lib.rnd(16384 / MODEL_ENGINE_DT))) { Damage += 1; BitStates BS_Damage = BitStates(Damage); if(pThrustPoint->Pos.x > 0) SHAPE.ForceDamage(ControlledAC, ControlledAC, &adptr->ENGINERIGHT, BS_Damage); else SHAPE.ForceDamage(ControlledAC, ControlledAC, &adptr->ENGINELEFT, BS_Damage); if(Damage == 254) _Miles.PlaySample(FIL_SFX_EXPLOSION_ENGINE); //RJS 16Oct00 } #ifdef ENGINE_DATA PrintVar(40, 16, "Primer %.0f ", FP(pModel->Inst.C_PrimerPump0)); PrintVar(40, 17, "Priming %.3f ", FP(Priming)); PrintVar(40, 20, "Temp %.2f ", FP(Temperature)); PrintVar(40, 21, "Start %.3f ", FP(StarterSpeed)); PrintVar(40, 22, "Fuel %.3f ", FP(FuelInPipes)); PrintVar(40, 23, "Power %.3f ", FP(fPower)); PrintVar(40, 24, "Damage %.1f ", FP(Damage * 100.0 / 255.0)); #endif }
//컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴 //Procedure ProcessPistonEngine //Author Craig Beeston //Date Tue 11 Aug 98 // //Description Processes a piston engine // Calculates Thrust, Torque, Engine power and Engine speed // //Inputs // //Returns // //------------------------------------------------------------------------------ void Engine::ProcessPistonEngine (AirStrucPtr const ControlledAC) { AircraftAnimData* adptr = (AircraftAnimData *)ControlledAC->Anim; SWord iDamage = 255 - (255 - UWord(adptr->ENGINELEFT)) * (255 - UWord(adptr->FRONT)) / 255; if(pThrustPoint->Pos.x > 0) iDamage = adptr->ENGINERIGHT; FP MaxSpeed = 2 * Rpm100 * 0.001047197; //RPM 2 Rads/cs if(iDamage == 254) MaxSpeed = 0; FP fDamage = 1.0 - FP(iDamage) * (1.0 / 255.0); //DEADCODE CB 04/11/99 FP MinSpeed = Rpm0 * 0.001047197; //RPM 2 Rads/cs //DEADCODE CB 04/11/99 if (Speed < MinSpeed) Speed = MinSpeed; if (Speed > MaxSpeed) Speed = MaxSpeed; FP EngRPM = Speed * 954.9296586; FP PropSpeed = Speed * GearRatio; FP PropSwirl = SlipRot * 0.5; const FP BladeFract = 0.60; FCRD Vel; CPrd(Vel, pThrustPoint->Pos, pModel->RotVel); Vel.z -= pModel->AirVel.z; //Velocity of air ahead of prop FP PropAirVel = BladeFract * (PropSpeed - PropSwirl) * BladeRadius; FP InflowAng = CalcAngle (PropAirVel, PropVel); //Automatic prop control for AI aircraft if((!Save_Data.flightdifficulty [FD_PROPPITCH]) || (ControlledAC != Persons2::PlayerSeenAC)) { switch(PropType) { case PT_FIXED: break; case PT_2PITCH: if(EngRPM > 1.15 * Rpm100) PropSetting = 0; if(EngRPM < 0.7 * Rpm100) PropSetting = 1; break; case PT_VARIABLE: PropSetting = 1.0 - 1.15 * ControlledAC->vel_ / ControlledAC->classtype->maxvel; MODMAXMIN(PropSetting, 0.01, 1); break; case PT_CONSTSPEED: if(ThrottleSetting <= 75) PropSetting = 0; else PropSetting = (ThrottleSetting - 75.0) / 25.0; //DEADCODE CSB 31/01/00 PropSetting = FP(ThrottleSetting) * 0.01; //DEADCODE CSB 31/01/00 PropSetting = PropSetting * PropSetting * PropSetting; break; } } switch(PropType) { case PT_FIXED: { PropInc = PropMaxPitch; break; } case PT_2PITCH: { FP DesiredInc = PropMaxPitch; if(PropSetting > 0.5) DesiredInc = PropMinPitch; if(DesiredInc > PropInc) { PropInc += 0.002 * MODEL_ENGINE_DT; //AMM 24Nov99 if(PropInc > DesiredInc) PropInc = DesiredInc; } if(DesiredInc < PropInc) { PropInc -= 0.002 * MODEL_ENGINE_DT; //AMM 24Nov99 if(PropInc < DesiredInc) PropInc = DesiredInc; } break; } case PT_VARIABLE: { FP DesiredInc = PropMaxPitch; if(PropSetting > 0) { FP Ratio = 0.5 * (PropSetting + 1.0); DesiredInc = PropMinPitch * Ratio + PropMaxPitch * (1 - Ratio); } if(DesiredInc > PropInc) { PropInc += 0.002 * MODEL_ENGINE_DT; //AMM 24Nov99 if(PropInc > DesiredInc) PropInc = DesiredInc; } if(DesiredInc < PropInc) { PropInc -= 0.002 * MODEL_ENGINE_DT; //AMM 24Nov99 if(PropInc < DesiredInc) PropInc = DesiredInc; } break; } case PT_CONSTSPEED: { FP DesiredRpm = Rpm100 * (0.7 + 0.45 * PropSetting); FP PropPitchRate = (EngRPM - DesiredRpm) * 0.00001; PropInc += PropPitchRate * MODEL_ENGINE_DT; //AMM 24Nov99 break; } } MODMAXMIN(PropInc, PropMinPitch, PropMaxPitch); FP BladeSpeed = FSqrt(PropAirVel * PropAirVel + PropVel * PropVel); FP BladeQS = 0.5 * pModel->AmbDensity * BladeSpeed * BladeArea; //DeadCode AMM 29Jun99 J = PropVel / ((PropSpeed - PropSwirl) * 0.75 * BladeRadius); //Only Used for Text Screen FP BladeL = 4.53 * (PropInc - InflowAng); FP BladeD = 0.005 + (0.071 * BladeL * BladeL); MODMAXMIN(BladeL, -1.0, 1.5); BladeL *= BladeQS; BladeD *= BladeQS; Thrust = BladeL * PropAirVel - BladeD * PropVel; Torque = BladeD * PropAirVel + BladeL * PropVel; Torque *= BladeRadius * 0.5; //effective overall moment //Engine Power Output Power100 = pPower100->GetValue (EngRPM / Rpm100); Power0 = pPower0->GetValue (EngRPM / Rpm100); FP fPower = 0; FP dTorque = 0; ComplexEngineProcess(ControlledAC, fDamage, fPower, dTorque); const FP MinThrottle = 0.125; FP PowerFract = MinThrottle + ThrottleSetting * (1 - MinThrottle) * 0.01; PowerFract *= fPower; FP oldpower = Power; Power = Power0 + ((Power100 - Power0) * PowerFract); if((oldpower <= 0) && (Power > 0)) Trans_Obj.LaunchEngineStartup((mobileitem*)ControlledAC, *ControlledAC->currworld); if((oldpower > 0) && (Power <= 0) && (ControlledAC == Persons2::PlayerSeenAC)) _Miles.PlayOnce(FIL_SFX_ENGINE_COUGH,Save_Data.vol.engine); //RJS 27Sep00 Power *= pPowerAlt->GetValue(pModel->Pos.y * 0.01); Power *= p0; //#define ENGINE_DATA #ifdef ENGINE_DATA //DeadCode CSB 27/10/99 /* TEST CODE CSB 27/10/99 */if(pModel->bACM) /* TEST CODE CSB 27/10/99 */{ //DEADCODE CSB 11/01/00 /* TEST CODE CSB 29/09/99 */ PrintVar(40, 15, "Gravity %.3f ", FP(pModel->Inst.I_NormalAcc)); //DEADCODE CSB 11/01/00 /* TEST CODE CSB 29/09/99 */ PrintVar(40, 16, "IAS %.2f ", FP(pModel->Speed * FSqrt (pModel->AmbDensity / 0.0001225))); //DEADCODE CSB 11/01/00 /* TEST CODE CSB 29/09/99 */ PrintVar(40, 17, "Vel %.2f ", FP(ControlledAC->vel_ * 0.0001)); //DEADCODE CSB 11/01/00 /* TEST CODE CSB 29/09/99 */ PrintVar(40, 18, "DesRpm %.2f ", FP(pModel->ModelPropSetting)); /* TEST CODE CSB 29/09/99 */ PrintVar(20, 15, "Power %.0f ", FP(Power / 745.7)); /* TEST CODE CSB 29/09/99 */ PrintVar(20, 16, "RPM %.0f ", FP(EngRPM)); /* TEST CODE CSB 29/09/99 */ PrintVar(20, 17, "Prop Inc %.2f ", FP(Rads2Degs(PropInc))); /* TEST CODE CSB 29/09/99 */ PrintVar(20, 18, "Vel %.2f ", FP(-pModel->AirVel.z)); /* TEST CODE CSB 29/09/99 */ PrintVar(20, 19, "PropVel %.2f ", FP(PropVel)); /* TEST CODE CSB 29/09/99 */ PrintVar(20, 20, "SlipVel %.2f ", FP(SlipVel)); /* TEST CODE CSB 29/09/99 */ PrintVar(20, 21, "Alpha %.2f ", FP(Rads2Degs(PropInc - InflowAng))); /* TEST CODE CSB 29/09/99 */ PrintVar(20, 24, "ROC fpm %.0f ", FP(pModel->Vel.y * 3.2808 * 60.0)); /* TEST CODE CSB 29/09/99 */ PrintVar(20, 22, "Thrust %.1f ", FP(Thrust)); /* TEST CODE CSB 29/09/99 */ PrintVar(20, 23, "Eff %.3f ", FP(Thrust * -pModel->AirVel.z / Power)); /* TEST CODE CSB 27/10/99 */} #endif FP EngTorque = 0; if(Speed > 0) EngTorque = Power / Speed; EngTorque += dTorque; //Slipstream Conditions FP OldSlipRot = SlipRot; FP SlipInertia = BladeRadius * BladeRadius * BladeRadius * BladeRadius * 0.5 * FPIE * PropVel * pModel->AmbDensity; if(SlipInertia > 0) SlipRot = (Torque / SlipInertia + OldSlipRot) * 0.5; else SlipRot = 0; if(SlipRot > PropSpeed) SlipRot = PropSpeed; FP OldSlipVel = SlipVel; FP PropArea = FPIE * BladeRadius * BladeRadius; FP TempSlip = 2 * Thrust / (pModel->AmbDensity * PropArea) + Vel.z * Vel.z; if (TempSlip < 0) SlipVel = -Vel.z; else SlipVel = sqrt(TempSlip); SlipVel = (SlipVel + OldSlipVel) * 0.5; PropVel = 0.5 * (0.5 * (Vel.z + SlipVel) + PropVel); // calc engine speed FP EngRotAcc = (EngTorque - Torque * GearRatio) / MoI; //DeadCode CSB 27/10/99 if (!Save_Data.flightdifficulty [FD_THRUSTPOWERCONTROL]) //DeadCode CSB 27/10/99 EngRotAcc *= 2; //Fast Spooling //DEADCODE AMM 24/11/99 Speed += pModel->MODEL_DT * EngRotAcc; Speed += MODEL_ENGINE_DT * EngRotAcc; //AMM 24/11/99 if(Speed < 0) Speed = 0; //DEADCODE CB 04/11/99 if (Speed < MinSpeed) Speed = MinSpeed; if (Speed > MaxSpeed) Speed = MaxSpeed; Torque = -Torque * RotateDirection;//(EngTorque - Torque / GearRatio); //Reacted into Airframe if (Save_Data.flightdifficulty [FD_SLIPSTREAMEFFECTS]) { FCRD TempRot; CopyVec(pModel->RotVel, TempRot); TempRot.z += Speed * RotateDirection; moment.x = TempRot.x * PropInertia.x; moment.y = TempRot.y * PropInertia.y; moment.z = TempRot.z * PropInertia.z; CPrd(moment, moment, TempRot); moment.x *= -1; moment.y *= -1; moment.z *= -1; } else NullVec(moment); }