diff --git a/CircuitCoupling/R_circuit.geo b/CircuitCoupling/R_circuit.geo new file mode 100644 index 0000000000000000000000000000000000000000..8a5b6f29daa0dbfc9fcddfe18494f921cc38f210 --- /dev/null +++ b/CircuitCoupling/R_circuit.geo @@ -0,0 +1,39 @@ +// Just 4 cubes + +Include "R_circuit_common.pro"; + +lc = 0.25; // Cjaracteristic length + +Point(1) = {0, 0, 0, lc}; +Extrude {1, 0, 0} { + Point{1}; +} +Extrude {0, 1, 0} { + Line{1}; // Layers{10}; Recombine; +} +Extrude {0, 0, 1} { + Surface{5}; // Layers{10}; Recombine; +} +Translate {2, 0, 0} { + Duplicata { Volume{1}; } +} +Translate {0, 4, 0} { + Duplicata { Volume{1}; } +} +Translate {2, 4, 0} { + Duplicata { Volume{1}; } +} + +Physical Surface(Cube1Top) = {27}; +Physical Surface(Cube1Bottom) = {5}; +Physical Surface(Cube2Top) = {34}; +Physical Surface(Cube2Bottom) = {29}; +Physical Surface(Cube3Top) = {61}; +Physical Surface(Cube3Bottom) = {56}; +Physical Surface(Cube4Top) = {88}; +Physical Surface(Cube4Bottom) = {83}; + +Physical Volume(Cube1) = {1}; +Physical Volume(Cube2) = {28}; +Physical Volume(Cube3) = {55}; +Physical Volume(Cube4) = {82}; diff --git a/CircuitCoupling/R_circuit.jpg b/CircuitCoupling/R_circuit.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14798d1d1a5249c1644f19b313a5cf35fcd967a7 Binary files /dev/null and b/CircuitCoupling/R_circuit.jpg differ diff --git a/CircuitCoupling/R_circuit.pro b/CircuitCoupling/R_circuit.pro new file mode 100644 index 0000000000000000000000000000000000000000..c93b64254e5510249146ae6b6c77bb473652bdfa --- /dev/null +++ b/CircuitCoupling/R_circuit.pro @@ -0,0 +1,334 @@ +/* ------------------------------------------------------------------- + Tutorial 8a : circuit coupling - resistive circuit + + Features: + - Electrokinetic formulation coupled with resistive circuit + - Definition of circuit elements (sources, resistances) + - Implementation of a netlist + + To compute the solution in a terminal: + getdp R_circuit -solve Jstatic -pos Cube_Top_Values_as_ASCII_File + + To compute the solution interactively from the Gmsh GUI: + File > Open > R_circuit.pro + Run (button at the bottom of the left panel) + ------------------------------------------------------------------- */ + +Include "R_circuit_common.pro"; + +// FEM domain group data +Group { + // Surfaces + Top1 = Region[Cube1Top]; + Bottom1 = Region[Cube1Bottom]; + Top2 = Region[Cube2Top]; + Bottom2 = Region[Cube2Bottom]; + Top3 = Region[Cube3Top]; + Bottom3 = Region[Cube3Bottom]; + Top4 = Region[Cube4Top]; + Bottom4 = Region[Cube4Bottom]; + + // Volumes + Cube1 = Region[Cube1]; + Cube2 = Region[Cube2]; + Cube3 = Region[Cube3]; + Cube4 = Region[Cube4]; + + // FEM Electrical regions + // * all volumes: + Vol_Ele = Region[{Cube1, Cube2, Cube3, Cube4}]; + // * all surfaces connected to the lumped element circuit + Sur_Ele = Region[{Top1, Bottom1, Top2, Bottom2, Top3, Bottom3, Top4, Bottom4}]; + // * total electrical computation domain: + VolWithSur_Ele = Region[{Vol_Ele, Sur_Ele}]; +} + +// Circuit group data (fictive regions for the circuit elements) +Group { + // Sources + CurrentSource1 = Region[{3001}]; + VoltageSource1 = Region[{3002}]; + + SourceI_Cir = Region[{CurrentSource1}]; // all current sources + SourceV_Cir = Region[{VoltageSource1}]; // all voltage sources + Sources_Cir = Region[{SourceI_Cir, SourceV_Cir}]; + + // Resistors + Res1 = Region[{4001}]; + Res2 = Region[{4002}]; + Res3 = Region[{4003}]; + Res4 = Region[{4004}]; + + Resistance_Cir = Region[{Res1, Res2, Res3, Res4}]; // All resistors + + // Complete circuit domain containing all circuit elements + Domain_Cir = Region[{Resistance_Cir, SourceI_Cir, SourceV_Cir}]; +} + +// FEM domain function data +Function { + // Absolute voltage at the bottom of all cubes; set via constraint Voltage_3D, + // not via a voltage source + Vbottom = 4.0; + + // Geometry of a cube + w = 1.0; // Width [m] + l = 1.0; // Length [m] + h = 1.0; // Height [m] + + // Resistance + Rcube1 = 20.0; // Resistance of cube 1 [Ohm] + Rcube2 = 40.0; // Resistance of cube 2 [Ohm] + Rcube3 = 60.0; // Resistance of cube 3 [Ohm] + Rcube4 = 10.0; // Resistance of cube 4 [Ohm] + + // Specific electrical conductivity [S*m/m^2] + kappa[Cube1] = h / (w * l * Rcube1); + kappa[Cube2] = h / (w * l * Rcube2); + kappa[Cube3] = h / (w * l * Rcube3); + kappa[Cube4] = h / (w * l * Rcube4); +} + +// Circuit domain function data +Function { + // External impedances functions + R[Res1] = 10.0; + R[Res2] = 20.0; + R[Res3] = 15.0; + R[Res4] = 10.0; +} + +// FEM domain constraint data +Constraint { + { Name Current_3D ; Type Assign ; + Case { + } + } + { Name Voltage_3D ; Type Assign ; + Case { + { Region Bottom1; Type Assign; Value Vbottom; } + { Region Bottom2; Type Assign; Value Vbottom; } + { Region Bottom3; Type Assign; Value Vbottom; } + { Region Bottom4; Type Assign; Value Vbottom; } + } + } +} + +// Circuit domain constraint data +Constraint { + { Name Current_Cir ; + Case { + { Region CurrentSource1; Value 1.0; } // CurrentSource1 has 1.0 A + } + } + { Name Voltage_Cir ; + Case { + { Region VoltageSource1; Value 10.0; } // VoltageSource1 has 10.0 V + } + } + { Name ElectricalCircuit ; Type Network ; + Case Circuit1 { + // Here the circuit netlist is implemented. The important thing is that + // each surface of the 3D geometry which is connected to the circuit + // (Sur_Ele) has a single voltage and current, but in the netlist they + // appear with two terminals (two nodes). The voltage between the two + // nodes corresponds to the absolute voltage of the surface. The current + // through the two nodes is the current flowing through the surface. In + // this simple case here we need the voltage drop across a cube (e.g. cube + // 1) in the netlist rather than the absolute voltage. Therefore the + // bottom-voltage has to be subtracted from the top-voltage. This is + // accomplished by connecting both surfaces anti-serial (e.g. at node 4; + // The voltage drop across cube 1 is then between node 2 and node 10). + + { Region VoltageSource1; Branch{1, 10}; } + { Region Res1; Branch{1, 2}; } + // Voltage between node 2 and node 4 corresponds to the absolute voltage + // of Top1: + { Region Top1; Branch{2, 4}; } + // Note the reverse order of the nodes here - it's for subtracting the + // bottom voltage: + { Region Bottom1; Branch{10, 4}; } + // Voltage between node 3 and node 5 corresponds to the absolute voltage + // of Top2: + { Region Res2; Branch{2, 3}; } + { Region Top2; Branch{3, 5}; } + // Note the reverse order of the nodes here! It's for subtracting the + // bottom voltage.: + { Region Bottom2; Branch{10, 5}; } + + { Region CurrentSource1; Branch{6, 10}; } + { Region Res3; Branch{6, 10}; } + // Voltage between node 6 and node 8 corresponds to the absolute voltage + // of Top3: + { Region Top3; Branch{6, 8}; } + // Note the reverse order of the nodes here! It's for subtracting the + // bottom voltage.: + { Region Bottom3; Branch{10, 8}; } + { Region Res4; Branch{6, 7}; } + // Voltage between node 7 and node 9 corresponds to the absolute voltage + // of Top4: + { Region Top4; Branch{7, 9}; } + // Note the reverse order of the nodes here! It's for subtracting the + // bottom voltage: + { Region Bottom4; Branch{10, 9}; } + } + } +} + +Jacobian { + { Name JVol ; + Case { + { Region Region[{Vol_Ele}]; Jacobian Vol; } + { Region Region[{Sur_Ele}]; Jacobian Sur; } + } + } +} + +Integration { + { Name I1 ; + Case { + { Type Gauss ; + Case { + { GeoElement Point ; NumberOfPoints 1 ; } + { GeoElement Line ; NumberOfPoints 5 ; } + { GeoElement Triangle ; NumberOfPoints 6 ; } + { GeoElement Quadrangle ; NumberOfPoints 7 ; } + { GeoElement Tetrahedron ; NumberOfPoints 15 ; } + { GeoElement Hexahedron ; NumberOfPoints 34 ; } + { GeoElement Prism ; NumberOfPoints 21 ; } + } + } + } + } +} + + +FunctionSpace { + { Name Hgrad_V; Type Form0; + BasisFunction { + // All nodes but the grouped nodes of the surfaces for connecting the + // circuitry + { Name sn; NameOfCoef vn; Function BF_Node; + Support VolWithSur_Ele; Entity NodesOf[ All, Not Sur_Ele ]; } + // Grouped nodes: Each surface of Sur_Ele has just one single voltage -> + // each surface is just one node effectively + { Name sf; NameOfCoef vf; Function BF_GroupOfNodes; + Support VolWithSur_Ele; Entity GroupsOfNodesOf[ Sur_Ele ]; } + } + GlobalQuantity { + // Voltage of the surfaces of Sur_Ele + { Name U; Type AliasOf; NameOfCoef vf; } + // Current flowing through the surfaces + { Name I; Type AssociatedWith; NameOfCoef vf; } + } + Constraint { + { NameOfCoef vn; EntityType NodesOf ; NameOfConstraint Voltage_3D; } + { NameOfCoef U; EntityType GroupsOfNodesOf ; NameOfConstraint Voltage_3D; } + { NameOfCoef I; EntityType GroupsOfNodesOf ; NameOfConstraint Current_3D; } + } + } + + { Name Hregion_Cir; Type Scalar; + BasisFunction { + { Name sn; NameOfCoef ir; Function BF_Region; + Support Domain_Cir; Entity Domain_Cir; } + } + GlobalQuantity { + { Name Iz; Type AliasOf; NameOfCoef ir; } + { Name Uz; Type AssociatedWith; NameOfCoef ir; } + } + Constraint { + { NameOfCoef Uz ; EntityType Region ; NameOfConstraint Voltage_Cir ; } + { NameOfCoef Iz ; EntityType Region ; NameOfConstraint Current_Cir ; } + } + } +} + +Formulation { + { Name Jstatic; Type FemEquation; + Quantity { + { Name V; Type Local; NameOfSpace Hgrad_V; } + { Name U; Type Global; NameOfSpace Hgrad_V [U]; } + { Name I; Type Global; NameOfSpace Hgrad_V [I]; } + { Name Uz; Type Global; NameOfSpace Hregion_Cir [Uz]; } + { Name Iz; Type Global; NameOfSpace Hregion_Cir [Iz]; } + } + Equation { + // FEM domain + Galerkin { [ kappa[] * Dof{d V}, {d V} ]; + In Vol_Ele; Integration I1; Jacobian JVol; } + GlobalTerm { [ Dof{I} , {U} ]; In Sur_Ele; } + + // Circuit related terms: Resistance equation + GlobalTerm { [ Dof{Uz}, {Iz} ]; In Resistance_Cir; } + GlobalTerm { [ R[] * Dof{Iz}, {Iz} ]; In Resistance_Cir; } + + // Here is the connection between the circuit and the finite element simulation + GlobalEquation { Type Network; NameOfConstraint ElectricalCircuit; + { Node {I}; Loop {U}; Equation {I}; In Sur_Ele; } + { Node {Iz}; Loop {Uz}; Equation {Uz}; In Domain_Cir; } + } + } + } +} + +Resolution { + { Name Jstatic; + System { + { Name Jstatic; NameOfFormulation Jstatic; } + } + Operation { + InitSolution[Jstatic]; + Generate[Jstatic]; + Solve[Jstatic]; + SaveSolution[Jstatic]; + } + } +} + +PostProcessing { + { Name Ele; NameOfFormulation Jstatic; + Quantity { + { Name V; Value{ Local{ [ {V} ]; In Vol_Ele; Jacobian JVol;} } } + { Name Jv; Value{ Local{ [ -kappa[]*{d V} ]; In Vol_Ele; Jacobian JVol;} } } + { Name J; Value{ Local{ [ Norm[kappa[]*{d V}] ]; In Vol_Ele; Jacobian JVol;} } } + { Name U; Value { Term { [ {U} ]; In Sur_Ele; } } } + { Name I; Value { Term { [ {I} ]; In Sur_Ele; } } } + } + } +} + +PostOperation { + // Absolute voltage [V] + { Name V; NameOfPostProcessing Ele; + Operation { + Print[ V, OnElementsOf Vol_Ele, File "Result_V.pos"]; + } + } + // Current density vectors [A/m^2] + { Name J_vectors; NameOfPostProcessing Ele; + Operation { + Print[ Jv, OnElementsOf Vol_Ele, File "Result_J_vectors.pos"]; + } + } + // Magnitude of current density [A/m^2] + { Name J_magnitude; NameOfPostProcessing Ele; + Operation { + Print[ J, OnElementsOf Vol_Ele, File "Result_J.pos"]; + } + } + // Store the results in an ASCII file + { Name Cube_Top_Values_as_ASCII_File; NameOfPostProcessing Ele; + Operation { + Print[U, OnRegion Top1, File "Result_CubeTopValues.txt", Format SimpleTable]; + Print[U, OnRegion Top2, File > "Result_CubeTopValues.txt", Format SimpleTable]; + Print[U, OnRegion Top3, File > "Result_CubeTopValues.txt", Format SimpleTable]; + Print[U, OnRegion Top4, File > "Result_CubeTopValues.txt", Format SimpleTable]; + + Print[I, OnRegion Top1, File > "Result_CubeTopValues.txt", Format SimpleTable]; + Print[I, OnRegion Top2, File > "Result_CubeTopValues.txt", Format SimpleTable]; + Print[I, OnRegion Top3, File > "Result_CubeTopValues.txt", Format SimpleTable]; + Print[I, OnRegion Top4, File > "Result_CubeTopValues.txt", Format SimpleTable]; + } + } +} diff --git a/CircuitCoupling/R_circuit_common.pro b/CircuitCoupling/R_circuit_common.pro new file mode 100644 index 0000000000000000000000000000000000000000..bb6a5d3bac6def106a8ba8714293dd2ac8927171 --- /dev/null +++ b/CircuitCoupling/R_circuit_common.pro @@ -0,0 +1,15 @@ +// Physical numbers for volumes +Cube1 = 1001; +Cube2 = 1002; +Cube3 = 1003; +Cube4 = 1004; + +// Physical numbers for surfaces +Cube1Top = 2001; +Cube1Bottom = 2002; +Cube2Top = 2003; +Cube2Bottom = 2004; +Cube3Top = 2005; +Cube3Bottom = 2006; +Cube4Top = 2007; +Cube4Bottom = 2008; \ No newline at end of file