From 2eb45f59c2685554c64698578b160956c04c7293 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Henrotte?= <francois.henrotte@uclouvain.be> Date: Fri, 20 Oct 2017 17:00:27 +0200 Subject: [PATCH] new tuto: electrostatics with global quantities --- Electrostatics/microstrip.pro | 4 +- ElectrostaticsFloating/floating.geo | 58 ++++++ ElectrostaticsFloating/floating.pro | 303 ++++++++++++++++++++++++++++ 3 files changed, 362 insertions(+), 3 deletions(-) create mode 100644 ElectrostaticsFloating/floating.geo create mode 100644 ElectrostaticsFloating/floating.pro diff --git a/Electrostatics/microstrip.pro b/Electrostatics/microstrip.pro index 445b20e..5eb0caa 100644 --- a/Electrostatics/microstrip.pro +++ b/Electrostatics/microstrip.pro @@ -14,8 +14,6 @@ To compute the solution interactively from the Gmsh GUI: File > Open > microstrip.pro Run (button at the bottom of the left panel) - - The microstrip.pro file describes the finite element (FE) model. ------------------------------------------------------------------- */ Group { @@ -90,7 +88,7 @@ FunctionSpace { - a set of scalar basis functions ("BF_Node" means nodal basis functions) - a constraint (here the Dirichlet boundary conditions) - The FE representation of the unknown field "v" reads + The FE expansion of the unknown field "v" reads v = Sum_k vn_k sn_k diff --git a/ElectrostaticsFloating/floating.geo b/ElectrostaticsFloating/floating.geo new file mode 100644 index 0000000..8b791bd --- /dev/null +++ b/ElectrostaticsFloating/floating.geo @@ -0,0 +1,58 @@ +/* ------------------------------------------------------------------- + File "microstrip.geo" + + This file is the geometrical description used by GMSH to produce + the file "microstrip.msh". + ------------------------------------------------------------------- */ + +/* Definition of some parameters for geometrical dimensions, i.e. + h (height of 'Diel1'), w (width of 'Line'), t (thickness of 'Line') + xBox (width of the air box) and yBox (height of the air box) */ + +h = 1.e-3 ; w = 4.72e-3 ; t = 0.035e-3 ; +xBox = w/2. * 6. ; yBox = h * 12. ; + +/* Definition of parameters for local mesh dimensions */ + +s = 1. ; +p0 = h / 10. * s ; +pLine0 = w/2. / 10. * s ; pLine1 = w/2. / 50. * s ; +pxBox = xBox / 10. * s ; pyBox = yBox / 8. * s ; + +/* Definition of gemetrical points */ + +Point(1) = { 0 , 0, 0, p0} ; +Point(2) = { xBox, 0, 0, pxBox} ; +Point(3) = { xBox, h, 0, pxBox} ; +Point(4) = { 0 , h, 0, pLine0} ; +Point(5) = { w/2., h, 0, pLine1} ; +Point(6) = { 0 , h+t, 0, pLine0} ; +Point(7) = { w/2., h+t, 0, pLine1} ; +Point(8) = { 0 , yBox, 0, pyBox} ; +Point(9) = { xBox, yBox, 0, pyBox} ; + +/* Definition of gemetrical lines */ + +Line(1) = {1,2}; Line(2) = {2,3}; Line(3) = {3,9}; +Line(4) = {9,8}; Line(5) = {8,6}; Line(7) = {4,1}; +Line(8) = {5,3}; Line(9) = {4,5}; Line(10) = {6,7}; +Line(11) = {5,7}; + +/* Definition of geometrical surfaces */ + +Line Loop(12) = {1, 2, -8, -9, 7}; Plane Surface(13) = {12}; +Line Loop(14) = {10,-11,8,3,4,5}; Plane Surface(15) = {14}; + +/* Definition of Physical entities (surfaces, lines). + The definition of Physical entities (Surfaces and Lines) + tells GMSH the elements and associated region numbers + that have to be saved in the mesh file 'microstrip.msh'. + For example, Region 111 is made of the triangle elements of the geometric surface 13, + whereas Region 121 is made of line elements of the geometric lines 9, 10 and 11. */ + +Physical Surface ("Air", 101) = {15}; +Physical Surface ("Dielectric", 111) = {13}; + +Physical Line ("Ground", 120) = {1} ; +Physical Line ("Electrode", 121) = {9,10,11} ; +Physical Line ("Surface infinity", 130) = {2,3,4} ; diff --git a/ElectrostaticsFloating/floating.pro b/ElectrostaticsFloating/floating.pro new file mode 100644 index 0000000..1b5ea46 --- /dev/null +++ b/ElectrostaticsFloating/floating.pro @@ -0,0 +1,303 @@ +/* ------------------------------------------------------------------- + Tutorial 4 : floating potential of a microstrip electrode + + Features: + - Global quantities and their special shape functions + - Duality + - More on ONELAB parameters (flags, model options, check boxes, menus, ...) + + To compute the solution interactively from the Gmsh GUI: + File > Open > floating.pro + Run (button at the bottom of the left panel) + + ------------------------------------------------------------------- */ + +/* + A Thing GetDP is pretty good at is the management of global (non-local) basis functions. + Finite element expansions typically associate basis functions to individual nodes + or edges in the mesh. But consider the situation where a scalar field is set to be uniform + over a region of the problem (a floating potential electrode in an Electrostatics problem, + to fix the idea). + By factorizing the identical nodal value "v_electrode", + a global (non-local) basis function "BF_electrode" is obtained as factor + which is the sum of the shape functions of all the nodes in the electrode region. + BF_electrode + - is a continuous function + - is equal to 1 at the nodes of the electrode region, and to 0 at all other nodes + - decreases from 1 to 0 over the one element thick layer of outside finite elements + immediately in contact with the electrode region + One such glabal basis function can be associated with each electrode in the system, + so that the finite element expansion of the electric scalar potential reads: + + v = Sum_k sn_k vn_k + Sum_electrode v_electrode BF_electrode + + We show in this tutorial how GetDP takes advantage of global quantities + and the associated global basis functions + - to reduce the number of unknowns + - to deal with floating potentials + - to compute efficiently the electrode charges "Q_electrode", + which are precisely the energy duals of the global "v_electrode" quantities + - to provide output quantities (charges, armature voltages, capacitances, ...) + that can be immediately used in a external circuit. + */ + + +Group { + /* Geometrical regions: */ + + Air = Region[101]; + Diel1 = Region[111]; + + Ground = Region[120]; + Microstrip = Region[121]; + SurfInf = Region[130]; + + /* Abstract regions: + Vol_Dielectric_Ele : dielectric volume regions where + "Div ( epsr[] Grad v)" is solved + Sur_Neu_Ele : Neumann bondary condition ( epsr[] n.Grad v = 0 ) + Electrodes_Ele : electrode regions + + + No prefix (Vol_ or Sur_) for the region "Electrodes_Ele", + which can contain both surface or volume regions. + There are two electrodes in this model: Ground and Microstrip + */ + + Vol_Dielectric_Ele = Region[ {Air, Diel1} ]; + Sur_Neu_Ele = Region[ {SurfInf} ]; + Electrodes_Ele = Region [ {Ground, Microstrip} ]; +} + +/* A number of ONELAB parameters are defined to define model parameters + or model options interactively. */ +MicrostripTypeBC = + DefineNumber[0, Name "1Microstrip excitation/Type", + Choices{ 0="Fixed voltage", 1="Fixed charge"} ] ; +MicrostripValueBC = + DefineNumber[1e-3, Name "1Microstrip excitation/Value"] ; +EpsilonRelDiel = + DefineNumber[9.8, Name "2Dielectric/Relative permittivity"] ; +DisplayGlobalBF = + DefineNumber[0, Name "3Options/Display global basis functions", Choices {0,1} ] ; +OverwriteOutput = + DefineNumber[1, Name "3Options/Overwrite output.txt file", Choices {0,1} ] ; + +Function { + epsr[Air] = 1.; + epsr[Diel1] = EpsilonRelDiel; + eps0 = 8.854187818e-12; // permittivity of empty space +} + + +Constraint { + /* Dirichlet boundary condition is no longer used. + The microstrip and the ground are now treated as electrodes */ + { Name Dirichlet_Ele; Type Assign; + Case {} + } + + { Name SetGlobalPotential; Type Assign; + Case { + /* Define the imposed potential regionwise on the different parts of "Electrodes_Ele". + No voltage imposed to the Microstrip electrode + when the "Fixed charge" option is enabled ( MicrostripTypeBC = true ). */ + { Region Ground; Value 0; } + If( !MicrostripTypeBC ) + { Region Microstrip; Value MicrostripValueBC; } + EndIf + } + } + { Name SetArmatureCharge; Type Assign; + Case { + If( MicrostripTypeBC ) + { Region Microstrip; Value MicrostripValueBC; } + EndIf + } + } +} + +Group{ + /* The domain of definition of lists all regions + on which the field "v" is defined.*/ + Dom_Hgrad_v_Ele = Region[ {Vol_Dielectric_Ele, + Sur_Neu_Ele, + Electrodes_Ele } ]; +} + +FunctionSpace { + /* The magic in the treatment of global quantitities by GetDP is in the fact + that nearly all is done at the level of the FunctionSpace definition. + + The finite element expansion is + + v = Sum_k sn_k vn_k + Sum_electrode v_electrode BF_electrode + + The sum_k runs over all nodes except those of the electrode regions. + "sf" stands for "BF_electrode" + "vf" stands for "v_electrode" + */ + + { Name Hgrad_v_Ele; Type Form0; + BasisFunction { + { Name sn; NameOfCoef vn; Function BF_Node; + Support Dom_Hgrad_v_Ele; Entity NodesOf[ All, Not Electrodes_Ele ]; } + { Name sf; NameOfCoef vf; Function BF_GroupOfNodes; + Support Dom_Hgrad_v_Ele; Entity GroupsOfNodesOf[ Electrodes_Ele ]; } + } + GlobalQuantity { + { Name GlobalPotential; Type AliasOf ; NameOfCoef vf; } + { Name ArmatureCharge ; Type AssociatedWith; NameOfCoef vf; } + } + Constraint { + { NameOfCoef vn; EntityType NodesOf; + NameOfConstraint Dirichlet_Ele; } // unused in this model + { NameOfCoef GlobalPotential; EntityType GroupsOfNodesOf; + NameOfConstraint SetGlobalPotential; } + { NameOfCoef ArmatureCharge; EntityType GroupsOfNodesOf; + NameOfConstraint SetArmatureCharge; } + } + // Subspace definition only needed to display "vf" in PostProcessing + SubSpace { + { Name vf; NameOfBasisFunction sf; } + } + } +} + +Jacobian { + { Name Vol ; + Case { + { Region All ; Jacobian Vol ; } + } + } +} + +Integration { + { Name Int ; + Case { {Type Gauss ; + Case { { GeoElement Triangle ; NumberOfPoints 4 ; } + { GeoElement Quadrangle ; NumberOfPoints 4 ; } } + } + } + } +} + +Formulation { + /* Minor changes in the formulation. + Global quantities are declared in the "Quantity{}" section. + The Global term triggers the creation of the addition equation + in the system that computes the charge Q_electrode carried by each electrode + + Q_electrode = (-epsr[] Grad v, Grad BF_electrode)_Vol_Dielectric_Ele + */ + { Name Electrostatics_v; Type FemEquation; + Quantity { + { Name v; Type Local; NameOfSpace Hgrad_v_Ele; } + { Name U; Type Global; NameOfSpace Hgrad_v_Ele [GlobalPotential]; } + { Name Q; Type Global; NameOfSpace Hgrad_v_Ele [ArmatureCharge]; } + // next line only needed to display the global BF in PostProcessing + { Name vf; Type Local; NameOfSpace Hgrad_v_Ele [vf]; } + } + Equation { + Galerkin { [ epsr[] * Dof{d v} , {d v} ]; In Vol_Dielectric_Ele; + Jacobian Vol; Integration Int; } + GlobalTerm { [ -Dof{Q}/eps0 , {U} ]; In Electrodes_Ele; } + } + } +} + +Resolution { + { Name EleSta_v; + System { + { Name Sys_Ele; NameOfFormulation Electrostatics_v; } + } + Operation { + Generate[Sys_Ele]; Solve[Sys_Ele]; SaveSolution[Sys_Ele]; + If( OverwriteOutput ) + DeleteFile[ "output.txt" ]; + EndIf + } + } +} + +PostProcessing { + { Name EleSta_v; NameOfFormulation Electrostatics_v; + Quantity { + { Name v; Value { Term { [ {v} ]; In Dom_Hgrad_v_Ele; Jacobian Vol; } } } + { Name e; Value { Term { [ -{d v} ]; In Dom_Hgrad_v_Ele; Jacobian Vol; } } } + { Name d; Value { Term { [ -eps0*epsr[] * {d v} ]; + In Dom_Hgrad_v_Ele; Jacobian Vol; } } } + { Name Q; Value { Term { [ {Q} ]; In Electrodes_Ele; } } } + { Name U; Value { Term { [ {U} ]; In Electrodes_Ele; } } } + { Name C; Value { Term { [ {Q}/{U} ]; + In Electrodes_Ele; } } } + { Name energy; + Value { Integral { Type Global; + [ eps0*epsr[] / 2. * SquNorm[{d v}] ]; + In Vol_Dielectric_Ele; Jacobian Vol; Integration Int; + } + } + } + // next lines only needed to display global basis functions in PostProcessing + { Name BFGround; Value { Term { [ BF {vf} ]; In Dom_Hgrad_v_Ele; + SubRegion Ground; Jacobian Vol; } } } + { Name BFMicrostrip; Value { Term { [ BF {vf} ]; In Dom_Hgrad_v_Ele; + SubRegion Microstrip; Jacobian Vol; } } } + + } + } +} + +/* Various output results associated with the global quantities are generated. + They are both displayed in the graphical user interface, and stored in disk files. + In particular, all global quantities related results + are stored in the "output.txt" file. + There is a user option to display the global Basis functions of the two electrodes + in the system. Another user option allow the user to chose to not overwrite + the "output.txt" file when running a new simulation. */ + +PostOperation { + { Name Map; NameOfPostProcessing EleSta_v; + Operation { + If( DisplayGlobalBF ) + Print[ BFGround, OnElementsOf Dom_Hgrad_v_Ele, File "BFGround.pos" ]; + Echo[ StrCat["l=PostProcessing.NbViews-1;", + "View[l].IntervalsType = 1;", + "View[l].NbIso = 40;", + "View[l].ShowElement = 1;"], + File "BFGround.opt", LastTimeStepOnly] ; + + Print[ BFMicrostrip, OnElementsOf Dom_Hgrad_v_Ele, File "BFMicrostrip.pos" ]; + Echo[ StrCat["l=PostProcessing.NbViews-1;", + "View[l].IntervalsType = 1;", + "View[l].NbIso = 40;", + "View[l].ShowElement = 1;"], + File "BFMicrostrip.opt", LastTimeStepOnly] ; + EndIf + + Print[ v, OnElementsOf Dom_Hgrad_v_Ele, File "v.pos" ]; + Echo[ StrCat["l=PostProcessing.NbViews-1;", + "View[l].IntervalsType = 3;", + "View[l].NbIso = 40;"], + File "mStrip_v.geo", LastTimeStepOnly] ; + + Echo[ "Microstrip charge [C]:", Format Table, File > "output.txt"] ; + Print[ Q, OnRegion Microstrip, File > "output.txt", Color "AliceBlue", + Format Table, SendToServer "Output/Microstrip/Charge [C]" ]; + Echo[ "Microstrip potential [V]:", Format Table, File > "output.txt"] ; + Print[ U, OnRegion Microstrip, File > "output.txt", Color "AliceBlue", + Format Table, SendToServer "Output/Microstrip/Potential [V]" ]; + Echo[ "Ground charge [C]:", Format Table, File > "output.txt"] ; + Print[ Q, OnRegion Ground, File > "output.txt", Color "AliceBlue", + Format Table, SendToServer "Output/Ground/Charge [C]" ]; + Echo[ "Microstrip capacitance [F]:", Format Table, File > "output.txt"] ; + Print[ C, OnRegion Microstrip, File > "output.txt", Color "AliceBlue", + Format Table, SendToServer "Output/Global/Capacitance [F]" ]; + Echo[ "Electrostatic energy [J]:", Format Table, File > "output.txt"] ; + Print[ energy, OnRegion Vol_Dielectric_Ele, File > "output.txt", Color "AliceBlue", + Format Table, SendToServer "Output/Global/Energy [J]" ]; + } + } +} + + -- GitLab