//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- int CDebugHistory::Restore( IRestore &restore ) { ClearHistories(); int iVersion = restore.ReadInt(); if ( iVersion >= DEBUG_HISTORY_FIRST_VERSIONED ) { int iMaxCategorys = restore.ReadInt(); for ( int iCategory = 0; iCategory < MIN(iMaxCategorys,MAX_HISTORY_CATEGORIES); iCategory++ ) { int iEnd = restore.ReadInt(); m_DebugLineEnd[iCategory] = m_DebugLines[iCategory] + iEnd; restore.ReadData( m_DebugLines[iCategory], sizeof(m_DebugLines[iCategory]), 0 ); } } else { int iMaxCategorys = iVersion; for ( int iCategory = 0; iCategory < MIN(iMaxCategorys,MAX_HISTORY_CATEGORIES); iCategory++ ) { int iEnd = restore.ReadInt(); m_DebugLineEnd[iCategory] = m_DebugLines[iCategory] + iEnd; restore.ReadData( m_DebugLines[iCategory], sizeof(m_DebugLines[iCategory]), 0 ); } } return BaseClass::Restore(restore); }
void CVX_Sim::ClearAll(void) //Reset all initialized variables { Initalized = false; LocalVXC.ClearMatter(); //This should be all the stuff set by "Import()" VoxArray.clear(); BondArray.clear(); XtoSIndexMap.clear(); StoXIndexMap.clear(); SurfVoxels.clear(); OrigVoxArray.clear(); A.clear(); B.clear(); C.clear(); D.clear(); OrigBondArray.clear(); MaxDispSinceLastBondUpdate = (vfloat)FLT_MAX; //arbitrarily high as a flag to populate bonds ClearHistories(); dt = (vfloat)0.0; //calculated per-step CurTime = (vfloat)0.0; CurStepCount = 0; DtFrozen = false; SS.Clear(); IniCM = Vec3D<>(0,0,0); CurXSel = -1; Dragging = false; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- int CDebugHistory::Restore( IRestore &restore ) { ClearHistories(); int iMaxCategorys = restore.ReadInt(); for ( int iCategory = 0; iCategory < MIN(iMaxCategorys,MAX_HISTORY_CATEGORIES); iCategory++ ) { int iEnd = restore.ReadInt(); m_DebugLineEnd[iCategory] = m_DebugLines[iCategory] + iEnd; restore.ReadData( m_DebugLines[iCategory], sizeof(m_DebugLines[iCategory]), 0 ); } return BaseClass::Restore(restore); }
void CVX_Sim::ResetSimulation(void) { int iT = NumVox(); for (int i=0; i<iT; i++) VoxArray[i].ResetVoxel(); iT = NumBond(); for (int j=0; j<iT; j++) BondArray[j].ResetBond(); CurTime = (vfloat)0.0; CurStepCount = 0; ClearHistories(); SS.Clear(); }
//----------------------------------------------------------------------------- // Spawn //----------------------------------------------------------------------------- void CDebugHistory::Spawn() { BaseClass::Spawn(); #ifdef DISABLE_DEBUG_HISTORY UTIL_Remove( this ); #else if ( g_pGameRules && g_pGameRules->IsMultiplayer() ) { UTIL_Remove( this ); } else { Warning( "DEBUG HISTORY IS ENABLED. Disable before release (in env_debughistory.h).\n" ); } #endif ClearHistories(); }
void QVX_TensileTest::RunTensileTest(QString* pDispMessage) { QFile File(OutFilePath); if (!File.open(QIODevice::WriteOnly | QIODevice::Text)) { ProgressMessage = "Could not open file. Aborting."; return; } QTextStream out(&File); // double CurMaxDisp = 9e9; std::string IntMsg; vfloat StepPercAmt = 1.0/NumStep; int VoxCount = NumVox(); int count = 0; int MinimumPerStep = 5; int NumBCs = pEnv->GetNumBCs(); for (int j=0; j<NumBCs; j++){ if (pEnv->GetBC(j)->Displace.Length2() == 0 ) continue; //if zero displacement, continue out << "Disp (m)" << "\t" << "Force (N)" << "\t"; if (IsBasicTensile){out << "Strain (%)" << "\t" << "Stress (MPa)" << "\t" << "Modulus (MPa)" << "\t";} } out << "\n"; double LastStress; //so we can calculate modulus at each point... double LastStrain; for (int i=0; i<NumStep; i++){ ProgressMessage = "Performing tensile test..."; for (int j=0; j<VoxCount; j++) VoxArray[j].ScaleExternalInputs((i+1)*StepPercAmt); //wiat to settle between timesteps... int LastBroken = -1; ClearHistories(); //needed so it doesn't immediately "converge" on the next time step while (NumBroken() != LastBroken){ //if one breaks, repeat the settling undtil we're done breaking... LastBroken = NumBroken(); EnableFailure(false); // SetSlowDampZ(CurDamp); count = 0; // bool LastUnder = false; //were we under the threshhold last time? // while (!LastUnder || CurMaxDisp > ConvThresh){ while (!StopConditionMet()){ // if (CurMaxDisp < ConvThresh) LastUnder = true; for (int i=0; i<MinimumPerStep; i++){ if (CancelFlag) break; if (!TimeStep(&IntMsg)){ //always do at least 5 steps... ProgressMessage = "Tensile test failed. \n \n" + IntMsg; CancelFlag = true; //get outta here! } // CurMaxDisp = SS.NormObjDisp; } if (CancelFlag) break; count+=MinimumPerStep; if (count > 20000){ QString Num = QString::number(MaxMoveHistory[0]*1000); ProgressMessage = "Simulation not converging at " + Num.toStdString() + ". \n Retry with larger threshold."; } } if (CancelFlag) break; EnableFailure(true); //do one step to apply breaking and re-settle as needed... if (!TimeStep(&IntMsg)){ ProgressMessage = "Tensile test failed. \n \n" + IntMsg; CancelFlag = true; //get outta here! } } for (int j=0; j<NumBCs; j++){ CVX_FRegion* pThisBC = pEnv->GetBC(j); if (pThisBC->Displace.Length2() != 0 ){ //if non-zero displacement double CurDisp = pThisBC->Displace.Length()*(i+1.0)/((double)NumStep); double tmp2 = -GetSumForceDir(pThisBC); out << CurDisp << "\t" << tmp2 << "\t"; if (IsBasicTensile){ //only two materials, only one with displacement, so we should only ever enter here once!! double ThisStress = tmp2/CSArea; double ThisStrain = CurDisp/IniLength; out << ThisStrain*100 << "\t" << ThisStress/1e6 << "\t"; if (i!=0) out << (ThisStress-LastStress)/(ThisStrain-LastStrain)/1e6 << "\t"; else out << "" << "\t"; LastStress = ThisStress; LastStrain = ThisStrain; } } } out << "\n"; // for (int k=0; k<VoxArray.size(); k++){ // VoxArray[k].ExternalDisp *= (i+2.0)/(i+1.0); // } CurTick = i+1; } int stop = 1; File.close(); ProgressMessage = ""; //flag to not display message boc on return... TestRunning = false; emit StopExternalGLUpdate(); }
void QVX_TensileTest::RunTensileTest(QString* pDispMessage) { QFile File(OutFilePath); if (!File.open(QIODevice::WriteOnly | QIODevice::Text)) { ProgressMessage = "Could not open file. Aborting."; return; } QTextStream out(&File); // double CurMaxDisp = 9e9; std::string IntMsg; vfloat StepPercAmt = 1.0/NumStep; int VoxCount = NumVox(); int count = 0; int MinimumPerStep = 5; int NumBCs = pEnv->GetNumBCs(); for (int j=0; j<NumBCs; j++){ if (pEnv->GetBC(j)->Displace.Length2() == 0 ) continue; //if zero displacement, continue out << "Disp (m)" << "\t" << "Force (N)" << "\t"; if (IsBasicTensile){out << "Strain (%)" << "\t" << "Stress (MPa)" << "\t" << "Modulus (MPa)" << "\t";} } out << "\n"; double LastStress; //so we can calculate modulus at each point for simple tensile... double LastStrain; double MaxMotion = -FLT_MAX; //the stop condition will be a threshold of this in auto mode double LastMotion = 0; bool FoundMaxMotion = false; if (AutoConverge){ ConvThresh = 0; SetStopConditionValue(ConvThresh);}//don't stop until we get a max for (int i=0; i<NumStep; i++){ ProgressMessage = "Performing tensile test..."; for (int j=0; j<VoxCount; j++) VoxArray[j].ScaleExternalInputs((i+1)*StepPercAmt); //wiat to settle between timesteps... int LastBroken = -1; ClearHistories(); //needed so it doesn't immediately "converge" on the next time step while (NumBroken() != LastBroken){ //if one breaks, repeat the settling until we're done breaking... LastBroken = NumBroken(); EnableFeature(VXSFEAT_FAILURE, false); // EnableFailure(false); // SetSlowDampZ(CurDamp); count = 0; // bool LastUnder = false; //were we under the threshhold last time? // while (!LastUnder || CurMaxDisp > ConvThresh){ while (!StopConditionMet()){ // if (CurMaxDisp < ConvThresh) LastUnder = true; for (int i=0; i<MinimumPerStep; i++){ if (CancelFlag) break; if (!TimeStep(&IntMsg)){ //always do at least 5 steps... ProgressMessage = "Tensile test failed. \n \n" + IntMsg; CancelFlag = true; //get outta here! } // CurMaxDisp = SS.NormObjDisp; } if (CancelFlag) break; if (!FoundMaxMotion && AutoConverge){ if (MotionZeroed){ //find first max motion (actually max KE, but close enough) FoundMaxMotion = true; ConvThresh = LastMotion / AutoConvergeExp; SetStopConditionValue(ConvThresh); //ProgressMessage = "Auto convergence threshhold calculated: " + QString::number(ConvThresh).toStdString(); } else LastMotion = SS.MaxVoxVel*dt; } if (count%100==0){ ProgressMessage = "Performing tensile test..."; if (AutoConverge && !FoundMaxMotion) ProgressMessage += "\nDetermining convergence threshhold."; //else ProgressMessage += "\nMotion at " + QString::number(MaxMoveHistory[0]*1000000, 'g', 3).toStdString() + "/" + QString::number(ConvThresh, 'g', 3).toStdString(); else ProgressMessage += "\nStep " + QString::number(count, 'g', 3).toStdString() +/*", Max Displacement " + QString::number(SS.MaxVoxDisp, 'g', 3).toStdString() + */", Convergence threshhold " + QString::number(ConvThresh, 'g', 3).toStdString(); if (count > 20000){ ProgressMessage += "\nSimulation not converging.\nConsider retrying with a larger threshold. (Currently " + QString::number(MaxMoveHistory[0]*1000, 'g', 3).toStdString() +")"; } } count+=MinimumPerStep; } if (CancelFlag) break; EnableFeature(VXSFEAT_FAILURE, true); // EnableFailure(true); //do one step to apply breaking and re-settle as needed... if (!TimeStep(&IntMsg)){ ProgressMessage = "Tensile test failed. \n \n" + IntMsg; CancelFlag = true; //get outta here! } } for (int j=0; j<NumBCs; j++){ CVX_FRegion* pThisBC = pEnv->GetBC(j); if (pThisBC->Displace.Length2() != 0 ){ //if non-zero displacement double CurDisp = pThisBC->Displace.Length()*(i+1.0)/((double)NumStep); double tmp2 = -GetSumForceDir(pThisBC); out << CurDisp << "\t" << tmp2 << "\t"; if (IsBasicTensile){ //only two materials, only one with displacement, so we should only ever enter here once!! double ThisStress = tmp2/CSArea; double ThisStrain = CurDisp/IniLength; out << ThisStrain*100 << "\t" << ThisStress/1e6 << "\t"; if (i!=0) out << (ThisStress-LastStress)/(ThisStrain-LastStrain)/1e6 << "\t"; else out << "" << "\t"; LastStress = ThisStress; LastStrain = ThisStrain; } } } out << "\n"; // for (int k=0; k<VoxArray.size(); k++){ // VoxArray[k].ExternalDisp *= (i+2.0)/(i+1.0); // } CurTick = i+1; } int stop = 1; File.close(); ProgressMessage = ""; //flag to not display message boc on return... TestRunning = false; emit StopExternalGLUpdate(); }