Skip to content

Commit

Permalink
Merge pull request #154 from arcaneframework/dev/mab/boundary-conditi…
Browse files Browse the repository at this point in the history
…ons-service

Boundary condition service
  • Loading branch information
mohd-afeef-badri authored Aug 30, 2024
2 parents 6183b64 + e380011 commit ad3d5c2
Show file tree
Hide file tree
Showing 32 changed files with 843 additions and 798 deletions.
118 changes: 3 additions & 115 deletions acoustics/Fem.axl
Original file line number Diff line number Diff line change
Expand Up @@ -38,122 +38,10 @@
<description>Type of mesh provided to the solver</description>
</simple>


<!-- - - - - - dirichlet-boundary-condition - - - - -->
<complex name = "dirichlet-boundary-condition"
type = "DirichletBoundaryCondition"
minOccurs = "0"
maxOccurs = "unbounded"
>
<description>
Dirichlet boundary condition
</description>
<extended name = "surface" type = "Arcane::FaceGroup">
<description>
FaceGroup on which to apply these boundary condition
</description>
</extended>
<simple name = "value" type = "real">
<description>
Value of the boundary condition
</description>
</simple>
<simple name = "enforce-Dirichlet-method" type = "string" default="Penalty" optional="true">
<description>
Method via which Dirichlet boundary condition is imposed
</description>
</simple>
<simple name = "penalty" type = "real" default="1.e30" optional="true">
<description>
Penalty value for enforcing Dirichlet condition
</description>
</simple>
</complex>

<!-- - - - - - manufactured-solution - - - - -->
<complex name = "manufactured-solution"
type = "ManufacturedSolution"
minOccurs = "0"
maxOccurs = "unbounded"
>
<description>
Dirichlet boundary condition
</description>
<simple name="manufactured-dirichlet" type="bool" default="false" optional="true">
<description>
Function for Dirichlet boundary condition
</description>
</simple>
<simple name = "enforce-Dirichlet-method" type = "string" default="Penalty" optional="true">
<description>
Method via which Dirichlet boundary condition is imposed
</description>
</simple>
<simple name = "penalty" type = "real" default="1.e30" optional="true">
<description>
Penalty value for enforcing Dirichlet condition
</description>
</simple>
<simple name="manufactured-source" type="bool" default="false" optional="true">
<description>
Function for manufactured source term condition
</description>
</simple>
</complex>

<!-- - - - - - dirichlet-point-condition - - - - -->
<complex name = "dirichlet-point-condition"
type = "DirichletPointCondition"
minOccurs = "0"
maxOccurs = "unbounded"
>
<description>
Dirichlet point condition
</description>
<extended name = "node" type = "Arcane::NodeGroup">
<description>
NodeGroup on which to apply these point Dirichlet condition
</description>
</extended>
<simple name = "value" type = "real">
<description>
Value of the point Dirichlet condition
</description>
</simple>
<simple name = "enforce-Dirichlet-method" type = "string" default="Penalty" optional="true">
<description>
Method via which Dirichlet boundary condition is imposed
</description>
</simple>
<simple name = "penalty" type = "real" default="1.e30" optional="true">
<description>
Penalty value for enforcing Dirichlet condition
</description>
</simple>
</complex>

<!-- - - - - - neumann-boundary-condition - - - - -->
<complex name="neumann-boundary-condition" type="NeumannBoundaryCondition" minOccurs="0" maxOccurs="unbounded">
<description>Neumann boundary condition</description>

<extended name="surface" type="Arcane::FaceGroup">
<description>FaceGroup on which to apply the boundary condition</description>
</extended>

<simple name="value" type="real" optional="true">
<description>Value of the boundary condition</description>
</simple>

<simple name="valueX" type="real" optional="true">
<description>Neumann load value in x-direction</description>
</simple>

<simple name="valueY" type="real" optional="true">
<description>Neumann load value in y-direction</description>
</simple>
</complex>

