Electrostatic Application Conditions
From KratosWiki
(Difference between revisions)
(→efield2D.cpp) |
(→efield2D.cpp) |
||
Line 942: | Line 942: | ||
[[Category: Electrostatic Application]] | [[Category: Electrostatic Application]] | ||
− |
Revision as of 09:04, 4 November 2009
Some of the conditions are directly implemented in the Electrostatic Kratos Element files, electrosatic_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 charge condition and the Neumann and infinit boundary conditions.
Contents |
Point Charge Condition
pointcharge2D.h
// // Project Name: Kratos // Last Modified by: $Author: jmora $ // Date: $Date: 2009-09-24 16:46:49 $ // Revision: $Revision: 1.1 $ // // #if !defined(KRATOS_PointCharge2D_CONDITION_H_INCLUDED ) #define KRATOS_PointCharge2D_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 PointCharge2D : public Condition { public: ///@name Type Definitions ///@{ /// Counted pointer of PointCharge2D KRATOS_CLASS_POINTER_DEFINITION(PointCharge2D); ///@} ///@name Life Cycle ///@{ /// Default constructor. PointCharge2D(IndexType NewId, GeometryType::Pointer pGeometry); PointCharge2D(IndexType NewId, GeometryType::Pointer pGeometry, PropertiesType::Pointer pProperties); /// Destructor. virtual ~PointCharge2D(); ///@} ///@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. //PointCharge2D& operator=(const PointCharge2D& rOther); /// Copy constructor. //PointCharge2D(const PointCharge2D& rOther); ///@} }; // Class PointCharge2D ///@} ///@name Type Definitions ///@{ ///@} ///@name Input and output ///@{ /// input stream function /* inline std::istream& operator >> (std::istream& rIStream, PointCharge2D& rThis); */ /// output stream function /* inline std::ostream& operator << (std::ostream& rOStream, const PointCharge2D& rThis) { rThis.PrintInfo(rOStream); rOStream << std::endl; rThis.PrintData(rOStream); return rOStream; }*/ ///@} } // namespace Kratos. #endif // KRATOS_PointCharge2D_CONDITION_H_INCLUDED defined
pointcharge2D.cpp
/* ============================================================================== KratosR1ElectrostaticApplication A library based on: Kratos A General Purpose Software for Multi-Physics Finite Element Analysis Version 1.0 (Released on march 05, 2007). Copyright 2007 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: 2009-09-24 16:46:55 $ // Revision: $Revision: 1.1 $ // // // System includes // External includes // Project includes #include "includes/define.h" #include "custom_conditions/pointcharge2D.h" #include "kElectrostatic.h" #include "utilities/math_utils.h" namespace Kratos { //************************************************************************************ //************************************************************************************ PointCharge2D::PointCharge2D(IndexType NewId, GeometryType::Pointer pGeometry) : Condition(NewId, pGeometry) { //DO NOT ADD DOFS HERE!!! } //************************************************************************************ //************************************************************************************ PointCharge2D::PointCharge2D(IndexType NewId, GeometryType::Pointer pGeometry, PropertiesType::Pointer pProperties) : Condition(NewId, pGeometry, pProperties) { } Condition::Pointer PointCharge2D::Create(IndexType NewId, NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const { return Condition::Pointer(new PointCharge2D(NewId, GetGeometry().Create(ThisNodes), pProperties)); } PointCharge2D::~PointCharge2D() { } //************************************************************************************ //************************************************************************************ void PointCharge2D::CalculateRightHandSide(VectorType& rRightHandSideVector, ProcessInfo& rCurrentProcessInfo) { KRATOS_TRY if(rRightHandSideVector.size() != 1) rRightHandSideVector.resize(1,false); double point_source = GetGeometry()[0].FastGetSolutionStepValue(ELECTROSTATIC_POINT_CHARGE); rRightHandSideVector[0] = point_source;
that is the following term of the right side vector of the sources:
KRATOS_CATCH("") } //************************************************************************************ //************************************************************************************ void PointCharge2D::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(ELECTROSTATIC_POINT_CHARGE); rRightHandSideVector[0] = point_source; KRATOS_CATCH("") } //************************************************************************************ //************************************************************************************ void PointCharge2D::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(ELECTROSTATIC_POTENTIAL).EquationId()); } } //************************************************************************************ //************************************************************************************ void PointCharge2D::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(ELECTROSTATIC_POTENTIAL)); } } } // Namespace Kratos
Field Boundary Conditions
efield2D.h
/* ============================================================================== KratosR1ElectrostaticApplication A library based on: Kratos A General Purpose Software for Multi-Physics Finite Element Analysis Version 1.0 (Released on march 05, 2007). Copyright 2007 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: 2009-09-06 10:30:32 $ // Revision: $Revision: 1.2 $ // // #if !defined(KRATOS_EFIELD2D_CONDITION_H_INCLUDED ) #define KRATOS_EFIELD2D_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 Efield2D : public Condition { public: ///@name Type Definitions ///@{ /// Counted pointer of Efield2D KRATOS_CLASS_POINTER_DEFINITION(Efield2D); ///@} ///@name Life Cycle ///@{ /// Default constructor. Efield2D(IndexType NewId, GeometryType::Pointer pGeometry); Efield2D(IndexType NewId, GeometryType::Pointer pGeometry, PropertiesType::Pointer pProperties); /// Destructor. virtual ~Efield2D(); ///@} ///@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. //Efield2D& operator=(const Efield2D& rOther); /// Copy constructor. //Efield2D(const Efield2D& rOther); ///@} }; // Class Efield2D ///@} ///@name Type Definitions ///@{ ///@} ///@name Input and output ///@{ /// input stream function /* inline std::istream& operator >> (std::istream& rIStream, Efield2D& rThis); */ /// output stream function /* inline std::ostream& operator << (std::ostream& rOStream, const Efield2D& rThis) { rThis.PrintInfo(rOStream); rOStream << std::endl; rThis.PrintData(rOStream); return rOStream; }*/ ///@} } // namespace Kratos. #endif // KRATOS_EFIELD2D_CONDITION_H_INCLUDED defined
efield2D.cpp
/* ============================================================================== KratosR1ElectrostaticApplication A library based on: Kratos A General Purpose Software for Multi-Physics Finite Element Analysis Version 1.0 (Released on march 05, 2007). Copyright 2007 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: 2009-09-06 10:30:32 $ // Revision: $Revision: 1.4 $ // // // System includes // External includes // Project includes #include "includes/define.h" #include "custom_conditions/efield2D.h" #include "utilities/math_utils.h" #include "kElectrostatic.h" namespace Kratos { //************************************************************************************ //************************************************************************************ Efield2D::Efield2D(IndexType NewId, GeometryType::Pointer pGeometry) : Condition(NewId, pGeometry) { //DO NOT ADD DOFS HERE!!! } //************************************************************************************ //************************************************************************************ Efield2D::Efield2D(IndexType NewId, GeometryType::Pointer pGeometry, PropertiesType::Pointer pProperties) : Condition(NewId, pGeometry, pProperties) { } Condition::Pointer Efield2D::Create(IndexType NewId, NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const { return Condition::Pointer(new Efield2D(NewId, GetGeometry().Create(ThisNodes), pProperties)); } Efield2D::~Efield2D() { } //************************************************************************************ //************************************************************************************ void Efield2D::CalculateRightHandSide(VectorType& rRightHandSideVector, ProcessInfo& rCurrentProcessInfo) { //calculation flags bool CalculateStiffnessMatrixFlag = false; bool CalculateResidualVectorFlag = true; MatrixType temp = Matrix(); CalculateAll(temp, rRightHandSideVector, rCurrentProcessInfo, CalculateStiffnessMatrixFlag, CalculateResidualVectorFlag); } //************************************************************************************ //************************************************************************************ void Efield2D::CalculateLocalSystem(MatrixType& rLeftHandSideMatrix, VectorType& rRightHandSideVector, ProcessInfo& rCurrentProcessInfo) { //calculation flags bool CalculateStiffnessMatrixFlag = true; bool CalculateResidualVectorFlag = true; CalculateAll(rLeftHandSideMatrix, rRightHandSideVector, rCurrentProcessInfo, CalculateStiffnessMatrixFlag, CalculateResidualVectorFlag); } //************************************************************************************ //************************************************************************************ void Efield2D::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(ELECTROSTATIC_POTENTIAL); const double& V1 = GetGeometry()[1].FastGetSolutionStepValue(ELECTROSTATIC_POTENTIAL); array_1d<double,3>& ConditionalField = GetValue(ELECTRIC_DISPLACEMENT_FIELD); 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 Efield2D::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(ELECTROSTATIC_POTENTIAL)).EquationId(); } } //************************************************************************************ //************************************************************************************ void Efield2D::GetDofList(DofsVectorType& ConditionalDofList,ProcessInfo& CurrentProcessInfo) { ConditionalDofList.resize(GetGeometry().size()); for (unsigned int i=0;i<GetGeometry().size();i++) { ConditionalDofList[i] = (GetGeometry()[i].pGetDof(ELECTROSTATIC_POTENTIAL)); } } } // Namespace Kratos