← Back to team overview

yade-dev team mailing list archive

[svn] r1720 - trunk/pkg/snow/Engine

 

Author: cosurgi
Date: 2009-03-16 01:20:35 +0100 (Mon, 16 Mar 2009)
New Revision: 1720

Added:
   trunk/pkg/snow/Engine/ElawSnowLayersDeformation.cpp
   trunk/pkg/snow/Engine/ElawSnowLayersDeformation.hpp
Log:
I forgot to add those, sorry. (I wonder how it could stay unnoticed for so long ;)



Added: trunk/pkg/snow/Engine/ElawSnowLayersDeformation.cpp
===================================================================
--- trunk/pkg/snow/Engine/ElawSnowLayersDeformation.cpp	2009-03-13 09:08:31 UTC (rev 1719)
+++ trunk/pkg/snow/Engine/ElawSnowLayersDeformation.cpp	2009-03-16 00:20:35 UTC (rev 1720)
@@ -0,0 +1,187 @@
+/*************************************************************************
+*  Copyright (C) 2009 by Janek Kozicki                                   *
+*  cosurgi@xxxxxxxxxx                                                    *
+*                                                                        *
+*  This program is free software; it is licensed under the terms of the  *
+*  GNU General Public License v2 or later. See file LICENSE for details. *
+*************************************************************************/
+
+#include"ElawSnowLayersDeformation.hpp"
+#include<yade/pkg-dem/CohesiveFrictionalBodyParameters.hpp>
+#include<yade/pkg-dem/SpheresContactGeometry.hpp>
+#include<yade/pkg-dem/CohesiveFrictionalContactInteraction.hpp>
+#include<yade/pkg-dem/SDECLinkPhysics.hpp>
+#include<yade/core/Omega.hpp>
+#include<yade/core/MetaBody.hpp>
+#include<yade/pkg-common/Force.hpp>
+#include<yade/pkg-common/Momentum.hpp>
+#include<yade/core/PhysicalAction.hpp>
+#include<yade/pkg-snow/BssSnowGrain.hpp>
+#include<yade/pkg-snow/BshSnowGrain.hpp>
+
+
+ElawSnowLayersDeformation::ElawSnowLayersDeformation() : InteractionSolver() , actionForce(new Force) , actionMomentum(new Momentum)
+{
+	sdecGroupMask=1;
+	creep_viscosity = 1000.0;
+}
+
+
+void ElawSnowLayersDeformation::registerAttributes()
+{
+	InteractionSolver::registerAttributes();
+	REGISTER_ATTRIBUTE(sdecGroupMask);
+	REGISTER_ATTRIBUTE(creep_viscosity);
+}
+
+void ElawSnowLayersDeformation::action(MetaBody* ncb)
+{
+	//return;
+	shared_ptr<BodyContainer>& bodies = ncb->bodies;
+
+//	Real dt = Omega::instance().getTimeStep();
+	InteractionContainer::iterator ii    = ncb->transientInteractions->begin();
+	InteractionContainer::iterator iiEnd = ncb->transientInteractions->end();
+	for (  ; ii!=iiEnd ; ++ii )
+	{
+		if ((*ii)->isReal)
+		{
+			const shared_ptr<Interaction>& contact = *ii;
+			int id1 = contact->getId1();
+			int id2 = contact->getId2();
+
+
+
+//			if(!(((id1 == 17 && id2 == 13) || (id1 == 13 && id2 == 17))))
+//				continue;
+
+			if ( !( (*bodies)[id1]->getGroupMask() & (*bodies)[id2]->getGroupMask() & sdecGroupMask)  )
+				continue; // skip other groups,
+
+			std::cerr << __FILE__ << " " << id1 << " " << id2 << "\n";
+
+			CohesiveFrictionalBodyParameters* de1 			= YADE_CAST<CohesiveFrictionalBodyParameters*>((*bodies)[id1]->physicalParameters.get());
+			CohesiveFrictionalBodyParameters* de2 			= YADE_CAST<CohesiveFrictionalBodyParameters*>((*bodies)[id2]->physicalParameters.get());
+//			SpheresContactGeometry* currentContactGeometry		= YADE_CAST<SpheresContactGeometry*>(contact->interactionGeometry.get());
+			CohesiveFrictionalContactInteraction* currentContactPhysics = YADE_CAST<CohesiveFrictionalContactInteraction*> (contact->interactionPhysics.get());
+
+			BssSnowGrain* b1 = dynamic_cast<BssSnowGrain*>((*bodies)[id1]->interactingGeometry.get());
+			BssSnowGrain* b2 = dynamic_cast<BssSnowGrain*>((*bodies)[id2]->interactingGeometry.get());
+			
+			BshSnowGrain* B1 = dynamic_cast<BshSnowGrain*>((*bodies)[id1]->geometricalModel.get());
+			BshSnowGrain* B2 = dynamic_cast<BshSnowGrain*>((*bodies)[id2]->geometricalModel.get());
+
+			Vector3r F = currentContactPhysics->shearForce + currentContactPhysics->normalForce;
+
+			//FIXME: moment is still not used...
+			Vector3r M = currentContactPhysics->moment_twist + currentContactPhysics->moment_bending;
+
+			if(b1)
+			{
+				Vector3r c1 = b1->m_copy.c_axis;
+				c1 /= c1.Length();
+				//FIXME: make sure that F is always in correct direction
+				F *= -1.0;
+				Vector3r F1 = de1->se3.orientation.Conjugate() * F;
+				F1 = F1 - c1*F1.Dot(c1);
+				b1->m_copy.has_deformed();
+				B1->has_deformed();
+
+				std::vector<Real> layer_totals;
+				Real all_layers_total(0);
+				layer_totals.resize(b1->m_copy.slices.size() , 0);
+
+				BOOST_FOREACH(const depth_one& t,b1->depths[id2])
+				{
+					int i  = t.i;
+					//int j  = t.j;
+
+					layer_totals[i] += 1.0;//+= t.current_depth - t.original_depth;
+					++all_layers_total;
+					//b1->m_copy.slices[i][j] += F1/(creep_viscosity);
+					//B1->       slices[i][j] += F1/(creep_viscosity);
+				}
+
+				for(size_t i = 0 ; i < b1->m_copy.slices.size() ; ++i )
+				{
+					if(layer_totals[i] > 0)
+					{
+						for(size_t j = 0 ; j < b1->m_copy.slices[0].size() ; ++j )
+						{
+							b1->m_copy.slices[i][j] += (F1*layer_totals[i])/(creep_viscosity*all_layers_total);
+							B1->       slices[i][j] += (F1*layer_totals[i])/(creep_viscosity*all_layers_total);
+						}
+					}
+				}
+
+			//	for(size_t i=0;i < b1->m_copy.slices.size();++i)
+			//	{
+			//		for(size_t j=0 ; j < b1->m_copy.slices[i].size() ; ++j)
+			//		{
+			//			//if(b1->m_copy.slices[i][j][2]>0)
+			//			{
+			//				b1->m_copy.slices[i][j] += F1/(creep_viscosity);
+			//				B1->       slices[i][j] += F1/(creep_viscosity);
+			//			}
+			//		}
+			//	}
+			}
+
+			if(b2)
+			{
+				Vector3r c2 = b2->m_copy.c_axis;
+				c2 /= c2.Length();
+				F *= -1.0;
+				Vector3r F2 = de2->se3.orientation.Conjugate() * F;
+				F2 = F2 - c2*F2.Dot(c2);
+				b2->m_copy.has_deformed();
+				B2->has_deformed();
+
+				std::vector<Real> layer_totals;
+				Real all_layers_total(0);
+				layer_totals.resize(b2->m_copy.slices.size() , 0);
+
+				BOOST_FOREACH(const depth_one& t,b2->depths[id1])
+				{
+					int i  = t.i;
+					//int j  = t.j;
+
+					layer_totals[i] += 1.0;//+= t.current_depth - t.original_depth; 
+					// FIXME: divide force between all layers proportionally to sum of (t.current_depth - t.original_depth) of all nodes in each layer 
+					++all_layers_total;
+					//b2->m_copy.slices[i][j] += F2/(creep_viscosity);
+					//B2->       slices[i][j] += F2/(creep_viscosity);
+				}
+
+				for(size_t i = 0 ; i < b2->m_copy.slices.size() ; ++i )
+				{
+					if(layer_totals[i] > 0)
+					{
+						for(size_t j = 0 ; j < b2->m_copy.slices[0].size() ; ++j )
+						{
+							b2->m_copy.slices[i][j] += (F2*layer_totals[i])/(creep_viscosity*all_layers_total);
+							B2->       slices[i][j] += (F2*layer_totals[i])/(creep_viscosity*all_layers_total);
+						}
+					}
+				}
+
+
+			//	for(size_t i=0;i < b2->m_copy.slices.size();++i)
+			//	{
+			//		for(size_t j=0 ; j < b2->m_copy.slices[i].size() ; ++j)
+			//		{
+			//			//if(b2->m_copy.slices[i][j][2]>0)
+			//			{
+			//				b2->m_copy.slices[i][j] += F2/(creep_viscosity);
+			//				B2->       slices[i][j] += F2/(creep_viscosity);
+			//			}
+			//		}
+			//	}
+			}
+
+		}
+	}
+}
+
+YADE_PLUGIN();
+

