﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc
6285	Minimal tearing failing for example from MSL	Andreas Heuermann	Andreas Heuermann	"When disabling linear tearing for PR https://github.com/OpenModelica/OpenModelica/pull/6969 (related ticket #6196) we have some examples from the testsuite that are failing to simulate.

They are working with normal tearing and without tearing, but not with minimal tearing.

For example for `Modelica.Electrical.Machines.Examples.AsynchronousInductionMachines.AIMC_Transformer` we can run:
{{{
cd(""temp"");
loadModel(Modelica,{""3.2.3""}); getErrorString();
setCommandLineOptions(""-d=newInst --tearingMethod=minimalTearing""); getErrorString();
simulate(Modelica.Electrical.Machines.Examples.AsynchronousInductionMachines.AIMC_Transformer); getErrorString();
}}}

and see that the linear solver will fail to solve linear system 536 in every time step:
{{{
LOG_LS            | info    | Start solving Linear System 536 (size 28) at time 0.002621 with Lapack Solver
LOG_LS            | warning | Failed to solve linear system of equations (no. 536) at time 0.002621. Residual norm is 104868561.449326.
LOG_LS            | warning | The default linear solver fails, the fallback solver with total pivoting is started at time 0.002621. That might raise performance issues, for more information use -lv LOG_LS.
LOG_LS            | info    | Start solving Linear System 536 (size 28) at time 0.002621 with Total Pivot Solver
}}}