<!-- Linear system service instance -->
<service-instance name="linear-system" type="Arcane::FemUtils::IDoFLinearSystemFactory" default="AlephLinearSystem" />

<!-- Boundary conditions service instance -->
<service-instance name = "boundary-conditions" type = "BC::IArcaneFemBC" optional = "true" default="FemBoundaryConditions" />
</options>
</module>
7 changes: 5 additions & 2 deletions acoustics/FemModule.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
}

Expand Down
1 change: 1 addition & 0 deletions acoustics/FemModule.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include <arcane/ItemGroup.h>
#include <arcane/ICaseMng.h>

#include "IArcaneFemBC.h"
#include "IDoFLinearSystemFactory.h"
#include "Fem_axl.h"
#include "FemUtils.h"
Expand Down
12 changes: 7 additions & 5 deletions acoustics/Test.sub.arc
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,18 @@
<!--
FEM (Finite Element Method) settings:
- kc2: Coefficient used in the FEM calculations.
- neumann-boundary-condition: Defines boundary conditions for the simulation.
- boundary-conditions: Defines neumann boundary conditions for the simulation.
- linear-system: Specifies the linear system solver to use.
- result-file: File for validation (optional)
-->
<fem>
<kc2>.11e1</kc2>
<neumann-boundary-condition>
<surface>inner1</surface>
<value>1.0</value>
</neumann-boundary-condition>
<boundary-conditions>
<neumann>
<surface>inner1</surface>
<value>1.0</value>
</neumann>
</boundary-conditions>
<linear-system name="SequentialBasicLinearSystem" />
<result-file>sub_2D.txt</result-file>
</fem>
Expand Down
12 changes: 7 additions & 5 deletions acoustics/Test.sub.hypre.arc
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,18 @@
<!--
FEM (Finite Element Method) settings:
- kc2: Coefficient used in the FEM calculations.
- neumann-boundary-condition: Defines boundary conditions for the simulation.
- boundary-conditions: Defines neumann boundary conditions for the simulation.
- linear-system: Specifies the linear system solver to use.
- result-file: File for validation (optional)
-->
<fem>
<kc2>.11e1</kc2>
<neumann-boundary-condition>
<surface>inner1</surface>
<value>1.0</value>
</neumann-boundary-condition>
<boundary-conditions>
<neumann>
<surface>inner1</surface>
<value>1.0</value>
</neumann>
</boundary-conditions>
<linear-system>
<solver-backend>hypre</solver-backend>
<solver-method>bicgstab</solver-method>
Expand Down
131 changes: 4 additions & 127 deletions electrostatics/Fem.axl
Original file line number Diff line number Diff line change
Expand Up @@ -30,134 +30,11 @@
<description>Type of mesh provided to the solver</description>
</simple>

<!-- - - - - - dirichlet-boundary-condition - - - - -->
<complex name = "dirichlet-boundary-condition"
type = "DirichletBoundaryCondition"
minOccurs = "0"
maxOccurs = "unbounded"
>
<description>
Dirichlet boundary condition
</description>
<extended name = "surface" type = "Arcane::FaceGroup">
<description>
FaceGroup on which to apply these boundary condition
</description>
</extended>
<simple name = "value" type = "real">
<description>
Value of the boundary condition
</description>
</simple>
<simple name = "enforce-Dirichlet-method" type = "string" default="Penalty" optional="true">
<description>
Method via which Dirichlet boundary condition is imposed
</description>
</simple>
<simple name = "penalty" type = "real" default="1.e30" optional="true">
<description>
Penalty value for enforcing Dirichlet condition
</description>
</simple>
</complex>

