← Back to team overview

yade-dev team mailing list archive

[svn] r1887 - in trunk/pkg/common: . Engine/DeusExMachina

 

Author: gladky_anton
Date: 2009-07-27 17:00:20 +0200 (Mon, 27 Jul 2009)
New Revision: 1887

Added:
   trunk/pkg/common/Engine/DeusExMachina/PressTestEngine.cpp
   trunk/pkg/common/Engine/DeusExMachina/PressTestEngine.hpp
Modified:
   trunk/pkg/common/SConscript
Log:
1. Added PressTestEngine for simulating presses. 
   Can be used and for PointLoadTest simulations.



Added: trunk/pkg/common/Engine/DeusExMachina/PressTestEngine.cpp
===================================================================
--- trunk/pkg/common/Engine/DeusExMachina/PressTestEngine.cpp	2009-07-27 06:58:46 UTC (rev 1886)
+++ trunk/pkg/common/Engine/DeusExMachina/PressTestEngine.cpp	2009-07-27 15:00:20 UTC (rev 1887)
@@ -0,0 +1,68 @@
+/*************************************************************************
+*    Copyright (C) 2009 Anton Gladkyy gladky.anton@xxxxxxxxx             *
+*                                                                        *
+*    This program is free software: you can redistribute it and/or modify*
+*    it under the terms of the GNU General Public License as published by*
+*    the Free Software Foundation, either version 3 of the License, or   *
+*    (at your option) any later version.                                 *
+*                                                                        *
+*    This program is distributed in the hope that it will be useful,     *
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of      *
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *
+*    GNU General Public License for more details.                        *
+*                                                                        *
+*    You should have received a copy of the GNU General Public License   *
+*    along with this program.  If not, see <http://www.gnu.org/licenses/>*
+**************************************************************************/
+
+#include"PressTestEngine.hpp"
+#include<yade/pkg-common/ParticleParameters.hpp>
+#include<yade/core/MetaBody.hpp>
+
+
+void PressTestEngine::applyCondition(MetaBody * ncb){
+	if (curentDirection != stop) {
+		if (curentDirection==forward) { 										 //Forward direction of the press
+			FOREACH(body_id_t id, subscribedBodies){
+				assert(ncb->bodies->exists(id));
+				currentVerticalForce = ncb->bex.getForce(id)[2]; //Define current vertical force
+				minimalForce = maxVerticalForce*0.1;						 //Define minimal edge of te force (10% from Maximal)
+				if (currentVerticalForce > maxVerticalForce) {	 //Force increasing. Press is working normally
+					maxVerticalForce = currentVerticalForce;
+				} else if ((currentVerticalForce<=(minimalForce))&&(maxVerticalForce !=0)) {
+					/*
+					 * Force is decreased lower, than minimal. The body seems "cracked".
+					 * Starting the countdown
+					 */ 
+					currentIterationAfterDestruction++;
+					if (currentIterationAfterDestruction>=numberIterationAfterDestruction) {
+						/*
+						 * The body definitly cracked. Change the direction of press and increase the velosity in 5 times.
+						 */ 
+						curentDirection=backward;
+						TranslationEngine::velocity *= -pressVelocityForw2Back;
+						currentIterationAfterDestruction = (Omega::instance().getCurrentIteration())/pressVelocityForw2Back;
+					}
+				}  else if (((currentIterationAfterDestruction!=0)&&(maxVerticalForce !=0))) {
+					/*
+					 * We have found, that it was not "Finish destruction"
+					 * Abnulling currentIterationAfterDestruction
+					 */
+					currentIterationAfterDestruction=0;
+				}
+			}
+			TranslationEngine::applyCondition(ncb);
+		} else if (curentDirection==backward) {							 //The press returns back to the normal position
+			if (currentIterationAfterDestruction > 0) {
+				currentIterationAfterDestruction--;
+				TranslationEngine::applyCondition(ncb);
+			} else {
+				curentDirection=stop;														//If the press is in normal position -> STOP
+				Omega::instance().stopSimulationLoop();					//Stop simulation loop
+			}
+		}
+	}
+}
+
+CREATE_LOGGER(PressTestEngine);
+YADE_PLUGIN("PressTestEngine");

Added: trunk/pkg/common/Engine/DeusExMachina/PressTestEngine.hpp
===================================================================
--- trunk/pkg/common/Engine/DeusExMachina/PressTestEngine.hpp	2009-07-27 06:58:46 UTC (rev 1886)
+++ trunk/pkg/common/Engine/DeusExMachina/PressTestEngine.hpp	2009-07-27 15:00:20 UTC (rev 1887)
@@ -0,0 +1,42 @@
+/*************************************************************************
+*    Copyright (C) 2009 Anton Gladkyy gladky.anton@xxxxxxxxx             *
+*                                                                        *
+*    This program is free software: you can redistribute it and/or modify*
+*    it under the terms of the GNU General Public License as published by*
+*    the Free Software Foundation, either version 3 of the License, or   *
+*    (at your option) any later version.                                 *
+*                                                                        *
+*    This program is distributed in the hope that it will be useful,     *
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of      *
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *
+*    GNU General Public License for more details.                        *
+*                                                                        *
+*    You should have received a copy of the GNU General Public License   *
+*    along with this program.  If not, see <http://www.gnu.org/licenses/>*
+**************************************************************************/
+
+#pragma once
+#include"TranslationEngine.hpp"
+#include<yade/core/DeusExMachina.hpp>
+
+class PressTestEngine: public TranslationEngine{
+	/*
+	 * This class simulates the simple press work
+	 * When the press "cracks" the solid brittle material,
+	 * it returns back to the initial position 
+	 * and stops the simulation loop.
+	 */ 
+	public:
+		enum motionDirection {forward, backward, stop};
+		motionDirection curentDirection;
+		Real currentVerticalForce, maxVerticalForce, minimalForce;
+		long int numberIterationAfterDestruction, currentIterationAfterDestruction;
+		int pressVelocityForw2Back;
+		PressTestEngine(): curentDirection(forward), currentVerticalForce(0), maxVerticalForce(0), currentIterationAfterDestruction(0), pressVelocityForw2Back(25) {};
+		virtual ~PressTestEngine(){};
+		virtual void applyCondition(MetaBody*);
+	REGISTER_CLASS_AND_BASE(PressTestEngine,TranslationEngine);
+	REGISTER_ATTRIBUTES(TranslationEngine, (numberIterationAfterDestruction));
+	DECLARE_LOGGER;
+};
+REGISTER_SERIALIZABLE(PressTestEngine);

Modified: trunk/pkg/common/SConscript
===================================================================
--- trunk/pkg/common/SConscript	2009-07-27 06:58:46 UTC (rev 1886)
+++ trunk/pkg/common/SConscript	2009-07-27 15:00:20 UTC (rev 1887)
@@ -49,6 +49,8 @@
 		LIBS=env['LIBS']+['ParticleParameters']),
 	env.SharedLibrary('CinemDNCEngine',['Engine/DeusExMachina/CinemDNCEngine.cpp'],
 		LIBS=env['LIBS']+['ParticleParameters','RigidBodyParameters']),
+	env.SharedLibrary('PressTestEngine',['Engine/DeusExMachina/PressTestEngine.cpp'],
+		LIBS=env['LIBS']+['TranslationEngine']),
 
 	env.SharedLibrary('CinemCNCEngine',
 		['Engine/DeusExMachina/CinemCNCEngine.cpp'],