The relevant loop should be
{{{
################################################################################
 dumpLoops: SORTED COMPONENT 
################################################################################

torn linear Equationsystem:

internal vars (0)

residual vars (28)
1: transformer.l2sigma.v[2]:VARIABLE(unit = ""V"" )  ""Voltage drops of the two polyphase plugs"" type: Real [3]
2: $DER.transformer.l2sigma.inductor[2].i:DUMMY_DER(fixed = false )  ""Current flowing from pin p to pin n"" type: Real [3]
3: transformer.l1sigma.inductor[2].i:STATE(1)(start = 0.0 unit = ""A"" )  ""Current flowing from pin p to pin n"" type: Real [3]
4: transformer.l1sigma.v[2]:VARIABLE(unit = ""V"" )  ""Voltage drops of the two polyphase plugs"" type: Real [3]
5: transformer.l1sigma.plug_n.pin[2].v:VARIABLE(flow=false unit = ""V"" )  ""Potential at the pin"" type: Real [3]
6: transformer.core.v1[2]:VARIABLE(unit = ""V"" )  type: Real [3]
7: transformer.core.v3[2]:VARIABLE(unit = ""V"" )  type: Real [3]
8: transformer.core.plug_p2.pin[2].v:VARIABLE(flow=false unit = ""V"" )  ""Potential at the pin"" type: Real [3]
9: transformer.core.v2[2]:VARIABLE(unit = ""V"" )  type: Real [3]
10: transformer.l1sigma.inductor[3].i:STATE(1)(start = 0.0 unit = ""A"" )  ""Current flowing from pin p to pin n"" type: Real [3]
11: $DER.transformer.l2sigma.inductor[3].i:DUMMY_DER(fixed = false )  ""Current flowing from pin p to pin n"" type: Real [3]
12: transformer.l2sigma.v[3]:VARIABLE(unit = ""V"" )  ""Voltage drops of the two polyphase plugs"" type: Real [3]
13: transformer.core.plug_p2.pin[3].v:VARIABLE(flow=false unit = ""V"" )  ""Potential at the pin"" type: Real [3]
14: transformer.core.v3[3]:VARIABLE(unit = ""V"" )  type: Real [3]
15: transformer.core.v1[3]:VARIABLE(unit = ""V"" )  type: Real [3]
16: transformer.core.v2[3]:VARIABLE(unit = ""V"" )  type: Real [3]
17: transformer.starpoint1.v:VARIABLE(flow=false unit = ""V"" )  ""Potential at the pin"" type: Real
18: transformer.l1sigma.plug_n.pin[1].v:VARIABLE(flow=false unit = ""V"" )  ""Potential at the pin"" type: Real [3]
19: transformer.l1sigma.v[1]:VARIABLE(unit = ""V"" )  ""Voltage drops of the two polyphase plugs"" type: Real [3]
20: $DER.transformer.l1sigma.inductor[1].i:DUMMY_DER(fixed = false )  ""Current flowing from pin p to pin n"" type: Real [3]
21: $DER.transformer.l2sigma.inductor[1].i:DUMMY_DER(fixed = false )  ""Current flowing from pin p to pin n"" type: Real [3]
22: transformer.l2sigma.v[1]:VARIABLE(unit = ""V"" )  ""Voltage drops of the two polyphase plugs"" type: Real [3]
23: transformer.core.plug_p2.pin[1].v:VARIABLE(flow=false unit = ""V"" )  ""Potential at the pin"" type: Real [3]
24: transformer.core.v3[1]:VARIABLE(unit = ""V"" )  type: Real [3]
25: transformer.core.v1[1]:VARIABLE(unit = ""V"" )  type: Real [3]
26: transformer.core.v2[1]:VARIABLE(unit = ""V"" )  type: Real [3]
27: transformer.l1sigma.v[3]:VARIABLE(unit = ""V"" )  ""Voltage drops of the two polyphase plugs"" type: Real [3]
28: transformer.l1sigma.plug_n.pin[3].v:VARIABLE(flow=false unit = ""V"" )  ""Potential at the pin"" type: Real [3]

internal equations (0)

residual equations (28)
1/1 (1): transformer.l1sigma.v[3] = transformer.r1.plug_n.pin[3].v - transformer.l1sigma.plug_n.pin[3].v   [dynamic |0|0|0|0|]
2/2 (1): transformer.l1sigma.inductor[3].L * der(transformer.l1sigma.inductor[3].i) = transformer.l1sigma.v[3]   [dynamic |0|0|0|0|]
3/3 (1): transformer.core.v1[1] = transformer.core.n12 * transformer.core.v2[1]   [dynamic |0|0|0|0|]
4/4 (1): transformer.core.v1[1] = transformer.core.n13 * transformer.core.v3[1]   [dynamic |0|0|0|0|]
5/5 (1): transformer.core.v2[1] = transformer.core.plug_p2.pin[1].v - transformer.core.v3[1]   [dynamic |0|0|0|0|]
6/6 (1): transformer.l2sigma.v[1] = transformer.l2sigma.plug_p.pin[1].v - transformer.core.plug_p2.pin[1].v   [dynamic |0|0|0|0|]
7/7 (1): transformer.l2sigma.inductor[1].L * $DER.transformer.l2sigma.inductor[1].i = transformer.l2sigma.v[1]   [dynamic |0|0|0|0|]
8/8 (1): 0.0 = $DER.transformer.l1sigma.inductor[1].i + $DER.transformer.l2sigma.inductor[1].i / transformer.core.n12 + $DER.transformer.l2sigma.inductor[1].i / transformer.core.n13   [dynamic |0|0|0|0|]
9/9 (1): transformer.l1sigma.inductor[1].L * $DER.transformer.l1sigma.inductor[1].i = transformer.l1sigma.v[1]   [dynamic |0|0|0|0|]
10/10 (1): transformer.l1sigma.v[1] = transformer.r1.plug_n.pin[1].v - transformer.l1sigma.plug_n.pin[1].v   [dynamic |0|0|0|0|]
11/11 (1): transformer.core.v1[1] = transformer.l1sigma.plug_n.pin[1].v - transformer.starpoint1.v   [dynamic |0|0|0|0|]
12/12 (1): transformer.core.v1[3] = transformer.l1sigma.plug_n.pin[3].v - transformer.starpoint1.v   [dynamic |0|0|0|0|]
13/13 (1): transformer.core.v1[3] = transformer.core.n12 * transformer.core.v2[3]   [dynamic |0|0|0|0|]
14/14 (1): transformer.core.v1[3] = transformer.core.n13 * transformer.core.v3[3]   [dynamic |0|0|0|0|]
15/15 (1): transformer.core.v2[3] = transformer.core.plug_p2.pin[3].v - transformer.core.v3[3]   [dynamic |0|0|0|0|]
16/16 (1): transformer.l2sigma.v[3] = transformer.l2sigma.plug_p.pin[3].v - transformer.core.plug_p2.pin[3].v   [dynamic |0|0|0|0|]
17/17 (1): transformer.l2sigma.inductor[3].L * $DER.transformer.l2sigma.inductor[3].i = transformer.l2sigma.v[3]   [dynamic |0|0|0|0|]
18/18 (1): 0.0 = der(transformer.l1sigma.inductor[3].i) + $DER.transformer.l2sigma.inductor[3].i / transformer.core.n12 + $DER.transformer.l2sigma.inductor[3].i / transformer.core.n13   [dynamic |0|0|0|0|]
19/19 (1): $DER.transformer.l1sigma.inductor[1].i + der(transformer.l1sigma.inductor[2].i) + der(transformer.l1sigma.inductor[3].i) = 0.0   [dynamic |0|0|0|0|]
20/20 (1): transformer.core.v1[2] = transformer.core.n12 * transformer.core.v2[2]   [dynamic |0|0|0|0|]
21/21 (1): transformer.core.v2[2] = transformer.core.plug_p2.pin[2].v - transformer.core.v3[2]   [dynamic |0|0|0|0|]
22/22 (1): transformer.core.v1[2] = transformer.core.n13 * transformer.core.v3[2]   [dynamic |0|0|0|0|]
23/23 (1): transformer.core.v1[2] = transformer.l1sigma.plug_n.pin[2].v - transformer.starpoint1.v   [dynamic |0|0|0|0|]
24/24 (1): transformer.l1sigma.v[2] = transformer.r1.plug_n.pin[2].v - transformer.l1sigma.plug_n.pin[2].v   [dynamic |0|0|0|0|]
25/25 (1): transformer.l1sigma.inductor[2].L * der(transformer.l1sigma.inductor[2].i) = transformer.l1sigma.v[2]   [dynamic |0|0|0|0|]
26/26 (1): 0.0 = der(transformer.l1sigma.inductor[2].i) + $DER.transformer.l2sigma.inductor[2].i / transformer.core.n12 + $DER.transformer.l2sigma.inductor[2].i / transformer.core.n13   [dynamic |0|0|0|0|]
27/27 (1): transformer.l2sigma.inductor[2].L * $DER.transformer.l2sigma.inductor[2].i = transformer.l2sigma.v[2]   [dynamic |0|0|0|0|]
28/28 (1): transformer.l2sigma.v[2] = transformer.l2sigma.plug_p.pin[2].v - transformer.core.plug_p2.pin[2].v   [dynamic |0|0|0|0|]
}}}

