From 2d51d126c94ffea2ef2fed52dcb5520549e54fdf Mon Sep 17 00:00:00 2001
From: Mohd Afeef Badri <52162083+mohd-afeef-badri@users.noreply.github.com>
Date: Thu, 29 Aug 2024 16:54:02 +0200
Subject: [PATCH 1/4] Boundary condition service
---
acoustics/Fem.axl | 118 +--------------
acoustics/FemModule.cc | 7 +-
acoustics/FemModule.h | 1 +
acoustics/Test.sub.arc | 12 +-
acoustics/Test.sub.hypre.arc | 12 +-
electrostatics/Fem.axl | 131 +----------------
electrostatics/FemModule.cc | 7 +-
electrostatics/FemModule.h | 1 +
electrostatics/Test.Capacitor.arc | 27 ++--
electrostatics/Test.box-rods.arc | 27 ++--
electrostatics/Test.rod-circle.arc | 27 ++--
femutils/ArcaneFemFunctions.h | 36 ++---
femutils/CMakeLists.txt | 3 +
femutils/FemBoundaryConditions.axl | 136 ++++++++++++++++++
femutils/FemBoundaryConditions.cc | 30 ++++
femutils/IArcaneFemBC.h | 73 ++++++++++
fourier/Fem.axl | 104 +-------------
fourier/FemModule.cc | 34 ++---
fourier/FemModule.h | 1 +
fourier/Test.conduction.10k.arc | 48 ++++---
fourier/Test.conduction.arc | 54 +++----
fourier/Test.conduction.heterogeneous.10k.arc | 34 ++---
fourier/Test.conduction.heterogeneous.arc | 34 ++---
fourier/Test.conduction.quad4.arc | 42 +++---
fourier/Test.manufacture.solution.arc | 8 +-
laplace/Fem.axl | 122 +---------------
laplace/FemModule.cc | 15 +-
laplace/FemModule.h | 1 +
laplace/Test.L-shape.3D.arc | 18 +--
laplace/Test.PointDirichlet-refined.arc | 34 ++---
laplace/Test.PointDirichlet.arc | 34 ++---
laplace/Test.ring.arc | 18 +--
32 files changed, 554 insertions(+), 695 deletions(-)
create mode 100644 femutils/FemBoundaryConditions.axl
create mode 100644 femutils/FemBoundaryConditions.cc
create mode 100644 femutils/IArcaneFemBC.h
diff --git a/acoustics/Fem.axl b/acoustics/Fem.axl
index 34a589b0..5cad2250 100644
--- a/acoustics/Fem.axl
+++ b/acoustics/Fem.axl
@@ -38,122 +38,10 @@
Type of mesh provided to the solver
-
-
-
-
- Dirichlet boundary condition
-
-
-
- FaceGroup on which to apply these boundary condition
-
-
-
-
- Value of the boundary condition
-
-
-
-
- Method via which Dirichlet boundary condition is imposed
-
-
-
-
- Penalty value for enforcing Dirichlet condition
-
-
-
-
-
-
-
- Dirichlet boundary condition
-
-
-
- Function for Dirichlet boundary condition
-
-
-
-
- Method via which Dirichlet boundary condition is imposed
-
-
-
-
- Penalty value for enforcing Dirichlet condition
-
-
-
-
- Function for manufactured source term condition
-
-
-
-
-
-
-
- Dirichlet point condition
-
-
-
- NodeGroup on which to apply these point Dirichlet condition
-
-
-
-
- Value of the point Dirichlet condition
-
-
-
-
- Method via which Dirichlet boundary condition is imposed
-
-
-
-
- Penalty value for enforcing Dirichlet condition
-
-
-
-
-
-
- Neumann boundary condition
-
-
- FaceGroup on which to apply the boundary condition
-
-
-
- Value of the boundary condition
-
-
-
- Neumann load value in x-direction
-
-
-
- Neumann load value in y-direction
-
-
-
+
+
+
diff --git a/acoustics/FemModule.cc b/acoustics/FemModule.cc
index 7521f911..e6c8abb8 100644
--- a/acoustics/FemModule.cc
+++ b/acoustics/FemModule.cc
@@ -116,8 +116,11 @@ _assembleLinearOperator()
const auto node_dof(m_dofs_on_nodes.nodeDoFConnectivityView());
// setp 2
- for (const auto& bs : options()->neumannBoundaryCondition()) {
- ArcaneFemFunctions::BoundaryConditions2D::applyNeumannToRhs(bs, node_dof, m_node_coord, rhs_values);
+ BC::IArcaneFemBC* bc = options()->boundaryConditions();
+ if(bc){
+ for (BC::INeumannBoundaryCondition* bs : bc->neumannBoundaryConditions()){
+ ArcaneFemFunctions::BoundaryConditions2D::applyNeumannToRhs(bs, node_dof, m_node_coord, rhs_values);
+ }
}
}
diff --git a/acoustics/FemModule.h b/acoustics/FemModule.h
index f03f9177..537e08e2 100644
--- a/acoustics/FemModule.h
+++ b/acoustics/FemModule.h
@@ -25,6 +25,7 @@
#include
#include
+#include "IArcaneFemBC.h"
#include "IDoFLinearSystemFactory.h"
#include "Fem_axl.h"
#include "FemUtils.h"
diff --git a/acoustics/Test.sub.arc b/acoustics/Test.sub.arc
index 8b255ea3..a73828d9 100644
--- a/acoustics/Test.sub.arc
+++ b/acoustics/Test.sub.arc
@@ -34,16 +34,18 @@
.11e1
-
- inner1
- 1.0
-
+
+
+ inner1
+ 1.0
+
+
sub_2D.txt
diff --git a/acoustics/Test.sub.hypre.arc b/acoustics/Test.sub.hypre.arc
index 9a7708de..96f306fa 100644
--- a/acoustics/Test.sub.hypre.arc
+++ b/acoustics/Test.sub.hypre.arc
@@ -34,16 +34,18 @@
.11e1
-
- inner1
- 1.0
-
+
+
+ inner1
+ 1.0
+
+
hypre
bicgstab
diff --git a/electrostatics/Fem.axl b/electrostatics/Fem.axl
index b78f2ab8..89249c46 100644
--- a/electrostatics/Fem.axl
+++ b/electrostatics/Fem.axl
@@ -30,134 +30,11 @@
Type of mesh provided to the solver
-
-
-
- Dirichlet boundary condition
-
-
-
- FaceGroup on which to apply these boundary condition
-
-
-
-
- Value of the boundary condition
-
-
-
-
- Method via which Dirichlet boundary condition is imposed
-
-
-
-
- Penalty value for enforcing Dirichlet condition
-
-
-
-
-
-
- Dirichlet boundary condition
-
-
-
- Function for Dirichlet boundary condition
-
-
-
-
- Method via which Dirichlet boundary condition is imposed
-
-
-
-
- Penalty value for enforcing Dirichlet condition
-
-
-
-
- Function for manufactured source term condition
-
-
-
+
+
-
-
-
- Neumann boundary condition
-
-
-
- FaceGroup on which to apply these boundary condition
-
-
-
-
- Value of the boundary condition
-
-
-
-
- Value of the Neumann load in x
-
-
-
-
- Value of the Neumann load in y
-
-
-
-
-
-
-
-
- Dirichlet point condition
-
-
-
- NodeGroup on which to apply these point Dirichlet condition
-
-
-
-
- Value of the point Dirichlet condition
-
-
-
-
- Method via which Dirichlet boundary condition is imposed
-
-
-
-
- Penalty value for enforcing Dirichlet condition
-
-
-
-
-
+
+
diff --git a/electrostatics/FemModule.cc b/electrostatics/FemModule.cc
index 303a84ed..71509a1a 100644
--- a/electrostatics/FemModule.cc
+++ b/electrostatics/FemModule.cc
@@ -136,10 +136,13 @@ _assembleLinearOperator()
ArcaneFemFunctions::BoundaryConditions2D::applyConstantSourceToRhs(qdot, mesh(), node_dof, m_node_coord, rhs_values);
}
- for (const auto& bs : options()->neumannBoundaryCondition())
+ BC::IArcaneFemBC* bc = options()->boundaryConditions();
+
+ for (BC::INeumannBoundaryCondition* bs : bc->neumannBoundaryConditions()){
ArcaneFemFunctions::BoundaryConditions2D::applyNeumannToRhs(bs, node_dof, m_node_coord, rhs_values);
+ }
- for (const auto& bs : options()->dirichletBoundaryCondition())
+ for (BC::IDirichletBoundaryCondition* bs : bc->dirichletBoundaryConditions())
ArcaneFemFunctions::BoundaryConditions2D::applyDirichletToLhsAndRhs(bs, node_dof, m_node_coord, m_linear_system, rhs_values);
}
diff --git a/electrostatics/FemModule.h b/electrostatics/FemModule.h
index 54654c58..5712a015 100644
--- a/electrostatics/FemModule.h
+++ b/electrostatics/FemModule.h
@@ -23,6 +23,7 @@
#include
#include
+#include "IArcaneFemBC.h"
#include "IDoFLinearSystemFactory.h"
#include "Fem_axl.h"
#include "FemUtils.h"
diff --git a/electrostatics/Test.Capacitor.arc b/electrostatics/Test.Capacitor.arc
index 63174ef6..ef1a82db 100644
--- a/electrostatics/Test.Capacitor.arc
+++ b/electrostatics/Test.Capacitor.arc
@@ -23,17 +23,20 @@
0.0
1.0
-
- capacitor1
- -1.0
-
-
- capacitor2
- 1.0
-
-
- Outer
- 0.0
-
+
+
+
+ capacitor1
+ -1.0
+
+
+ capacitor2
+ 1.0
+
+
+ Outer
+ 0.0
+
+
diff --git a/electrostatics/Test.box-rods.arc b/electrostatics/Test.box-rods.arc
index a04bfb00..d8171746 100644
--- a/electrostatics/Test.box-rods.arc
+++ b/electrostatics/Test.box-rods.arc
@@ -21,20 +21,23 @@
+
0.0
1.0
test_1.txt
-
- rod1
- -1.0
-
-
- rod2
- 1.0
-
-
- external
- 0.0
-
+
+
+ rod1
+ -1.0
+
+
+ rod2
+ 1.0
+
+
+ external
+ 0.0
+
+
diff --git a/electrostatics/Test.rod-circle.arc b/electrostatics/Test.rod-circle.arc
index fce41339..fa84582b 100644
--- a/electrostatics/Test.rod-circle.arc
+++ b/electrostatics/Test.rod-circle.arc
@@ -24,17 +24,20 @@
0.0
1.0
test_2.txt
-
- rod1
- -1.0
-
-
- circle
- 1.0
-
-
- external
- 0.0
-
+
+
+
+ rod1
+ -1.0
+
+
+ circle
+ 1.0
+
+
+ external
+ 0.0
+
+
diff --git a/femutils/ArcaneFemFunctions.h b/femutils/ArcaneFemFunctions.h
index cb08e24d..55437456 100644
--- a/femutils/ArcaneFemFunctions.h
+++ b/femutils/ArcaneFemFunctions.h
@@ -633,25 +633,25 @@ static inline Real4 computeGradientZTetra4(Cell cell, const VariableNodeReal3& n
*/
/*---------------------------------------------------------------------------*/
- static inline void applyNeumannToRhs(const CaseOptionsFem::CaseOptionNeumannBoundaryConditionValue* bs, const Arcane::IndexedNodeDoFConnectivityView& node_dof, const Arcane::VariableNodeReal3& node_coord, Arcane::VariableDoFReal& rhs_values)
+ static inline void applyNeumannToRhs(BC::INeumannBoundaryCondition* bs, const Arcane::IndexedNodeDoFConnectivityView& node_dof, const Arcane::VariableNodeReal3& node_coord, Arcane::VariableDoFReal& rhs_values)
{
- FaceGroup group = bs->surface();
+ FaceGroup group = bs->getSurface();
Real value = 0.0;
Real valueX = 0.0;
Real valueY = 0.0;
- bool hasValue = bs->value.isPresent();
- bool hasValueX = bs->valueX.isPresent();
- bool hasValueY = bs->valueY.isPresent();
+ bool hasValue = bs->hasValue();
+ bool hasValueX = bs->getValueX();
+ bool hasValueY = bs->getValueY();
if (hasValue) {
- value = bs->value();
+ value = bs->getValue();
}
else {
if (hasValueX)
- valueX = bs->valueX();
+ valueX = bs->getValueX();
if (hasValueY)
- valueY = bs->valueY();
+ valueY = bs->getValueY();
}
ENUMERATE_ (Face, iface, group) {
@@ -693,11 +693,11 @@ static inline Real4 computeGradientZTetra4(Cell cell, const VariableNodeReal3& n
* @param [OUT] rhs_values RHS : RHS values to update.
*/
/*---------------------------------------------------------------------------*/
- static inline void applyDirichletToLhsAndRhs(const CaseOptionsFem::CaseOptionDirichletBoundaryConditionValue* bs, const Arcane::IndexedNodeDoFConnectivityView& node_dof, const Arcane::VariableNodeReal3& node_coord, FemUtils::DoFLinearSystem& m_linear_system, Arcane::VariableDoFReal& rhs_values)
+ static inline void applyDirichletToLhsAndRhs(BC::IDirichletBoundaryCondition* bs, const Arcane::IndexedNodeDoFConnectivityView& node_dof, const Arcane::VariableNodeReal3& node_coord, FemUtils::DoFLinearSystem& m_linear_system, Arcane::VariableDoFReal& rhs_values)
{
- FaceGroup group = bs->surface();
- Real value = bs->value();
- Real Penalty = bs->penalty();
+ FaceGroup group = bs->getSurface();
+ Real value = bs->getValue();
+ Real Penalty = bs->getPenalty();
ENUMERATE_ (Face, iface, group) {
for (Node node : iface->nodes()) {
@@ -726,11 +726,11 @@ static inline Real4 computeGradientZTetra4(Cell cell, const VariableNodeReal3& n
* @param [OUT] rhs_values RHS : RHS values to update.
*/
/*---------------------------------------------------------------------------*/
- static inline void applyPointDirichletToLhsAndRhs(const CaseOptionsFem::CaseOptionDirichletPointConditionValue* bs, const Arcane::IndexedNodeDoFConnectivityView& node_dof, const Arcane::VariableNodeReal3& node_coord, FemUtils::DoFLinearSystem& m_linear_system, Arcane::VariableDoFReal& rhs_values)
+ static inline void applyPointDirichletToLhsAndRhs(BC::IDirichletPointCondition* bs, const Arcane::IndexedNodeDoFConnectivityView& node_dof, const Arcane::VariableNodeReal3& node_coord, FemUtils::DoFLinearSystem& m_linear_system, Arcane::VariableDoFReal& rhs_values)
{
- NodeGroup group = bs->node();
- Real value = bs->value();
- Real Penalty = bs->penalty();
+ NodeGroup group = bs->getNode();
+ Real value = bs->getValue();
+ Real Penalty = bs->getPenalty();
ENUMERATE_ (Node, inode, group) {
Node node = *inode;
@@ -760,9 +760,9 @@ static inline Real4 computeGradientZTetra4(Cell cell, const VariableNodeReal3& n
* @param [OUT] rhs_values RHS : RHS values to update.
*/
/*---------------------------------------------------------------------------*/
- static inline void applyManufacturedDirichletToLhsAndRhs(IBinaryMathFunctor* manufactured_dirichlet, const Arcane::Real& lambda, const Arcane::FaceGroup& group, const CaseOptionsFem::CaseOptionManufacturedSolutionValue* bs, const Arcane::IndexedNodeDoFConnectivityView& node_dof, const Arcane::VariableNodeReal3& node_coord, FemUtils::DoFLinearSystem& m_linear_system, Arcane::VariableDoFReal& rhs_values)
+ static inline void applyManufacturedDirichletToLhsAndRhs(IBinaryMathFunctor* manufactured_dirichlet, const Arcane::Real& lambda, const Arcane::FaceGroup& group, BC::IManufacturedSolution* bs, const Arcane::IndexedNodeDoFConnectivityView& node_dof, const Arcane::VariableNodeReal3& node_coord, FemUtils::DoFLinearSystem& m_linear_system, Arcane::VariableDoFReal& rhs_values)
{
- Real Penalty = bs->penalty();
+ Real Penalty = bs->getPenalty();
ENUMERATE_ (Face, iface, group) {
for (Node node : iface->nodes()) {
diff --git a/femutils/CMakeLists.txt b/femutils/CMakeLists.txt
index 3376abd4..2b836fd6 100644
--- a/femutils/CMakeLists.txt
+++ b/femutils/CMakeLists.txt
@@ -10,17 +10,20 @@ add_library(FemUtils
CsrFormatMatrix.cc
FemDoFsOnNodes.h
FemDoFsOnNodes.cc
+ FemBoundaryConditions.cc
ArcaneFemFunctions.h
AlephDoFLinearSystem.cc
IDoFLinearSystemFactory.h
AlephDoFLinearSystemFactory_axl.h
SequentialBasicDoFLinearSystemFactory_axl.h
HypreDoFLinearSystemFactory_axl.h
+ FemBoundaryConditions_axl.h
)
arcane_generate_axl(AlephDoFLinearSystemFactory)
arcane_generate_axl(SequentialBasicDoFLinearSystemFactory)
arcane_generate_axl(HypreDoFLinearSystemFactory)
+arcane_generate_axl(FemBoundaryConditions)
target_compile_definitions(FemUtils PRIVATE $<$:ENABLE_DEBUG_MATRIX>)
diff --git a/femutils/FemBoundaryConditions.axl b/femutils/FemBoundaryConditions.axl
new file mode 100644
index 00000000..a58ca30e
--- /dev/null
+++ b/femutils/FemBoundaryConditions.axl
@@ -0,0 +1,136 @@
+
+
+ Service to apply Dirichlet BC
+
+
+
+
+
+ Neumann boundary condition
+
+
+
+ FaceGroup on which to apply these boundary condition
+
+
+
+
+ Value of the boundary condition
+
+
+
+
+ Value of the Neumann load in x
+
+
+
+
+ Value of the Neumann load in y
+
+
+
+
+
+
+ Dirichlet point condition
+
+
+
+ NodeGroup on which to apply these point Dirichlet condition
+
+
+
+
+ Value of the point Dirichlet condition
+
+
+
+
+ Method via which Dirichlet boundary condition is imposed
+
+
+
+
+ Penalty value for enforcing Dirichlet condition
+
+
+
+
+
+
+ Dirichlet boundary condition
+
+
+
+ NodeGroup on which to apply these point Dirichlet condition
+
+
+
+
+ Value of the point Dirichlet condition
+
+
+
+
+ Method via which Dirichlet boundary condition is imposed
+
+
+
+
+ Penalty value for enforcing Dirichlet condition
+
+
+
+
+
+
+ Dirichlet boundary condition
+
+
+
+ Function for Dirichlet boundary condition
+
+
+
+
+ Method via which Dirichlet boundary condition is imposed
+
+
+
+
+ Penalty value for enforcing Dirichlet condition
+
+
+
+
+ Function for manufactured source term condition
+
+
+
+
+
+ handler of boundary conditions
+
+
+
+
\ No newline at end of file
diff --git a/femutils/FemBoundaryConditions.cc b/femutils/FemBoundaryConditions.cc
new file mode 100644
index 00000000..42b7220d
--- /dev/null
+++ b/femutils/FemBoundaryConditions.cc
@@ -0,0 +1,30 @@
+// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
+//-----------------------------------------------------------------------------
+// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
+// See the top-level COPYRIGHT file for details.
+// SPDX-License-Identifier: Apache-2.0
+//-----------------------------------------------------------------------------
+
+#include "IArcaneFemBC.h"
+#include "FemBoundaryConditions_axl.h"
+
+using namespace Arcane;
+
+
+class FemBoundaryConditionsService
+: public ArcaneFemBoundaryConditionsObject
+{
+ public:
+ explicit FemBoundaryConditionsService(const ServiceBuildInfo & sbi)
+ : ArcaneFemBoundaryConditionsObject(sbi) {}
+
+ ConstArrayView dirichletPointConditions() { return options()->getDirichletPoint(); }
+ ConstArrayView dirichletBoundaryConditions() { return options()->getDirichlet(); }
+ ConstArrayView neumannBoundaryConditions() { return options()->getNeumann(); }
+ ConstArrayView manufacturedSolutions() { return options()->getManufacturedSolution(); }
+ String getHandler() { return options()->getHandler();}
+};
+/*---------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+
+ARCANE_REGISTER_SERVICE_FEMBOUNDARYCONDITIONS(FemBoundaryConditions, FemBoundaryConditionsService);
\ No newline at end of file
diff --git a/femutils/IArcaneFemBC.h b/femutils/IArcaneFemBC.h
new file mode 100644
index 00000000..071f6bc6
--- /dev/null
+++ b/femutils/IArcaneFemBC.h
@@ -0,0 +1,73 @@
+// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
+//-----------------------------------------------------------------------------
+// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
+// See the top-level COPYRIGHT file for details.
+// SPDX-License-Identifier: Apache-2.0
+//-----------------------------------------------------------------------------
+#ifndef IARCANEFEMBC_H
+#define IARCANEFEMBC_H
+
+#include
+#include
+
+using namespace Arcane;
+
+namespace BC
+{
+
+class IDirichletPointCondition
+{
+ public:
+ virtual Arcane::NodeGroup getNode() =0;
+ virtual Real getValue() =0;
+ virtual Real getPenalty() =0;
+ virtual String getEnforceDirichletMethod() =0;
+};
+
+class IDirichletBoundaryCondition
+{
+ public:
+ virtual Arcane::FaceGroup getSurface() =0;
+ virtual Real getValue() =0;
+ virtual Real getPenalty() =0;
+ virtual String getEnforceDirichletMethod() =0;
+};
+
+class INeumannBoundaryCondition
+{
+ public:
+ virtual Arcane::FaceGroup getSurface() =0;
+ virtual Real getValue() =0;
+ virtual Real getValueX() =0;
+ virtual Real getValueY() =0;
+ virtual bool hasValue() const =0;
+ virtual bool hasValueX() const =0;
+ virtual bool hasValueY() const =0;
+};
+
+class IManufacturedSolution
+{
+ public:
+ virtual bool getManufacturedSource() =0;
+ virtual bool getManufacturedDirichlet() =0;
+ virtual Real getPenalty() =0;
+ virtual String getEnforceDirichletMethod() =0;
+};
+
+class IArcaneFemBC
+{
+ public:
+ virtual ~IArcaneFemBC() = default;
+ virtual ConstArrayView dirichletPointConditions() =0;
+ virtual ConstArrayView dirichletBoundaryConditions() =0;
+ virtual ConstArrayView neumannBoundaryConditions() =0;
+ virtual ConstArrayView manufacturedSolutions() =0;
+ virtual String getHandler() =0;
+};
+
+}
+
+/*---------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+
+#endif
\ No newline at end of file
diff --git a/fourier/Fem.axl b/fourier/Fem.axl
index 99d60d40..dcea0cf7 100644
--- a/fourier/Fem.axl
+++ b/fourier/Fem.axl
@@ -33,37 +33,6 @@
Type of mesh provided to the solver
-
-
-
- Dirichlet boundary condition
-
-
-
- FaceGroup on which to apply these boundary condition
-
-
-
-
- Value of the boundary condition
-
-
-
-
- Method via which Dirichlet boundary condition is imposed
-
-
-
-
- Penalty value for enforcing Dirichlet condition
-
-
-
-
-
-
-
- Neumann boundary condition
-
-
-
- FaceGroup on which to apply these boundary condition
-
-
-
-
- Value of the boundary condition
-
-
-
-
- Value of the Neumann load in x
-
-
-
-
- Value of the Neumann load in y
-
-
-
-
-
-
-
-
- Dirichlet point condition
-
-
-
- NodeGroup on which to apply these point Dirichlet condition
-
-
-
-
- Value of the point Dirichlet condition
-
-
-
-
- Method via which Dirichlet boundary condition is imposed
-
-
-
-
- Penalty value for enforcing Dirichlet condition
-
-
-
-
-
+
+
+
+
+
+
diff --git a/fourier/FemModule.cc b/fourier/FemModule.cc
index 01cc540c..13f59332 100644
--- a/fourier/FemModule.cc
+++ b/fourier/FemModule.cc
@@ -180,26 +180,28 @@ _assembleLinearOperator()
if (options()->qdot.isPresent())
ArcaneFemFunctions::BoundaryConditions2D::applyConstantSourceToRhs(qdot, mesh(), node_dof, m_node_coord, rhs_values);
- for (const auto& bs : options()->neumannBoundaryCondition())
- ArcaneFemFunctions::BoundaryConditions2D::applyNeumannToRhs(bs, node_dof, m_node_coord, rhs_values);
- for (const auto& bs : options()->dirichletBoundaryCondition())
- ArcaneFemFunctions::BoundaryConditions2D::applyDirichletToLhsAndRhs(bs, node_dof, m_node_coord, m_linear_system, rhs_values);
+ BC::IArcaneFemBC* bc = options()->boundaryConditions();
- if (options()->manufacturedSolution.isPresent()) {
- const auto& bs = options()->manufacturedSolution()[0];
+ if(bc){
+ for (BC::INeumannBoundaryCondition* bs : bc->neumannBoundaryConditions())
+ ArcaneFemFunctions::BoundaryConditions2D::applyNeumannToRhs(bs, node_dof, m_node_coord, rhs_values);
- if (bs->manufacturedSource.isPresent()) {
- ARCANE_CHECK_POINTER(m_manufactured_source);
- info() << "Apply manufactured Source condition to all cells";
- ArcaneFemFunctions::BoundaryConditions2D::applyManufacturedSourceToRhs(m_manufactured_source, mesh(), node_dof, m_node_coord, rhs_values);
- }
+ for (BC::IDirichletBoundaryCondition* bs : bc->dirichletBoundaryConditions())
+ ArcaneFemFunctions::BoundaryConditions2D::applyDirichletToLhsAndRhs(bs, node_dof, m_node_coord, m_linear_system, rhs_values);
- if (bs->manufacturedDirichlet.isPresent()) {
- ARCANE_CHECK_POINTER(m_manufactured_dirichlet);
- info() << "Apply manufactured dirichlet condition to all borders";
- FaceGroup group = mesh()->outerFaces();
- ArcaneFemFunctions::BoundaryConditions2D::applyManufacturedDirichletToLhsAndRhs(m_manufactured_dirichlet, lambda, group, bs, node_dof, m_node_coord, m_linear_system, rhs_values);
+ for (BC::IManufacturedSolution* bs : bc->manufacturedSolutions()){
+ if (bs->getManufacturedSource()){
+ ARCANE_CHECK_POINTER(m_manufactured_source);
+ info() << "Apply manufactured Source condition to all cells";
+ ArcaneFemFunctions::BoundaryConditions2D::applyManufacturedSourceToRhs(m_manufactured_source, mesh(), node_dof, m_node_coord, rhs_values);
+ }
+ if (bs->getManufacturedDirichlet()){
+ ARCANE_CHECK_POINTER(m_manufactured_dirichlet);
+ info() << "Apply manufactured dirichlet condition to all borders";
+ FaceGroup group = mesh()->outerFaces();
+ ArcaneFemFunctions::BoundaryConditions2D::applyManufacturedDirichletToLhsAndRhs(m_manufactured_dirichlet, lambda, group, bs, node_dof, m_node_coord, m_linear_system, rhs_values);
+ }
}
}
}
diff --git a/fourier/FemModule.h b/fourier/FemModule.h
index 218c1d99..4063baf8 100644
--- a/fourier/FemModule.h
+++ b/fourier/FemModule.h
@@ -28,6 +28,7 @@
#include
#include
+#include "IArcaneFemBC.h"
#include "IDoFLinearSystemFactory.h"
#include "Fem_axl.h"
#include "FemUtils.h"
diff --git a/fourier/Test.conduction.10k.arc b/fourier/Test.conduction.10k.arc
index 2c9ff8c5..4aa9a4f0 100644
--- a/fourier/Test.conduction.10k.arc
+++ b/fourier/Test.conduction.10k.arc
@@ -22,25 +22,33 @@
1.75
1e5
-
- Cercle
- 50.0
-
-
- Bas
- 5.0
-
-
- Haut
- 21.0
-
-
- Droite
- 15.0
-
-
- Gauche
- 0.0
-
+
+
+ Penalty
+ 1.e12
+ Cercle
+ 50.0
+
+
+ Penalty
+ 1.e12
+ Bas
+ 5.0
+
+
+ Penalty
+ 1.e12
+ Haut
+ 21.0
+
+
+ Droite
+ 15.0
+
+
+ Gauche
+ 0.0
+
+
diff --git a/fourier/Test.conduction.arc b/fourier/Test.conduction.arc
index 45dedbdb..26848de3 100644
--- a/fourier/Test.conduction.arc
+++ b/fourier/Test.conduction.arc
@@ -23,31 +23,33 @@
1.75
1e5
test1_results.txt
-
- Penalty
- 1.e12
- Cercle
- 50.0
-
-
- Penalty
- 1.e12
- Bas
- 5.0
-
-
- Penalty
- 1.e12
- Haut
- 21.0
-
-
- Droite
- 15.0
-
-
- Gauche
- 0.0
-
+
+
+ Penalty
+ 1.e12
+ Cercle
+ 50.0
+
+
+ Penalty
+ 1.e12
+ Bas
+ 5.0
+
+
+ Penalty
+ 1.e12
+ Haut
+ 21.0
+
+
+ Droite
+ 15.0
+
+
+ Gauche
+ 0.0
+
+
diff --git a/fourier/Test.conduction.heterogeneous.10k.arc b/fourier/Test.conduction.heterogeneous.10k.arc
index 93347b33..21ddb408 100644
--- a/fourier/Test.conduction.heterogeneous.10k.arc
+++ b/fourier/Test.conduction.heterogeneous.10k.arc
@@ -22,22 +22,24 @@
0.0
15.
-
- Left
- 50.0
-
-
- Right
- 5.0
-
-
- Top
- 0.0
-
-
- Bot
- 0.0
-
+
+
+ Left
+ 50.0
+
+
+ Right
+ 5.0
+
+
+ Top
+ 0.0
+
+
+ Bot
+ 0.0
+
+
Mat1
100.0
diff --git a/fourier/Test.conduction.heterogeneous.arc b/fourier/Test.conduction.heterogeneous.arc
index 3c2ebb32..c3deeb0c 100644
--- a/fourier/Test.conduction.heterogeneous.arc
+++ b/fourier/Test.conduction.heterogeneous.arc
@@ -23,22 +23,24 @@
0.0
15.
test2_results.txt
-
- Left
- 50.0
-
-
- Right
- 5.0
-
-
- Top
- 0.0
-
-
- Bot
- 0.0
-
+
+
+ Left
+ 50.0
+
+
+ Right
+ 5.0
+
+
+ Top
+ 0.0
+
+
+ Bot
+ 0.0
+
+
Mat1
100.0
diff --git a/fourier/Test.conduction.quad4.arc b/fourier/Test.conduction.quad4.arc
index c5dfeb3e..03bd31b1 100644
--- a/fourier/Test.conduction.quad4.arc
+++ b/fourier/Test.conduction.quad4.arc
@@ -23,25 +23,27 @@
1.75
1e5
QUAD4
-
- Cercle
- 50.0
-
-
- Bas
- 5.0
-
-
- Haut
- 21.0
-
-
- Droite
- 15.0
-
-
- Gauche
- 0.0
-
+
+
+ Cercle
+ 50.0
+
+
+ Bas
+ 5.0
+
+
+ Haut
+ 21.0
+
+
+ Droite
+ 15.0
+
+
+ Gauche
+ 0.0
+
+
diff --git a/fourier/Test.manufacture.solution.arc b/fourier/Test.manufacture.solution.arc
index 66bd5e14..dfd9608b 100644
--- a/fourier/Test.manufacture.solution.arc
+++ b/fourier/Test.manufacture.solution.arc
@@ -31,8 +31,14 @@
true
true
- Penalty
+
+
+ true
+ true
+ Penalty
+
+
1.0
diff --git a/laplace/Fem.axl b/laplace/Fem.axl
index a4fcc334..0de81d04 100644
--- a/laplace/Fem.axl
+++ b/laplace/Fem.axl
@@ -21,125 +21,11 @@
Type of mesh provided to the solver
-
-
-
- Dirichlet boundary condition
-
-
-
- Function for Dirichlet boundary condition
-
-
-
-
- Method via which Dirichlet boundary condition is imposed
-
-
-
-
- Penalty value for enforcing Dirichlet condition
-
-
-
-
- Function for manufactured source term condition
-
-
-
+
+
-
-
-
- Dirichlet boundary condition
-
-
-
- FaceGroup on which to apply these boundary condition
-
-
-
-
- Value of the boundary condition
-
-
-
-
- Method via which Dirichlet boundary condition is imposed
-
-
-
-
- Penalty value for enforcing Dirichlet condition
-
-
-
+
+
-
-
- Neumann boundary condition
-
-
- FaceGroup on which to apply the boundary condition
-
-
-
- Value of the boundary condition
-
-
-
- Neumann load value in x-direction
-
-
-
- Neumann load value in y-direction
-
-
-
-
-
-
-
-
- Dirichlet point condition
-
-
-
- NodeGroup on which to apply these point Dirichlet condition
-
-
-
-
- Value of the point Dirichlet condition
-
-
-
-
- Method via which Dirichlet boundary condition is imposed
-
-
-
-
- Penalty value for enforcing Dirichlet condition
-
-
-
-
-
diff --git a/laplace/FemModule.cc b/laplace/FemModule.cc
index de2ce131..211e90c3 100644
--- a/laplace/FemModule.cc
+++ b/laplace/FemModule.cc
@@ -123,14 +123,17 @@ _assembleLinearOperator()
auto node_dof(m_dofs_on_nodes.nodeDoFConnectivityView());
- for (const auto& bs : options()->neumannBoundaryCondition())
- ArcaneFemFunctions::BoundaryConditions2D::applyNeumannToRhs(bs, node_dof, m_node_coord, rhs_values);
+ BC::IArcaneFemBC* bc = options()->boundaryConditions();
+ if(bc){
+ for (BC::INeumannBoundaryCondition* bs : bc->neumannBoundaryConditions())
+ ArcaneFemFunctions::BoundaryConditions2D::applyNeumannToRhs(bs, node_dof, m_node_coord, rhs_values);
- for (const auto& bs : options()->dirichletBoundaryCondition())
- ArcaneFemFunctions::BoundaryConditions2D::applyDirichletToLhsAndRhs(bs, node_dof, m_node_coord, m_linear_system, rhs_values);
+ for (BC::IDirichletBoundaryCondition* bs : bc->dirichletBoundaryConditions())
+ ArcaneFemFunctions::BoundaryConditions2D::applyDirichletToLhsAndRhs(bs, node_dof, m_node_coord, m_linear_system, rhs_values);
- for (const auto& bs : options()->dirichletPointCondition())
- ArcaneFemFunctions::BoundaryConditions2D::applyPointDirichletToLhsAndRhs(bs, node_dof, m_node_coord, m_linear_system, rhs_values);
+ for (BC::IDirichletPointCondition* bs : bc->dirichletPointConditions())
+ ArcaneFemFunctions::BoundaryConditions2D::applyPointDirichletToLhsAndRhs(bs, node_dof, m_node_coord, m_linear_system, rhs_values);
+ }
}
/*---------------------------------------------------------------------------*/
diff --git a/laplace/FemModule.h b/laplace/FemModule.h
index a423597c..04d432f6 100644
--- a/laplace/FemModule.h
+++ b/laplace/FemModule.h
@@ -25,6 +25,7 @@
#include
#include
+#include "IArcaneFemBC.h"
#include "IDoFLinearSystemFactory.h"
#include "Fem_axl.h"
#include "FemUtils.h"
diff --git a/laplace/Test.L-shape.3D.arc b/laplace/Test.L-shape.3D.arc
index 7f69e21e..439c5327 100644
--- a/laplace/Test.L-shape.3D.arc
+++ b/laplace/Test.L-shape.3D.arc
@@ -22,13 +22,15 @@
test_3D_L-shape.txt
TETRA4
-
- bot
- 50.0
-
-
- bc
- 10.0
-
+
+
+ bot
+ 50.0
+
+
+ bc
+ 10.0
+
+
diff --git a/laplace/Test.PointDirichlet-refined.arc b/laplace/Test.PointDirichlet-refined.arc
index 8ac11dcf..4b9a1222 100644
--- a/laplace/Test.PointDirichlet-refined.arc
+++ b/laplace/Test.PointDirichlet-refined.arc
@@ -20,21 +20,23 @@
-
- topLeftCorner
- 50.0
-
-
- topRightCorner
- 20.0
-
-
- botLeftCorner
- 20.0
-
-
- botRightCorner
- 50.0
-
+
+
+ topLeftCorner
+ 50.0
+
+
+ topRightCorner
+ 20.0
+
+
+ botLeftCorner
+ 20.0
+
+
+ botRightCorner
+ 50.0
+
+
diff --git a/laplace/Test.PointDirichlet.arc b/laplace/Test.PointDirichlet.arc
index 5109b1b6..29306da0 100644
--- a/laplace/Test.PointDirichlet.arc
+++ b/laplace/Test.PointDirichlet.arc
@@ -21,22 +21,24 @@
test3_results.txt
-
- topLeftCorner
- 50.0
-
-
- topRightCorner
- 20.0
-
-
- botLeftCorner
- 20.0
-
-
- botRightCorner
- 50.0
-
+
+
+ topLeftCorner
+ 50.0
+
+
+ topRightCorner
+ 20.0
+
+
+ botLeftCorner
+ 20.0
+
+
+ botRightCorner
+ 50.0
+
+
diff --git a/laplace/Test.ring.arc b/laplace/Test.ring.arc
index b135c429..53ddbc21 100644
--- a/laplace/Test.ring.arc
+++ b/laplace/Test.ring.arc
@@ -20,13 +20,15 @@
-
- inner
- 50.0
-
-
- outer
- 20.0
-
+
+
+ inner
+ 50.0
+
+
+ outer
+ 20.0
+
+
From 13f92203616b50e76ceaefb4e2bd386b03c026fe Mon Sep 17 00:00:00 2001
From: Mohd Afeef Badri <52162083+mohd-afeef-badri@users.noreply.github.com>
Date: Fri, 30 Aug 2024 13:50:22 +0200
Subject: [PATCH 2/4] manufacture solutions via service
---
femutils/IArcaneFemBC.h | 5 +++++
fourier/Fem.axl | 31 ---------------------------
fourier/FemModule.cc | 27 +++++++++++------------
fourier/Test.manufacture.solution.arc | 4 ----
4 files changed, 18 insertions(+), 49 deletions(-)
diff --git a/femutils/IArcaneFemBC.h b/femutils/IArcaneFemBC.h
index 071f6bc6..d8caf985 100644
--- a/femutils/IArcaneFemBC.h
+++ b/femutils/IArcaneFemBC.h
@@ -9,6 +9,7 @@
#include
#include
+#include
using namespace Arcane;
@@ -52,6 +53,10 @@ class IManufacturedSolution
virtual bool getManufacturedDirichlet() =0;
virtual Real getPenalty() =0;
virtual String getEnforceDirichletMethod() =0;
+ virtual ICaseFunction* getManufacturedDirichletFunction() =0;
+ virtual IStandardFunction* getManufacturedDirichletStandardFunction() =0;
+ virtual ICaseFunction* getManufacturedSourceFunction() =0;
+ virtual IStandardFunction* getManufacturedSourceStandardFunction() =0;
};
class IArcaneFemBC
diff --git a/fourier/Fem.axl b/fourier/Fem.axl
index dcea0cf7..719d859a 100644
--- a/fourier/Fem.axl
+++ b/fourier/Fem.axl
@@ -33,37 +33,6 @@
Type of mesh provided to the solver
-
-
-
- Dirichlet boundary condition
-
-
-
- Function for Dirichlet boundary condition
-
-
-
-
- Method via which Dirichlet boundary condition is imposed
-
-
-
-
- Penalty value for enforcing Dirichlet condition
-
-
-
-
- Function for manufactured source term condition
-
-
-
-
manufacturedSolution.isPresent()) {
- const auto& bs = options()->manufacturedSolution()[0];
+ BC::IArcaneFemBC* bc = options()->boundaryConditions();
- if (bs->manufacturedSource.isPresent()) {
- ICaseFunction* opt_function_source = bs->manufacturedSource.function();
- IStandardFunction* scf_source = bs->manufacturedSource.standardFunction();
+ for (BC::IManufacturedSolution* bs : bc->manufacturedSolutions()) {
+ if (bs->getManufacturedSource()) {
+ ICaseFunction* opt_function_source = bs->getManufacturedSourceFunction();
+ IStandardFunction* scf_source = bs->getManufacturedSourceStandardFunction();
if (!scf_source)
ARCANE_FATAL("No standard case function for option 'manufactured-source-condition'");
auto* functorS = scf_source->getFunctorRealReal3ToReal();
@@ -44,9 +44,9 @@ startInit()
m_manufactured_source = functorS;
}
- if (bs->manufacturedDirichlet.isPresent()) {
- ICaseFunction* opt_function = bs->manufacturedDirichlet.function();
- IStandardFunction* scf = bs->manufacturedDirichlet.standardFunction();
+ if (bs->getManufacturedDirichlet()) {
+ ICaseFunction* opt_function = bs->getManufacturedDirichletFunction();
+ IStandardFunction* scf = bs->getManufacturedDirichletStandardFunction();
if (!scf)
ARCANE_FATAL("No standard case function for option 'manufactured-dirichlet-condition'");
auto* functor = scf->getFunctorRealReal3ToReal();
@@ -180,23 +180,22 @@ _assembleLinearOperator()
if (options()->qdot.isPresent())
ArcaneFemFunctions::BoundaryConditions2D::applyConstantSourceToRhs(qdot, mesh(), node_dof, m_node_coord, rhs_values);
-
BC::IArcaneFemBC* bc = options()->boundaryConditions();
- if(bc){
+ if (bc) {
for (BC::INeumannBoundaryCondition* bs : bc->neumannBoundaryConditions())
ArcaneFemFunctions::BoundaryConditions2D::applyNeumannToRhs(bs, node_dof, m_node_coord, rhs_values);
for (BC::IDirichletBoundaryCondition* bs : bc->dirichletBoundaryConditions())
ArcaneFemFunctions::BoundaryConditions2D::applyDirichletToLhsAndRhs(bs, node_dof, m_node_coord, m_linear_system, rhs_values);
- for (BC::IManufacturedSolution* bs : bc->manufacturedSolutions()){
- if (bs->getManufacturedSource()){
+ for (BC::IManufacturedSolution* bs : bc->manufacturedSolutions()) {
+ if (bs->getManufacturedSource()) {
ARCANE_CHECK_POINTER(m_manufactured_source);
info() << "Apply manufactured Source condition to all cells";
- ArcaneFemFunctions::BoundaryConditions2D::applyManufacturedSourceToRhs(m_manufactured_source, mesh(), node_dof, m_node_coord, rhs_values);
+ ArcaneFemFunctions::BoundaryConditions2D::applyManufacturedSourceToRhs(m_manufactured_source, mesh(), node_dof, m_node_coord, rhs_values);
}
- if (bs->getManufacturedDirichlet()){
+ if (bs->getManufacturedDirichlet()) {
ARCANE_CHECK_POINTER(m_manufactured_dirichlet);
info() << "Apply manufactured dirichlet condition to all borders";
FaceGroup group = mesh()->outerFaces();
diff --git a/fourier/Test.manufacture.solution.arc b/fourier/Test.manufacture.solution.arc
index dfd9608b..61f26189 100644
--- a/fourier/Test.manufacture.solution.arc
+++ b/fourier/Test.manufacture.solution.arc
@@ -28,10 +28,6 @@
-
- true
- true
-
true
From bf55be6868ab5f8744ccc4944103954124e450bf Mon Sep 17 00:00:00 2001
From: Mohd Afeef Badri <52162083+mohd-afeef-badri@users.noreply.github.com>
Date: Fri, 30 Aug 2024 14:15:10 +0200
Subject: [PATCH 3/4] fix for manufactured solution via services
---
fourier/FemModule.cc | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/fourier/FemModule.cc b/fourier/FemModule.cc
index b522a04a..7acfce24 100644
--- a/fourier/FemModule.cc
+++ b/fourier/FemModule.cc
@@ -329,16 +329,16 @@ _solve()
m_u[node] = v;
}
- if (options()->manufacturedSolution.isPresent()) {
+ for (BC::IManufacturedSolution* bs : options()->boundaryConditions()->manufacturedSolutions())
ENUMERATE_ (Node, inode, ownNodes()) {
Node node = *inode;
m_u_exact[node] = m_manufactured_dirichlet->apply(lambda, m_node_coord[node]);
}
- }
}
m_u.synchronize();
- if (options()->manufacturedSolution.isPresent())
+
+ for (BC::IManufacturedSolution* bs : options()->boundaryConditions()->manufacturedSolutions())
m_u_exact.synchronize();
}
From e380011c2a81f2169949c47d60c19d70b61adcdf Mon Sep 17 00:00:00 2001
From: Mohd Afeef Badri <52162083+mohd-afeef-badri@users.noreply.github.com>
Date: Fri, 30 Aug 2024 14:15:26 +0200
Subject: [PATCH 4/4] add comments
---
fourier/Test.conduction.10k.arc | 51 +++++++++++++---
fourier/Test.conduction.arc | 52 +++++++++++++---
fourier/Test.conduction.heterogeneous.10k.arc | 55 ++++++++++++++---
fourier/Test.conduction.heterogeneous.arc | 56 ++++++++++++++---
fourier/Test.conduction.quad4.arc | 54 +++++++++++++---
fourier/Test.manufacture.solution.arc | 61 ++++++++++++++++---
6 files changed, 273 insertions(+), 56 deletions(-)
diff --git a/fourier/Test.conduction.10k.arc b/fourier/Test.conduction.10k.arc
index 4aa9a4f0..d70c66bc 100644
--- a/fourier/Test.conduction.10k.arc
+++ b/fourier/Test.conduction.10k.arc
@@ -1,24 +1,42 @@
+
+
+
- Sample
+ Fouriers equation FEM code fine mesh
FourierLoop
-
- 1
-
-
-
-
+
plancher.10k.msh
+
1.75
1e5
@@ -51,4 +69,19 @@
+
+
+
+ 1
+
+
+
+
diff --git a/fourier/Test.conduction.arc b/fourier/Test.conduction.arc
index 26848de3..394cd125 100644
--- a/fourier/Test.conduction.arc
+++ b/fourier/Test.conduction.arc
@@ -1,24 +1,43 @@
+
+
+
- Sample
+ Fouriers equation FEM code
FourierLoop
-
- 1
-
-
-
-
+
plancher.msh
+
1.75
1e5
@@ -52,4 +71,19 @@
+
+
+
+ 1
+
+
+
+
diff --git a/fourier/Test.conduction.heterogeneous.10k.arc b/fourier/Test.conduction.heterogeneous.10k.arc
index 21ddb408..804fad6c 100644
--- a/fourier/Test.conduction.heterogeneous.10k.arc
+++ b/fourier/Test.conduction.heterogeneous.10k.arc
@@ -1,24 +1,46 @@
+
+
+
- Sample
+ Fouriers equation FEM code with heterogenous material and fine mesh
FourierLoop
-
- 1
-
-
-
-
+
multi-material.10k.msh
+
0.0
15.
@@ -49,4 +71,19 @@
1.0
+
+
+
+ 1
+
+
+
+
diff --git a/fourier/Test.conduction.heterogeneous.arc b/fourier/Test.conduction.heterogeneous.arc
index c3deeb0c..07961f68 100644
--- a/fourier/Test.conduction.heterogeneous.arc
+++ b/fourier/Test.conduction.heterogeneous.arc
@@ -1,24 +1,47 @@
+
+
+
- Sample
+ Fouriers equation FEM code with heterogenous material
FourierLoop
-
- 1
-
-
-
-
+
multi-material.msh
+
0.0
15.
@@ -50,4 +73,19 @@
1.0
+
+
+
+ 1
+
+
+
+
diff --git a/fourier/Test.conduction.quad4.arc b/fourier/Test.conduction.quad4.arc
index 03bd31b1..7e9e3689 100644
--- a/fourier/Test.conduction.quad4.arc
+++ b/fourier/Test.conduction.quad4.arc
@@ -1,24 +1,43 @@
+
+
+
- Sample
+ Fouriers equation FEM code with quad mesh
FourierLoop
-
- 1
-
-
-
-
+
plancher.quad4.msh
+
1.75
1e5
@@ -46,4 +65,19 @@
-
+
+
+
+ 1
+
+
+
+
+
\ No newline at end of file
diff --git a/fourier/Test.manufacture.solution.arc b/fourier/Test.manufacture.solution.arc
index 61f26189..09d57628 100644
--- a/fourier/Test.manufacture.solution.arc
+++ b/fourier/Test.manufacture.solution.arc
@@ -1,25 +1,41 @@
+
+
+
- Sample
+ Fouriers equation FEM code with maufactured solution
FourierLoop
-
- 1
-
-
-
-
+
square_-2pi_to_2pi.msh
+
ExternalFunctions.dll
@@ -27,6 +43,15 @@
+
@@ -37,4 +62,20 @@
1.0
+
+
+
+ 1
+
+
+
+