<!-- - - - - - manufactured-solution - - - - -->
<complex name = "manufactured-solution"
type = "ManufacturedSolution"
minOccurs = "0"
maxOccurs = "unbounded"
>
<description>
Dirichlet boundary condition
</description>
<simple name="manufactured-dirichlet" type="bool" default="false" optional="true">
<description>
Function for Dirichlet boundary condition
</description>
</simple>
<simple name = "enforce-Dirichlet-method" type = "string" default="Penalty" optional="true">
<description>
Method via which Dirichlet boundary condition is imposed
</description>
</simple>
<simple name = "penalty" type = "real" default="1.e30" optional="true">
<description>
Penalty value for enforcing Dirichlet condition
</description>
</simple>
<simple name="manufactured-source" type="bool" default="false" optional="true">
<description>
Function for manufactured source term condition
</description>
</simple>
</complex>
<!-- Linear system service instance -->
<service-instance name="linear-system" type="Arcane::FemUtils::IDoFLinearSystemFactory" default="AlephLinearSystem" />

<!-- - - - - - neumann-boundary-condition - - - - -->
<complex name = "neumann-boundary-condition"
type = "NeumannBoundaryCondition"
minOccurs = "0"
maxOccurs = "unbounded"
>
<description>
Neumann boundary condition
</description>
<extended name = "surface" type = "Arcane::FaceGroup">
<description>
FaceGroup on which to apply these boundary condition
</description>
</extended>
<simple name = "value" type = "real" optional = "true">
<description>
Value of the boundary condition
</description>
</simple>
<simple name = "valueX" type = "real" optional = "true">
<description>
Value of the Neumann load in x
</description>
</simple>
<simple name = "valueY" type = "real" optional = "true">
<description>
Value of the Neumann load in y
</description>
</simple>
</complex>


<!-- - - - - - dirichlet-point-condition - - - - -->
<complex name = "dirichlet-point-condition"
type = "DirichletPointCondition"
minOccurs = "0"
maxOccurs = "unbounded"
>
<description>
Dirichlet point condition
</description>
<extended name = "node" type = "Arcane::NodeGroup">
<description>
NodeGroup on which to apply these point Dirichlet condition
</description>
</extended>
<simple name = "value" type = "real">
<description>
Value of the point Dirichlet condition
</description>
</simple>
<simple name = "enforce-Dirichlet-method" type = "string" default="Penalty" optional="true">
<description>
Method via which Dirichlet boundary condition is imposed
</description>
</simple>
<simple name = "penalty" type = "real" default="1.e30" optional="true">
<description>
Penalty value for enforcing Dirichlet condition
</description>
</simple>
</complex>

<service-instance name = "linear-system"
type = "Arcane::FemUtils::IDoFLinearSystemFactory"
default = "AlephLinearSystem"
/>
<!-- Boundary conditions service instance -->
<service-instance name = "boundary-conditions" type = "BC::IArcaneFemBC" optional = "true" default="FemBoundaryConditions" />
</options>
</module>
7 changes: 5 additions & 2 deletions electrostatics/FemModule.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
1 change: 1 addition & 0 deletions electrostatics/FemModule.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include <arcane/ItemGroup.h>
#include <arcane/ICaseMng.h>

#include "IArcaneFemBC.h"
#include "IDoFLinearSystemFactory.h"
#include "Fem_axl.h"
#include "FemUtils.h"
Expand Down
27 changes: 15 additions & 12 deletions electrostatics/Test.Capacitor.arc
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,20 @@
<fem>
<rho>0.0</rho>
<epsilon>1.0</epsilon>
<dirichlet-boundary-condition>
<surface>capacitor1</surface>
<value>-1.0</value>
</dirichlet-boundary-condition>
<dirichlet-boundary-condition>
<surface>capacitor2</surface>
<value>1.0</value>
</dirichlet-boundary-condition>
<dirichlet-boundary-condition>
<surface>Outer</surface>
<value>0.0</value>
</dirichlet-boundary-condition>

<boundary-conditions>
<dirichlet>
<surface>capacitor1</surface>
<value>-1.0</value>
</dirichlet>
<dirichlet>
<surface>capacitor2</surface>
<value>1.0</value>
</dirichlet>
<dirichlet>
<surface>Outer</surface>
<value>0.0</value>
</dirichlet>
</boundary-conditions>
</fem>
</case>
Loading

0 comments on commit ad3d5c2

Please sign in to comment.