Magnetostatic Application Conditions
From KratosWiki
(Difference between revisions)
(New page: Some of the conditions are directly implemented in the Magnetostatic Kratos Element files, magnetosatic_2D.h/.cpp, like the surface sources, but there is other kind of conditions that need...) |
(→pointcurrent2D.cpp) |
||
Line 380: | Line 380: | ||
rRightHandSideVector.resize(1,false); | rRightHandSideVector.resize(1,false); | ||
− | double point_source = GetGeometry()[0].FastGetSolutionStepValue( | + | double point_source = GetGeometry()[0].FastGetSolutionStepValue(MAGNETOSTATIC_POINT_CURRENT); |
rRightHandSideVector[0] = point_source; | rRightHandSideVector[0] = point_source; | ||
Latest revision as of 18:38, 2 February 2010
Some of the conditions are directly implemented in the Magnetostatic Kratos Element files, magnetosatic_2D.h/.cpp, like the surface sources, but there is other kind of conditions that needs separate files. In tis section we will see the point current condition and the Neumann and infinite boundary conditions.
Contents |
Point Current Condition
pointcurrent2D.h
// // Project Name: Kratos // Last Modified by: $Author: jmora $ // Date: $Date: 2010-02-02 12:15:49 $ // Revision: $Revision: 1.1 $ // // #if !defined(KRATOS_PointCurrent2D_CONDITION_H_INCLUDED ) #define KRATOS_PointCurrent2D_CONDITION_H_INCLUDED // System includes // External includes #include "boost/smart_ptr.hpp" // Project includes #include "includes/define.h" #include "includes/condition.h" #include "includes/ublas_interface.h" #include "includes/variables.h" namespace Kratos { ///@name Kratos Globals ///@{ ///@} ///@name Type Definitions ///@{ ///@} ///@name Enum's ///@{ ///@} ///@name Functions ///@{ ///@} ///@name Kratos Classes ///@{ /// Short class definition. /** Detail class definition. */ class PointCurrent2D : public Condition { public: ///@name Type Definitions ///@{ /// Counted pointer of PointCurrent2D KRATOS_CLASS_POINTER_DEFINITION(PointCurrent2D); ///@} ///@name Life Cycle ///@{ /// Default constructor. PointCurrent2D(IndexType NewId, GeometryType::Pointer pGeometry); PointCurrent2D(IndexType NewId, GeometryType::Pointer pGeometry, PropertiesType::Pointer pProperties); /// Destructor. virtual ~PointCurrent2D(); ///@} ///@name Operators ///@{ ///@} ///@name Operations ///@{ Condition::Pointer Create(IndexType NewId, NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const; void CalculateLocalSystem(MatrixType& rLeftHandSideMatrix, VectorType& rRightHandSideVector, ProcessInfo& rCurrentProcessInfo); void CalculateRightHandSide(VectorType& rRightHandSideVector, ProcessInfo& rCurrentProcessInfo); void EquationIdVector(EquationIdVectorType& rResult, ProcessInfo& rCurrentProcessInfo); void GetDofList(DofsVectorType& ConditionalDofList,ProcessInfo& CurrentProcessInfo); ///@} ///@name Access ///@{ ///@} ///@name Inquiry ///@{ ///@} ///@name Input and output ///@{ /// Turn back information as a string. // virtual String Info() const; /// Print information about this object. // virtual void PrintInfo(std::ostream& rOStream) const; /// Print object's data. // virtual void PrintData(std::ostream& rOStream) const; ///@} ///@name Friends ///@{ ///@} protected: ///@name Protected static Member Variables ///@{ ///@} ///@name Protected member Variables ///@{ ///@} ///@name Protected Operators ///@{ ///@} ///@name Protected Operations ///@{ ///@} ///@name Protected Access ///@{ ///@} ///@name Protected Inquiry ///@{ ///@} ///@name Protected LifeCycle ///@{ ///@} private: ///@name Static Member Variables ///@{ ///@} ///@name Member Variables ///@{ ///@} ///@name Private Operators ///@{ ///@} ///@name Private Operations ///@{ ///@} ///@name Private Access ///@{ ///@} ///@name Private Inquiry ///@{ ///@} ///@name Un accessible methods ///@{ /// Assignment operator. //PointCurrent2D& operator=(const PointCurrent2D& rOther); /// Copy constructor. //PointCurrent2D(const PointCurrent2D& rOther); ///@} }; // Class PointCurrent2D ///@} ///@name Type Definitions ///@{ ///@} ///@name Input and output ///@{ /// input stream function /* inline std::istream& operator >> (std::istream& rIStream, PointCurrent2D& rThis); */ /// output stream function /* inline std::ostream& operator << (std::ostream& rOStream, const PointCurrent2D& rThis) { rThis.PrintInfo(rOStream); rOStream << std::endl; rThis.PrintData(rOStream); return rOStream; }*/ ///@} } // namespace Kratos. #endif // KRATOS_PointCurrent2D_CONDITION_H_INCLUDED defined
pointcurrent2D.cpp
/* ============================================================================== KratosR1MagnetostaticApplication A library based on: Kratos A General Purpose Software for Multi-Physics Finite Element Analysis Version 1.0 (Released on march 05, 2007). Copyright 2010 Pooyan Dadvand, Riccardo Rossi, Javier Mora pooyan@cimne.upc.edu rrossi@cimne.upc.edu mora@cimne.upc.edu - CIMNE (International Center for Numerical Methods in Engineering), Gran Capita' s/n, 08034 Barcelona, Spain Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following condition: Distribution of this code for any commercial purpose is permissible ONLY BY DIRECT ARRANGEMENT WITH THE COPYRIGHT OWNERS. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================================== */ // // Project Name: Kratos // Last modified by: $Author: jmora $ // Date: $Date: 2010-02-02 12:15:55 $ // Revision: $Revision: 1.1 $ // // // System includes // External includes // Project includes #include "includes/define.h" #include "custom_conditions/pointcurrent2D.h" #include "kMagnetostatic.h" #include "utilities/math_utils.h" namespace Kratos { //************************************************************************************ //************************************************************************************ PointCurrent2D::PointCurrent2D(IndexType NewId, GeometryType::Pointer pGeometry) : Condition(NewId, pGeometry) { //DO NOT ADD DOFS HERE!!! } //************************************************************************************ //************************************************************************************ PointCurrent2D::PointCurrent2D(IndexType NewId, GeometryType::Pointer pGeometry, PropertiesType::Pointer pProperties) : Condition(NewId, pGeometry, pProperties) { } Condition::Pointer PointCurrent2D::Create(IndexType NewId, NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const { return Condition::Pointer(new PointCharge2D(NewId, GetGeometry().Create(ThisNodes), pProperties)); } PointCurrent2D::~PointCurrent2D() { } //************************************************************************************ //************************************************************************************ void PointCurrent2D::CalculateRightHandSide(VectorType& rRightHandSideVector, ProcessInfo& rCurrentProcessInfo) { KRATOS_TRY if(rRightHandSideVector.size() != 1) rRightHandSideVector.resize(1,false); double point_source = GetGeometry()[0].FastGetSolutionStepValue(MAGNETOSTATIC_POINT_CURRENT); rRightHandSideVector[0] = point_source;
that is the following term of the right side vector of the sources:
KRATOS_CATCH("") } //************************************************************************************ //************************************************************************************ void PointCurrent2D::CalculateLocalSystem(MatrixType& rLeftHandSideMatrix, VectorType& rRightHandSideVector, ProcessInfo& rCurrentProcessInfo) { KRATOS_TRY if(rLeftHandSideMatrix.size1() != 1) rLeftHandSideMatrix.resize(1,1,false); noalias(rLeftHandSideMatrix) = ZeroMatrix(1,1); if(rRightHandSideVector.size() != 1) rRightHandSideVector.resize(1,false); double point_source = GetGeometry()[0].FastGetSolutionStepValue(MAGNETOSTATIC_POINT_CURRENT); rRightHandSideVector[0] = point_source; KRATOS_CATCH("") } //************************************************************************************ //************************************************************************************ void PointCurrent2D::EquationIdVector(EquationIdVectorType& rResult, ProcessInfo& CurrentProcessInfo) { int number_of_nodes = GetGeometry().PointsNumber(); unsigned int index; unsigned int dim = 1; rResult.resize(number_of_nodes*dim); for (int i=0;i<number_of_nodes;i++) { index = i*dim; rResult[index] = (GetGeometry()[i].GetDof(MAGNETOSTATIC_POTENTIAL).EquationId()); } } //************************************************************************************ //************************************************************************************ void PointCurrent2D::GetDofList(DofsVectorType& ConditionalDofList,ProcessInfo& CurrentProcessInfo) { unsigned int dim = 1; ConditionalDofList.resize(GetGeometry().size()*dim); unsigned int index; for (unsigned int i=0;i<GetGeometry().size();i++) { index = i*dim; ConditionalDofList[index] = (GetGeometry()[i].pGetDof(MAGNETOSTATIC_POTENTIAL)); } } } // Namespace Kratos
Field Boundary Conditions
mfield2D.h
/* ============================================================================== KratosR1MagnetostaticApplication A library based on: Kratos A General Purpose Software for Multi-Physics Finite Element Analysis Version 1.0 (Released on march 05, 2007). Copyright 2010 Pooyan Dadvand, Riccardo Rossi, Javier Mora pooyan@cimne.upc.edu rrossi@cimne.upc.edu mora@cimne.upc.edu - CIMNE (International Center for Numerical Methods in Engineering), Gran Capita' s/n, 08034 Barcelona, Spain Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following condition: Distribution of this code for any commercial purpose is permissible ONLY BY DIRECT ARRANGEMENT WITH THE COPYRIGHT OWNERS. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================================== */ // // Project Name: Kratos // Last Modified by: $Author: jmora $ // Date: $Date: 2010-02-02 12:30:32 $ // Revision: $Revision: 1.2 $ // // #if !defined(KRATOS_MFIELD2D_CONDITION_H_INCLUDED ) #define KRATOS_MFIELD2D_CONDITION_H_INCLUDED // System includes // External includes #include "boost/smart_ptr.hpp" // Project includes #include "includes/define.h" #include "includes/condition.h" #include "includes/ublas_interface.h" #include "includes/variables.h" namespace Kratos { ///@name Kratos Globals ///@{ ///@} ///@name Type Definitions ///@{ ///@} ///@name Enum's ///@{ ///@} ///@name Functions ///@{ ///@} ///@name Kratos Classes ///@{ /// Short class definition. /** Detail class definition. */ class Mfield2D : public Condition { public: ///@name Type Definitions ///@{ /// Counted pointer of Mfield2D KRATOS_CLASS_POINTER_DEFINITION(Efield2D); ///@} ///@name Life Cycle ///@{ /// Default constructor. Mfield2D(IndexType NewId, GeometryType::Pointer pGeometry); Mfield2D(IndexType NewId, GeometryType::Pointer pGeometry, PropertiesType::Pointer pProperties); /// Destructor. virtual ~Mfield2D(); ///@} ///@name Operators ///@{ ///@} ///@name Operations ///@{ Condition::Pointer Create(IndexType NewId, NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const; void CalculateLocalSystem(MatrixType& rLeftHandSideMatrix, VectorType& rRightHandSideVector, ProcessInfo& rCurrentProcessInfo); void CalculateRightHandSide(VectorType& rRightHandSideVector, ProcessInfo& rCurrentProcessInfo); //virtual void CalculateLeftHandSide(MatrixType& rLeftHandSideMatrix, ProcessInfo& rCurrentProcessInfo); void EquationIdVector(EquationIdVectorType& rResult, ProcessInfo& rCurrentProcessInfo); void GetDofList(DofsVectorType& ConditionalDofList,ProcessInfo& CurrentProcessInfo); ///@} ///@name Access ///@{ ///@} ///@name Inquiry ///@{ ///@} ///@name Input and output ///@{ /// Turn back information as a string. // virtual String Info() const; /// Print information about this object. // virtual void PrintInfo(std::ostream& rOStream) const; /// Print object's data. // virtual void PrintData(std::ostream& rOStream) const; ///@} ///@name Friends ///@{ ///@} protected: ///@name Protected static Member Variables ///@{ ///@} ///@name Protected member Variables ///@{ ///@} ///@name Protected Operators ///@{ ///@} ///@name Protected Operations ///@{ ///@} ///@name Protected Access ///@{ ///@} ///@name Protected Inquiry ///@{ ///@} ///@name Protected LifeCycle ///@{ ///@} private: ///@name Static Member Variables ///@{ ///@} ///@name Member Variables ///@{ ///@} ///@name Private Operators ///@{ void CalculateAll(MatrixType& rLeftHandSideMatrix, VectorType& rRightHandSideVector, ProcessInfo& rCurrentProcessInfo, bool CalculateStiffnessMatrixFlag, bool CalculateResidualVectorFlag); ///@} ///@name Private Operations ///@{ ///@} ///@name Private Access ///@{ ///@} ///@name Private Inquiry ///@{ ///@} ///@name Un accessible methods ///@{ /// Assignment operator. //Mfield2D& operator=(const Efield2D& rOther); /// Copy constructor. //Mfield2D(const Efield2D& rOther); ///@} }; // Class Mfield2D ///@} ///@name Type Definitions ///@{ ///@} ///@name Input and output ///@{ /// input stream function /* inline std::istream& operator >> (std::istream& rIStream, Mfield2D& rThis); */ /// output stream function /* inline std::ostream& operator << (std::ostream& rOStream, const Mfield2D& rThis) { rThis.PrintInfo(rOStream); rOStream << std::endl; rThis.PrintData(rOStream); return rOStream; }*/ ///@} } // namespace Kratos. #endif // KRATOS_MFIELD2D_CONDITION_H_INCLUDED defined
mfield2D.cpp
/* ============================================================================== KratosR1MagnetostaticApplication A library based on: Kratos A General Purpose Software for Multi-Physics Finite Element Analysis Version 1.0 (Released on march 05, 2007). Copyright 2010 Pooyan Dadvand, Riccardo Rossi,Javier Mora pooyan@cimne.upc.edu rrossi@cimne.upc.edu mora@cimne.upc.edu - CIMNE (International Center for Numerical Methods in Engineering), Gran Capita' s/n, 08034 Barcelona, Spain Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following condition: Distribution of this code for any commercial purpose is permissible ONLY BY DIRECT ARRANGEMENT WITH THE COPYRIGHT OWNERS. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================================== */ // // Project Name: Kratos // Last modified by: $Author: jmora $ // Date: $Date: 2010-02-02 12:15:32 $ // Revision: $Revision: 1.4 $ // // // System includes // External includes // Project includes #include "includes/define.h" #include "custom_conditions/mfield2D.h" #include "utilities/math_utils.h" #include "kMagnetostatic.h" namespace Kratos { //************************************************************************************ //************************************************************************************ Mfield2D::Mfield2D(IndexType NewId, GeometryType::Pointer pGeometry) : Condition(NewId, pGeometry) { //DO NOT ADD DOFS HERE!!! } //************************************************************************************ //************************************************************************************ Mfield2D::Mfield2D(IndexType NewId, GeometryType::Pointer pGeometry, PropertiesType::Pointer pProperties) : Condition(NewId, pGeometry, pProperties) { } Condition::Pointer Mfield2D::Create(IndexType NewId, NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const { return Condition::Pointer(new Mfield2D(NewId, GetGeometry().Create(ThisNodes), pProperties)); } Mfield2D::~Mfield2D() { } //************************************************************************************ //************************************************************************************ void Mfield2D::CalculateRightHandSide(VectorType& rRightHandSideVector, ProcessInfo& rCurrentProcessInfo) { //calculation flags bool CalculateStiffnessMatrixFlag = false; bool CalculateResidualVectorFlag = true; MatrixType temp = Matrix(); CalculateAll(temp, rRightHandSideVector, rCurrentProcessInfo, CalculateStiffnessMatrixFlag, CalculateResidualVectorFlag); } //************************************************************************************ //************************************************************************************ void Mfield2D::CalculateLocalSystem(MatrixType& rLeftHandSideMatrix, VectorType& rRightHandSideVector, ProcessInfo& rCurrentProcessInfo) { //calculation flags bool CalculateStiffnessMatrixFlag = true; bool CalculateResidualVectorFlag = true; CalculateAll(rLeftHandSideMatrix, rRightHandSideVector, rCurrentProcessInfo, CalculateStiffnessMatrixFlag, CalculateResidualVectorFlag); } //************************************************************************************ //************************************************************************************ void Mfield2D::CalculateAll(MatrixType& rLeftHandSideMatrix, VectorType& rRightHandSideVector, ProcessInfo& rCurrentProcessInfo, bool CalculateStiffnessMatrixFlag, bool CalculateResidualVectorFlag) { KRATOS_TRY unsigned int number_of_nodes = GetGeometry().size(); //resizing as needed the LHS unsigned int MatSize=number_of_nodes; //calculate lenght double x21 = GetGeometry()[1].X() - GetGeometry()[0].X(); double y21 = GetGeometry()[1].Y() - GetGeometry()[0].Y(); double length = x21*x21 + y21*y21; length = sqrt(length); double infinit_coefficient = (this)->GetValue(INFINIT_COEFFICIENT); double convection_coefficient = pow(length,infinit_coefficient); convection_coefficient = infinit_coefficient/convection_coefficient; const double& V0 = GetGeometry()[0].FastGetSolutionStepValue(MAGNETOSTATIC_POTENTIAL); const double& V1 = GetGeometry()[1].FastGetSolutionStepValue(MAGNETOSTATIC_POTENTIAL); array_1d<double,3>& ConditionalField = GetValue(MAGNETIC_FIELD_INTENSITY); const double& c0 = ConditionalField[0]; const double& c1 = ConditionalField[1]; const double& c2 = ConditionalField[2]; if (CalculateStiffnessMatrixFlag == true) //calculation of the matrix is required { if(rLeftHandSideMatrix.size1() != MatSize ) rLeftHandSideMatrix.resize(MatSize,MatSize,false); noalias(rLeftHandSideMatrix) = ZeroMatrix(MatSize,MatSize); rLeftHandSideMatrix(0,0) = convection_coefficient * 0.5 * length; rLeftHandSideMatrix(1,1) = convection_coefficient * 0.5 * length; } //resizing as needed the RHS if (CalculateResidualVectorFlag == true) //calculation of the matrix is required { if(rRightHandSideVector.size() != MatSize ) rRightHandSideVector.resize(MatSize,false); rRightHandSideVector[0] = c0 - convection_coefficient * V0 ; rRightHandSideVector[1] = c1 - convection_coefficient * V1 ; rRightHandSideVector *= 0.5*length;
That is:
} KRATOS_CATCH("") } //************************************************************************************ //************************************************************************************ void Mfield2D::EquationIdVector(EquationIdVectorType& rResult, ProcessInfo& CurrentProcessInfo) { unsigned int number_of_nodes = GetGeometry().PointsNumber(); if(rResult.size() != number_of_nodes) rResult.resize(number_of_nodes,false); for (unsigned int i=0;i<number_of_nodes;i++) { rResult[i] = (GetGeometry()[i].GetDof(MAGNETOSTATIC_POTENTIAL)).EquationId(); } } //************************************************************************************ //************************************************************************************ void Mfield2D::GetDofList(DofsVectorType& ConditionalDofList,ProcessInfo& CurrentProcessInfo) { ConditionalDofList.resize(GetGeometry().size()); for (unsigned int i=0;i<GetGeometry().size();i++) { ConditionalDofList[i] = (GetGeometry()[i].pGetDof(MAGNETOSTATIC_POTENTIAL)); } } } // Namespace Kratos