Added: trunk/pkg/snow/Engine/ElawSnowLayersDeformation.hpp
===================================================================
--- trunk/pkg/snow/Engine/ElawSnowLayersDeformation.hpp	2009-03-13 09:08:31 UTC (rev 1719)
+++ trunk/pkg/snow/Engine/ElawSnowLayersDeformation.hpp	2009-03-16 00:20:35 UTC (rev 1720)
@@ -0,0 +1,41 @@
+/*************************************************************************
+*  Copyright (C) 2009 by Janek Kozicki                                   *
+*  cosurgi@xxxxxxxxxx                                                    *
+*                                                                        *
+*  This program is free software; it is licensed under the terms of the  *
+*  GNU General Public License v2 or later. See file LICENSE for details. *
+*************************************************************************/
+
+#pragma once
+
+#include<yade/core/InteractionSolver.hpp>
+
+#include <set>
+#include <boost/tuple/tuple.hpp>
+
+class PhysicalAction;
+
+class ElawSnowLayersDeformation : public InteractionSolver
+{
+/// Attributes
+	private :
+		shared_ptr<PhysicalAction> actionForce;
+		shared_ptr<PhysicalAction> actionMomentum;
+
+	public :
+		int sdecGroupMask;
+		Real creep_viscosity;
+	
+		ElawSnowLayersDeformation();
+		void action(MetaBody*);
+
+	protected :
+		void registerAttributes();
+	NEEDS_BEX("Force","Momentum");
+	REGISTER_CLASS_NAME(ElawSnowLayersDeformation);
+	REGISTER_BASE_CLASS_NAME(InteractionSolver);
+};
+
+REGISTER_SERIALIZABLE(ElawSnowLayersDeformation);
+
+




Follow ups