With tearing enabled this loop will look like
{{{
################################################################################
 dumpLoops: SORTED COMPONENT 
################################################################################

torn linear Equationsystem:

internal vars (25)
1: $DER.transformer.l2sigma.inductor[2].i:DUMMY_DER(fixed = false )  ""Current flowing from pin p to pin n"" type: Real [3]
2: transformer.l2sigma.v[2]:VARIABLE(unit = ""V"" )  ""Voltage drops of the two polyphase plugs"" type: Real [3]
3: transformer.l1sigma.v[2]:VARIABLE(unit = ""V"" )  ""Voltage drops of the two polyphase plugs"" type: Real [3]
4: transformer.core.plug_p2.pin[2].v:VARIABLE(flow=false unit = ""V"" )  ""Potential at the pin"" type: Real [3]
5: transformer.l1sigma.plug_n.pin[2].v:VARIABLE(flow=false unit = ""V"" )  ""Potential at the pin"" type: Real [3]
6: transformer.core.v3[2]:VARIABLE(unit = ""V"" )  type: Real [3]
7: transformer.core.v2[2]:VARIABLE(unit = ""V"" )  type: Real [3]
8: transformer.starpoint1.v:VARIABLE(flow=false unit = ""V"" )  ""Potential at the pin"" type: Real
9: $DER.transformer.l2sigma.inductor[3].i:DUMMY_DER(fixed = false )  ""Current flowing from pin p to pin n"" type: Real [3]
10: transformer.l2sigma.v[3]:VARIABLE(unit = ""V"" )  ""Voltage drops of the two polyphase plugs"" type: Real [3]
11: transformer.l1sigma.v[3]:VARIABLE(unit = ""V"" )  ""Voltage drops of the two polyphase plugs"" type: Real [3]
12: $DER.transformer.l1sigma.inductor[1].i:DUMMY_DER(fixed = false )  ""Current flowing from pin p to pin n"" type: Real [3]
13: $DER.transformer.l2sigma.inductor[1].i:DUMMY_DER(fixed = false )  ""Current flowing from pin p to pin n"" type: Real [3]
14: transformer.l1sigma.v[1]:VARIABLE(unit = ""V"" )  ""Voltage drops of the two polyphase plugs"" type: Real [3]
15: transformer.l2sigma.v[1]:VARIABLE(unit = ""V"" )  ""Voltage drops of the two polyphase plugs"" type: Real [3]
16: transformer.core.plug_p2.pin[3].v:VARIABLE(flow=false unit = ""V"" )  ""Potential at the pin"" type: Real [3]
17: transformer.l1sigma.plug_n.pin[1].v:VARIABLE(flow=false unit = ""V"" )  ""Potential at the pin"" type: Real [3]
18: transformer.core.v1[1]:VARIABLE(unit = ""V"" )  type: Real [3]
19: transformer.core.v3[1]:VARIABLE(unit = ""V"" )  type: Real [3]
20: transformer.core.v2[1]:VARIABLE(unit = ""V"" )  type: Real [3]
21: transformer.core.plug_p2.pin[1].v:VARIABLE(flow=false unit = ""V"" )  ""Potential at the pin"" type: Real [3]
22: transformer.l1sigma.plug_n.pin[3].v:VARIABLE(flow=false unit = ""V"" )  ""Potential at the pin"" type: Real [3]
23: transformer.core.v1[3]:VARIABLE(unit = ""V"" )  type: Real [3]
24: transformer.core.v3[3]:VARIABLE(unit = ""V"" )  type: Real [3]
25: transformer.core.v2[3]:VARIABLE(unit = ""V"" )  type: Real [3]

residual vars (3)
1: transformer.l1sigma.inductor[3].i:STATE(1)(start = 0.0 unit = ""A"" )  ""Current flowing from pin p to pin n"" type: Real [3]
2: transformer.core.v1[2]:VARIABLE(unit = ""V"" )  type: Real [3]
3: transformer.l1sigma.inductor[2].i:STATE(1)(start = 0.0 unit = ""A"" )  ""Current flowing from pin p to pin n"" type: Real [3]

internal equations (25)
1/1 (1): 0.0 = der(transformer.l1sigma.inductor[2].i) + $DER.transformer.l2sigma.inductor[2].i / transformer.core.n12 + $DER.transformer.l2sigma.inductor[2].i / transformer.core.n13   [dynamic |0|0|0|0|]
2/2 (1): transformer.l2sigma.inductor[2].L * $DER.transformer.l2sigma.inductor[2].i = transformer.l2sigma.v[2]   [dynamic |0|0|0|0|]
3/3 (1): transformer.l1sigma.inductor[2].L * der(transformer.l1sigma.inductor[2].i) = transformer.l1sigma.v[2]   [dynamic |0|0|0|0|]
4/4 (1): transformer.l2sigma.v[2] = transformer.l2sigma.plug_p.pin[2].v - transformer.core.plug_p2.pin[2].v   [dynamic |0|0|0|0|]
5/5 (1): transformer.l1sigma.v[2] = transformer.r1.plug_n.pin[2].v - transformer.l1sigma.plug_n.pin[2].v   [dynamic |0|0|0|0|]
6/6 (1): transformer.core.v1[2] = transformer.core.n13 * transformer.core.v3[2]   [dynamic |0|0|0|0|]
7/7 (1): transformer.core.v1[2] = transformer.core.n12 * transformer.core.v2[2]   [dynamic |0|0|0|0|]
8/8 (1): transformer.core.v1[2] = transformer.l1sigma.plug_n.pin[2].v - transformer.starpoint1.v   [dynamic |0|0|0|0|]
9/9 (1): 0.0 = der(transformer.l1sigma.inductor[3].i) + $DER.transformer.l2sigma.inductor[3].i / transformer.core.n12 + $DER.transformer.l2sigma.inductor[3].i / transformer.core.n13   [dynamic |0|0|0|0|]
10/10 (1): transformer.l2sigma.inductor[3].L * $DER.transformer.l2sigma.inductor[3].i = transformer.l2sigma.v[3]   [dynamic |0|0|0|0|]
11/11 (1): transformer.l1sigma.inductor[3].L * der(transformer.l1sigma.inductor[3].i) = transformer.l1sigma.v[3]   [dynamic |0|0|0|0|]
12/12 (1): $DER.transformer.l1sigma.inductor[1].i + der(transformer.l1sigma.inductor[2].i) + der(transformer.l1sigma.inductor[3].i) = 0.0   [dynamic |0|0|0|0|]
13/13 (1): 0.0 = $DER.transformer.l1sigma.inductor[1].i + $DER.transformer.l2sigma.inductor[1].i / transformer.core.n12 + $DER.transformer.l2sigma.inductor[1].i / transformer.core.n13   [dynamic |0|0|0|0|]
14/14 (1): transformer.l1sigma.inductor[1].L * $DER.transformer.l1sigma.inductor[1].i = transformer.l1sigma.v[1]   [dynamic |0|0|0|0|]
15/15 (1): transformer.l2sigma.inductor[1].L * $DER.transformer.l2sigma.inductor[1].i = transformer.l2sigma.v[1]   [dynamic |0|0|0|0|]
16/16 (1): transformer.l2sigma.v[3] = transformer.l2sigma.plug_p.pin[3].v - transformer.core.plug_p2.pin[3].v   [dynamic |0|0|0|0|]
17/17 (1): transformer.l1sigma.v[1] = transformer.r1.plug_n.pin[1].v - transformer.l1sigma.plug_n.pin[1].v   [dynamic |0|0|0|0|]
18/18 (1): transformer.core.v1[1] = transformer.l1sigma.plug_n.pin[1].v - transformer.starpoint1.v   [dynamic |0|0|0|0|]
19/19 (1): transformer.core.v1[1] = transformer.core.n13 * transformer.core.v3[1]   [dynamic |0|0|0|0|]
20/20 (1): transformer.core.v1[1] = transformer.core.n12 * transformer.core.v2[1]   [dynamic |0|0|0|0|]
21/21 (1): transformer.core.v2[1] = transformer.core.plug_p2.pin[1].v - transformer.core.v3[1]   [dynamic |0|0|0|0|]
22/22 (1): transformer.l1sigma.v[3] = transformer.r1.plug_n.pin[3].v - transformer.l1sigma.plug_n.pin[3].v   [dynamic |0|0|0|0|]
23/23 (1): transformer.core.v1[3] = transformer.l1sigma.plug_n.pin[3].v - transformer.starpoint1.v   [dynamic |0|0|0|0|]
24/24 (1): transformer.core.v1[3] = transformer.core.n13 * transformer.core.v3[3]   [dynamic |0|0|0|0|]
25/25 (1): transformer.core.v1[3] = transformer.core.n12 * transformer.core.v2[3]   [dynamic |0|0|0|0|]

residual equations (3)
1/1 (1): transformer.l2sigma.v[1] = transformer.l2sigma.plug_p.pin[1].v - transformer.core.plug_p2.pin[1].v   [dynamic |0|0|0|0|]
2/2 (1): transformer.core.v2[3] = transformer.core.plug_p2.pin[3].v - transformer.core.v3[3]   [dynamic |0|0|0|0|]
3/3 (1): transformer.core.v2[2] = transformer.core.plug_p2.pin[2].v - transformer.core.v3[2]   [dynamic |0|0|0|0|]
}}}"	defect	reopened	critical		Backend	v1.17.0-dev		tearing, minimalTearing, linear system	Karim Adbdelhak
