MCPcopy Create free account
hub / github.com/NGSolve/ngsolve / Solve

Method Solve

python/solve_implementation.py:88–148  ·  view source on GitHub ↗
(
        self,
        rhs,
        *args,
        dirichlet = None,
        pre = None,
        lin_solver=None,
        lin_solver_args = None,
        printrates: bool = False,
    )

Source from the content-addressed store, hash-verified

86 self.a.Apply(self.gf.vec, self.vec)
87
88 def Solve(
89 self,
90 rhs,
91 *args,
92 dirichlet = None,
93 pre = None,
94 lin_solver=None,
95 lin_solver_args = None,
96 printrates: bool = False,
97 ):
98 self.a.Assemble()
99 for arg in args:
100 if isinstance(arg, Dirichlet) or isinstance(arg, CoefficientFunction):
101 assert dirichlet is None, "Only one dirichlet condition can be set"
102 dirichlet = arg
103 if isinstance(arg, Preconditioner):
104 assert pre is None, "Only one preconditioner can be set"
105 pre = arg
106 if isinstance(arg, type) and issubclass(arg, LinearSolver):
107 assert lin_solver is None, "Only one linear solver can be set"
108 lin_solver = arg
109 rhs.Assemble()
110 if dirichlet is not None:
111 if isinstance(dirichlet, list):
112 for i in range(len(dirichlet)):
113 if dirichlet[i] is not None:
114 if isinstance(dirichlet[i], Dirichlet):
115 self.gf.components[i].Set(
116 dirichlet[i].cf, definedon=dirichlet[i].region
117 )
118 else:
119 self.gf.components[i].Set(dirichlet[i], BND)
120 elif isinstance(dirichlet, Dirichlet):
121 self.gf.Set(dirichlet.cf, definedon=dirichlet.region)
122 else:
123 self.gf.Set(dirichlet, BND)
124 rhs.vec.data += -self.a.mat * self.gf.vec
125 else:
126 self.gf.vec[:] = 0.0
127 if self.a.condense:
128 rhs.vec.data += self.a.harmonic_extension_trans * rhs.vec
129 if pre is None and lin_solver is None:
130 ainv = self.a.mat.Inverse(self.a.space.FreeDofs(self.a.condense))
131 else:
132 if lin_solver is None:
133 lin_solver = GMResSolver
134 if lin_solver_args is None:
135 lin_solver_args = {}
136 if pre is None:
137 freedofs = self.a.space.FreeDofs(self.a.condense)
138 else:
139 freedofs = None
140 if "printrates" not in lin_solver_args:
141 lin_solver_args["printrates"] = printrates
142 ainv = lin_solver(
143 mat=self.a.mat, pre=pre, freedofs=freedofs, **lin_solver_args
144 )
145 self.gf.vec.data += ainv * rhs.vec

Callers

nothing calls this directly

Calls 3

InverseMethod · 0.80
AssembleMethod · 0.45
SetMethod · 0.45

Tested by

no test coverage detected