From 8357653fe01ae353e24307b02d6f75385d7607e2 Mon Sep 17 00:00:00 2001 From: David Andrs Date: Tue, 11 Nov 2014 12:44:20 -0700 Subject: [PATCH] Adding test case for 1D mortar method Closes #4211 --- .../include/bcs/OneDEqualValueConstraintBC.h | 47 +++++++++++ .../kernels/NodalEqualValueConstraint.h | 45 ++++++++++ framework/src/base/Moose.C | 4 + .../src/bcs/OneDEqualValueConstraintBC.C | 63 ++++++++++++++ .../src/kernels/NodalEqualValueConstraint.C | 74 ++++++++++++++++ test/tests/mortar/1d/1d.i | 79 ++++++++++++++++++ test/tests/mortar/1d/2-lines.e | Bin 0 -> 2612 bytes test/tests/mortar/1d/2-lines.jou | 29 +++++++ test/tests/mortar/1d/gold/1d_out.e | Bin 0 -> 29584 bytes test/tests/mortar/1d/tests | 10 +++ 10 files changed, 351 insertions(+) create mode 100644 framework/include/bcs/OneDEqualValueConstraintBC.h create mode 100644 framework/include/kernels/NodalEqualValueConstraint.h create mode 100644 framework/src/bcs/OneDEqualValueConstraintBC.C create mode 100644 framework/src/kernels/NodalEqualValueConstraint.C create mode 100644 test/tests/mortar/1d/1d.i create mode 100644 test/tests/mortar/1d/2-lines.e create mode 100644 test/tests/mortar/1d/2-lines.jou create mode 100644 test/tests/mortar/1d/gold/1d_out.e create mode 100644 test/tests/mortar/1d/tests diff --git a/framework/include/bcs/OneDEqualValueConstraintBC.h b/framework/include/bcs/OneDEqualValueConstraintBC.h new file mode 100644 index 000000000000..c1f8ae76432b --- /dev/null +++ b/framework/include/bcs/OneDEqualValueConstraintBC.h @@ -0,0 +1,47 @@ +/****************************************************************/ +/* DO NOT MODIFY THIS HEADER */ +/* MOOSE - Multiphysics Object Oriented Simulation Environment */ +/* */ +/* (c) 2010 Battelle Energy Alliance, LLC */ +/* ALL RIGHTS RESERVED */ +/* */ +/* Prepared by Battelle Energy Alliance, LLC */ +/* Under Contract No. DE-AC07-05ID14517 */ +/* With the U. S. Department of Energy */ +/* */ +/* See COPYRIGHT for full restrictions */ +/****************************************************************/ + +#ifndef ONEDEQUALVALUECONSTRAINTBC_H +#define ONEDEQUALVALUECONSTRAINTBC_H + +#include "IntegratedBC.h" + +class OneDEqualValueConstraintBC; + +template<> +InputParameters validParams(); + + +/** + * This is the \int \lambda \d g term from the mortar method. This can connect two 1D domains only. + * + * For higher dimensions, you should use face-face constraints. + */ +class OneDEqualValueConstraintBC : public IntegratedBC +{ +public: + OneDEqualValueConstraintBC(const std::string & name, InputParameters parameters); + virtual ~OneDEqualValueConstraintBC(); + +protected: + virtual Real computeQpResidual(); + virtual Real computeQpJacobian(); + virtual Real computeQpOffDiagJacobian(unsigned jvar); + + VariableValue & _lambda; + unsigned int _lambda_var_number; + unsigned int _component; +}; + +#endif // ONEDEQUALVALUECONSTRAINTBC_H diff --git a/framework/include/kernels/NodalEqualValueConstraint.h b/framework/include/kernels/NodalEqualValueConstraint.h new file mode 100644 index 000000000000..ee24c321c9f2 --- /dev/null +++ b/framework/include/kernels/NodalEqualValueConstraint.h @@ -0,0 +1,45 @@ +/****************************************************************/ +/* DO NOT MODIFY THIS HEADER */ +/* MOOSE - Multiphysics Object Oriented Simulation Environment */ +/* */ +/* (c) 2010 Battelle Energy Alliance, LLC */ +/* ALL RIGHTS RESERVED */ +/* */ +/* Prepared by Battelle Energy Alliance, LLC */ +/* Under Contract No. DE-AC07-05ID14517 */ +/* With the U. S. Department of Energy */ +/* */ +/* See COPYRIGHT for full restrictions */ +/****************************************************************/ + +#ifndef NODALEQUALVALUECONSTRAINT_H +#define NODALEQUALVALUECONSTRAINT_H + +#include "NodalScalarKernel.h" + +class NodalEqualValueConstraint; + +template<> +InputParameters validParams(); + +/** + * Constraint to enforce equal values (in 1D) + */ +class NodalEqualValueConstraint : public NodalScalarKernel +{ +public: + NodalEqualValueConstraint(const std::string & name, InputParameters parameters); + virtual ~NodalEqualValueConstraint(); + + virtual void computeResidual(); + virtual void computeJacobian(); + +protected: + std::vector _normals; + + std::vector _val_number; + std::vector _value; +}; + + +#endif /* NODALEQUALVALUECONSTRAINT_H */ diff --git a/framework/src/base/Moose.C b/framework/src/base/Moose.C index fbfce7148ee1..4c75eccb86f3 100644 --- a/framework/src/base/Moose.C +++ b/framework/src/base/Moose.C @@ -70,6 +70,7 @@ #include "WeakGradientBC.h" #include "DiffusionFluxBC.h" #include "PostprocessorDirichletBC.h" +#include "OneDEqualValueConstraintBC.h" // auxkernels #include "ConstantAux.h" @@ -233,6 +234,7 @@ // ScalarKernels #include "ODETimeDerivative.h" #include "FunctionScalarAux.h" +#include "NodalEqualValueConstraint.h" // indicators #include "AnalyticalIndicator.h" @@ -420,6 +422,7 @@ registerObjects(Factory & factory) registerBoundaryCondition(WeakGradientBC); registerBoundaryCondition(DiffusionFluxBC); registerBoundaryCondition(PostprocessorDirichletBC); + registerBoundaryCondition(OneDEqualValueConstraintBC); // dirac kernels registerDiracKernel(ConstantPointSource); @@ -579,6 +582,7 @@ registerObjects(Factory & factory) // Scalar kernels registerScalarKernel(ODETimeDerivative); + registerScalarKernel(NodalEqualValueConstraint); // indicators registerIndicator(AnalyticalIndicator); diff --git a/framework/src/bcs/OneDEqualValueConstraintBC.C b/framework/src/bcs/OneDEqualValueConstraintBC.C new file mode 100644 index 000000000000..4d212370fb94 --- /dev/null +++ b/framework/src/bcs/OneDEqualValueConstraintBC.C @@ -0,0 +1,63 @@ +/****************************************************************/ +/* DO NOT MODIFY THIS HEADER */ +/* MOOSE - Multiphysics Object Oriented Simulation Environment */ +/* */ +/* (c) 2010 Battelle Energy Alliance, LLC */ +/* ALL RIGHTS RESERVED */ +/* */ +/* Prepared by Battelle Energy Alliance, LLC */ +/* Under Contract No. DE-AC07-05ID14517 */ +/* With the U. S. Department of Energy */ +/* */ +/* See COPYRIGHT for full restrictions */ +/****************************************************************/ + +#include "OneDEqualValueConstraintBC.h" + +template<> +InputParameters validParams() +{ + InputParameters params = validParams(); + params.addRequiredCoupledVar("lambda", "Lagrange multiplier"); + params.addRequiredParam("component", "Component of the Lagrange multiplier"); + return params; +} + + +OneDEqualValueConstraintBC::OneDEqualValueConstraintBC(const std::string & name, InputParameters parameters) : + IntegratedBC(name, parameters), + _lambda(coupledScalarValue("lambda")), + _lambda_var_number(coupledScalar("lambda")), + _component(getParam("component")) +{ +} + +OneDEqualValueConstraintBC::~OneDEqualValueConstraintBC() +{ +} + +Real +OneDEqualValueConstraintBC::computeQpResidual() +{ + return _lambda[_component] * _normals[_qp](0) * _test[_i][_qp]; +} + +Real +OneDEqualValueConstraintBC::computeQpJacobian() +{ + return 0.; +} + +Real +OneDEqualValueConstraintBC::computeQpOffDiagJacobian(unsigned jvar) +{ + if (jvar == _lambda_var_number) + { + if (_j == _component) + return _normals[_qp](0) * _test[_i][_qp]; + else + return 0.; + } + else + return 0.; +} diff --git a/framework/src/kernels/NodalEqualValueConstraint.C b/framework/src/kernels/NodalEqualValueConstraint.C new file mode 100644 index 000000000000..4d0a5fb74fe8 --- /dev/null +++ b/framework/src/kernels/NodalEqualValueConstraint.C @@ -0,0 +1,74 @@ +/****************************************************************/ +/* DO NOT MODIFY THIS HEADER */ +/* MOOSE - Multiphysics Object Oriented Simulation Environment */ +/* */ +/* (c) 2010 Battelle Energy Alliance, LLC */ +/* ALL RIGHTS RESERVED */ +/* */ +/* Prepared by Battelle Energy Alliance, LLC */ +/* Under Contract No. DE-AC07-05ID14517 */ +/* With the U. S. Department of Energy */ +/* */ +/* See COPYRIGHT for full restrictions */ +/****************************************************************/ + +#include "NodalEqualValueConstraint.h" + +template<> +InputParameters validParams() +{ + InputParameters params = validParams(); + params.addRequiredParam >("normals", "node normals"); + params.addRequiredCoupledVar("var", "Variables to put the constraint on"); + return params; +} + +NodalEqualValueConstraint::NodalEqualValueConstraint(const std::string & name, InputParameters parameters) : + NodalScalarKernel(name, parameters), + _normals(getParam >("normals")) +{ + if (_normals.size() != 2) + mooseError("Component '" << this->name() << "' can only have 2 connections."); + + unsigned int n = coupledComponents("var"); + _value.resize(n); + _val_number.resize(n); + for (unsigned int k = 0; k < n; k++) + { + _value[k] = &coupledValue("var", k); + _val_number[k] = coupled("var", k); + } +} + +NodalEqualValueConstraint::~NodalEqualValueConstraint() +{ +} + +void +NodalEqualValueConstraint::computeResidual() +{ + // LM residuals + DenseVector & lm_re = _assembly.residualBlock(_var.number()); + + for (unsigned int k = 0; k < _value.size(); k++) + lm_re(k) = (*_value[k])[0] * _normals[0] + (*_value[k])[1] * _normals[1]; +} + +void +NodalEqualValueConstraint::computeJacobian() +{ + // do the diagonal block + DenseMatrix & ke = _assembly.jacobianBlock(_var.number(), _var.number()); + // put zeroes on the diagonal (we have to do it, otherwise PETSc will complain!) + for (unsigned int i = 0; i < ke.m(); i++) + for (unsigned int j = 0; j < ke.n(); j++) + ke(i, j) = 0.; + + for (unsigned int k = 0; k < _value.size(); k++) + { + DenseMatrix & ken = _assembly.jacobianBlock(_var.number(), _val_number[k]); + + ken(k, 0) = _normals[0]; + ken(k, 1) = _normals[1]; + } +} diff --git a/test/tests/mortar/1d/1d.i b/test/tests/mortar/1d/1d.i new file mode 100644 index 000000000000..ad410b0ff113 --- /dev/null +++ b/test/tests/mortar/1d/1d.i @@ -0,0 +1,79 @@ +[Mesh] + file = 2-lines.e + construct_side_list_from_node_list = true +[] + +[Variables] + [./u] + order = FIRST + family = LAGRANGE + block = '1 2' + [../] + + [./lm] + order = FIRST + family = SCALAR + [../] +[] + +[Kernels] + [./diff] + type = Diffusion + variable = u + [../] +[] + +[ScalarKernels] + [./ced] + type = NodalEqualValueConstraint + variable = lm + var = u + nodes = '2 3' + normals = '1 -1' + [../] +[] + +[BCs] + [./left] + type = DirichletBC + variable = u + boundary = '1' + value = 1 + [../] + + [./right] + type = DirichletBC + variable = u + boundary = '2' + value = 3 + [../] + + [./evc] + type = OneDEqualValueConstraintBC + variable = u + boundary = '100 101' + lambda = lm + component = 0 + [../] +[] + +[Preconditioning] + [./fmp] + type = SMP + full = true + solve_type = 'NEWTON' + [../] +[] + +[Executioner] + type = Steady +[] + +[Outputs] + output_initial = true + exodus = true + [./console] + type = Console + perf_log = true + [../] +[] diff --git a/test/tests/mortar/1d/2-lines.e b/test/tests/mortar/1d/2-lines.e new file mode 100644 index 0000000000000000000000000000000000000000..55f952b341508634741110c06ae8e0bc17d93b0f GIT binary patch literal 2612 zcmcIlJ#Q015OqEr-#H}VOClxdNI{H~RB0R%gOq{-iAWSk$Juv=6ZW0CTN6T^f|7y; zgajo8B|m{Obol{k=|UON@ZR2zwKldCB4y;c*`0m+c6N4lyV_;fhBw$`r1((qWus$-AZ~XE!0&}C&YxXi;j^}-0OHj)M0lL>argvL73%$85oDY zupJUao^syz8toSv#Ch8H()ZG^seO!fPPn`*RECf9XN}*Bvns*FTE5j0zO@m)b@9!c zc%qmgX-d791zD#Xrifn;FjnpNmGZ0!CHMzP0c#A+LQzGk z%?S|3x!UYCB6X{>n<18p9|vg`RQxPxt%S=PH>=eOeyew?>u9fUtl_7#jrcM52DGf} zX771oNEyQvR7BSZU_6j=UIU0aKXBq0FXOO<{ewbb<_NajOp?@#{f;R*j&ZNH&{s#= z9>Y3eqmQPaIk!cypWt-k3>ELIo~b{^?pk23a~TxJunw@@H0iQX1jn;vdz#_Fl6z_g zkw9eb3EG@1J0QkhgIM|w@>Bqe`(=us+`P{sWc-gyhW z@Ujre%kvWv-gj^e@aARy4_rN87tw zJ6wFMRM%E?*2V++kJlK;;EOf_^m>GEz_mZnyT}e}X;_&*rqUeuMJ|6P?upt-A2(yQ zr>yq0)#iS<2mTMR4($C+Zn{f<9@TFz)_x7y)4UJ-NICC3kV!l`rt|WgcOKT4yTJR< ef0t^<=s_fJwcj5oA8V(%-7FkZe&(pNfByotV@DGJ literal 0 HcmV?d00001 diff --git a/test/tests/mortar/1d/2-lines.jou b/test/tests/mortar/1d/2-lines.jou new file mode 100644 index 000000000000..b5459315bb02 --- /dev/null +++ b/test/tests/mortar/1d/2-lines.jou @@ -0,0 +1,29 @@ +create vertex 0 0 0 +create vertex 1 0 0 +create curve vertex 1 2 + +create vertex 1.1 0 0 +create vertex 2.1 0 0 +create curve vertex 3 4 + +curve 1 interval 2 +curve 1 scheme bias factor 1.0 +mesh curve 1 + +curve 2 interval 2 +curve 2 scheme bias factor 1.0 +mesh curve 2 + +set duplicate block elements off +block 1 curve 1 +block 1 element type BEAM2 + +set duplicate block elements off +block 2 curve 2 +block 2 element type BEAM2 + +nodeset 1 vertex 1 +nodeset 2 vertex 4 + +nodeset 100 vertex 2 +nodeset 101 vertex 3 diff --git a/test/tests/mortar/1d/gold/1d_out.e b/test/tests/mortar/1d/gold/1d_out.e new file mode 100644 index 0000000000000000000000000000000000000000..834d6facf45b27c6fbde67377ee3fff57145a5dc GIT binary patch literal 29584 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