Line data Source code
1 : //* This file is part of the MOOSE framework
2 : //* https://www.mooseframework.org
3 : //*
4 : //* All rights reserved, see COPYRIGHT for full restrictions
5 : //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 : //*
7 : //* Licensed under LGPL 2.1, please see LICENSE for details
8 : //* https://www.gnu.org/licenses/lgpl-2.1.html
9 :
10 : #include "KokkosVariableValue.h"
11 :
12 : #include "Coupleable.h"
13 : #include "SystemBase.h"
14 : #include "FEProblemBase.h"
15 :
16 : Moose::Kokkos::Variable
17 478 : Coupleable::kokkosCoupledVectorTagVariable(const std::string & var_name,
18 : const std::string & tag_name,
19 : unsigned int comp)
20 : {
21 478 : Moose::Kokkos::Variable variable;
22 :
23 478 : if (isCoupled(var_name))
24 : {
25 447 : const auto tag = _c_fe_problem.getVectorTagID(tag_name);
26 :
27 98 : auto var = const_cast<MooseVariableField<Real> *>(
28 349 : getVarHelper<MooseVariableField<Real>>(var_name, comp));
29 :
30 447 : if (tag_name == Moose::OLD_SOLUTION_TAG)
31 0 : var->sys().needSolutionState(1);
32 447 : else if (tag_name == Moose::OLDER_SOLUTION_TAG)
33 0 : var->sys().needSolutionState(2);
34 :
35 894 : variable.init({var}, tag, {});
36 :
37 447 : addFEVariableCoupleableVectorTag(tag);
38 : }
39 : else
40 93 : variable.init({_c_parameters.defaultCoupledValue(var_name, comp)}, {});
41 :
42 478 : return variable;
43 0 : }
44 :
45 : Moose::Kokkos::Variable
46 12 : Coupleable::kokkosCoupledVectorTagVariables(const std::string & var_name,
47 : const std::string & tag_name)
48 : {
49 12 : Moose::Kokkos::Variable variable;
50 :
51 12 : const auto components = coupledComponents(var_name);
52 :
53 12 : if (isCoupled(var_name))
54 : {
55 12 : const auto tag = _c_fe_problem.getVectorTagID(tag_name);
56 :
57 12 : std::vector<const MooseVariableBase *> vars;
58 :
59 36 : for (unsigned int comp = 0; comp < components; ++comp)
60 : {
61 6 : auto var = const_cast<MooseVariableField<Real> *>(
62 18 : getVarHelper<MooseVariableField<Real>>(var_name, comp));
63 :
64 24 : if (tag_name == Moose::OLD_SOLUTION_TAG)
65 0 : var->sys().needSolutionState(1);
66 24 : else if (tag_name == Moose::OLDER_SOLUTION_TAG)
67 0 : var->sys().needSolutionState(2);
68 :
69 24 : vars.push_back(var);
70 : }
71 :
72 12 : variable.init({vars}, tag, {});
73 :
74 12 : addFEVariableCoupleableVectorTag(tag);
75 12 : }
76 : else
77 : {
78 0 : std::vector<Real> default_values(components);
79 :
80 0 : for (unsigned int comp = 0; comp < components; ++comp)
81 0 : default_values[comp] = _c_parameters.defaultCoupledValue(var_name, comp);
82 :
83 0 : variable.init(default_values, {});
84 0 : }
85 :
86 12 : return variable;
87 0 : }
88 :
89 : Moose::Kokkos::Variable
90 195 : Coupleable::kokkosZeroVariable()
91 : {
92 195 : Moose::Kokkos::Variable variable;
93 :
94 390 : variable.init({0}, {});
95 :
96 195 : return variable;
97 0 : }
98 :
99 : Moose::Kokkos::VariableValue
100 294 : Coupleable::kokkosCoupledVectorTagValueByName(const std::string & var_name,
101 : const std::string & tag_name,
102 : unsigned int comp)
103 : {
104 294 : auto variable = kokkosCoupledVectorTagVariable(var_name, tag_name, comp);
105 :
106 588 : return Moose::Kokkos::VariableValue(variable);
107 294 : }
108 :
109 : Moose::Kokkos::VariableValue
110 12 : Coupleable::kokkosCoupledVectorTagValuesByName(const std::string & var_name,
111 : const std::string & tag_name)
112 : {
113 12 : auto variable = kokkosCoupledVectorTagVariables(var_name, tag_name);
114 :
115 24 : return Moose::Kokkos::VariableValue(variable);
116 12 : }
117 :
118 : Moose::Kokkos::VariableGradient
119 0 : Coupleable::kokkosCoupledVectorTagGradientByName(const std::string & var_name,
120 : const std::string & tag_name,
121 : unsigned int comp)
122 : {
123 0 : auto variable = kokkosCoupledVectorTagVariable(var_name, tag_name, comp);
124 :
125 0 : return Moose::Kokkos::VariableGradient(variable);
126 0 : }
127 :
128 : Moose::Kokkos::VariableGradient
129 0 : Coupleable::kokkosCoupledVectorTagGradientsByName(const std::string & var_name,
130 : const std::string & tag_name)
131 : {
132 0 : auto variable = kokkosCoupledVectorTagVariables(var_name, tag_name);
133 :
134 0 : return Moose::Kokkos::VariableGradient(variable);
135 0 : }
136 :
137 : Moose::Kokkos::VariableNodalValue
138 184 : Coupleable::kokkosCoupledVectorTagNodalValueByName(const std::string & var_name,
139 : const std::string & tag_name,
140 : unsigned int comp)
141 : {
142 184 : auto variable = kokkosCoupledVectorTagVariable(var_name, tag_name, comp);
143 :
144 368 : return Moose::Kokkos::VariableNodalValue(_c_fe_problem.getKokkosSystems(), variable);
145 184 : }
146 :
147 : Moose::Kokkos::VariableNodalValue
148 0 : Coupleable::kokkosCoupledVectorTagNodalValuesByName(const std::string & var_name,
149 : const std::string & tag_name)
150 : {
151 0 : auto variable = kokkosCoupledVectorTagVariables(var_name, tag_name);
152 :
153 0 : return Moose::Kokkos::VariableNodalValue(_c_fe_problem.getKokkosSystems(), variable);
154 0 : }
155 :
156 : Moose::Kokkos::VariableValue
157 156 : Coupleable::kokkosCoupledVectorTagValue(const std::string & var_name,
158 : const std::string & tag_param_name,
159 : unsigned int comp)
160 : {
161 156 : if (!_c_parameters.isParamValid(tag_param_name))
162 0 : mooseError("Tag name parameter '", tag_param_name, "' is invalid");
163 :
164 156 : TagName tag_name = _c_parameters.get<TagName>(tag_param_name);
165 :
166 312 : return kokkosCoupledVectorTagValueByName(var_name, tag_name, comp);
167 156 : }
168 :
169 : Moose::Kokkos::VariableValue
170 0 : Coupleable::kokkosCoupledVectorTagValues(const std::string & var_name,
171 : const std::string & tag_param_name)
172 : {
173 0 : if (!_c_parameters.isParamValid(tag_param_name))
174 0 : mooseError("Tag name parameter '", tag_param_name, "' is invalid");
175 :
176 0 : TagName tag_name = _c_parameters.get<TagName>(tag_param_name);
177 :
178 0 : return kokkosCoupledVectorTagValuesByName(var_name, tag_name);
179 0 : }
180 :
181 : Moose::Kokkos::VariableGradient
182 0 : Coupleable::kokkosCoupledVectorTagGradient(const std::string & var_name,
183 : const std::string & tag_param_name,
184 : unsigned int comp)
185 : {
186 0 : if (!_c_parameters.isParamValid(tag_param_name))
187 0 : mooseError("Tag name parameter '", tag_param_name, "' is invalid");
188 :
189 0 : TagName tag_name = _c_parameters.get<TagName>(tag_param_name);
190 :
191 0 : return kokkosCoupledVectorTagGradientByName(var_name, tag_name, comp);
192 0 : }
193 :
194 : Moose::Kokkos::VariableGradient
195 0 : Coupleable::kokkosCoupledVectorTagGradients(const std::string & var_name,
196 : const std::string & tag_param_name)
197 : {
198 0 : if (!_c_parameters.isParamValid(tag_param_name))
199 0 : mooseError("Tag name parameter '", tag_param_name, "' is invalid");
200 :
201 0 : TagName tag_name = _c_parameters.get<TagName>(tag_param_name);
202 :
203 0 : return kokkosCoupledVectorTagGradientsByName(var_name, tag_name);
204 0 : }
205 :
206 : Moose::Kokkos::VariableNodalValue
207 0 : Coupleable::kokkosCoupledVectorTagNodalValue(const std::string & var_name,
208 : const std::string & tag_param_name,
209 : unsigned int comp)
210 : {
211 0 : if (!_c_parameters.isParamValid(tag_param_name))
212 0 : mooseError("Tag name parameter '", tag_param_name, "' is invalid");
213 :
214 0 : TagName tag_name = _c_parameters.get<TagName>(tag_param_name);
215 :
216 0 : return kokkosCoupledVectorTagNodalValueByName(var_name, tag_name, comp);
217 0 : }
218 :
219 : Moose::Kokkos::VariableNodalValue
220 0 : Coupleable::kokkosCoupledVectorTagNodalValues(const std::string & var_name,
221 : const std::string & tag_param_name)
222 : {
223 0 : if (!_c_parameters.isParamValid(tag_param_name))
224 0 : mooseError("Tag name parameter '", tag_param_name, "' is invalid");
225 :
226 0 : TagName tag_name = _c_parameters.get<TagName>(tag_param_name);
227 :
228 0 : return kokkosCoupledVectorTagNodalValuesByName(var_name, tag_name);
229 0 : }
230 :
231 : Moose::Kokkos::VariableValue
232 119 : Coupleable::kokkosCoupledValue(const std::string & var_name, unsigned int comp)
233 : {
234 119 : return kokkosCoupledVectorTagValueByName(var_name, Moose::SOLUTION_TAG, comp);
235 : }
236 :
237 : Moose::Kokkos::VariableValue
238 12 : Coupleable::kokkosCoupledValues(const std::string & var_name)
239 : {
240 12 : return kokkosCoupledVectorTagValuesByName(var_name, Moose::SOLUTION_TAG);
241 : }
242 :
243 : Moose::Kokkos::VariableGradient
244 0 : Coupleable::kokkosCoupledGradient(const std::string & var_name, unsigned int comp)
245 : {
246 0 : return kokkosCoupledVectorTagGradientByName(var_name, Moose::SOLUTION_TAG, comp);
247 : }
248 :
249 : Moose::Kokkos::VariableGradient
250 0 : Coupleable::kokkosCoupledGradients(const std::string & var_name)
251 : {
252 0 : return kokkosCoupledVectorTagGradientsByName(var_name, Moose::SOLUTION_TAG);
253 : }
254 :
255 : Moose::Kokkos::VariableNodalValue
256 184 : Coupleable::kokkosCoupledNodalValue(const std::string & var_name, unsigned int comp)
257 : {
258 184 : return kokkosCoupledVectorTagNodalValueByName(var_name, Moose::SOLUTION_TAG, comp);
259 : }
260 :
261 : Moose::Kokkos::VariableNodalValue
262 0 : Coupleable::kokkosCoupledNodalValues(const std::string & var_name)
263 : {
264 0 : return kokkosCoupledVectorTagNodalValuesByName(var_name, Moose::SOLUTION_TAG);
265 : }
266 :
267 : Moose::Kokkos::VariableValue
268 0 : Coupleable::kokkosCoupledValueOld(const std::string & var_name, unsigned int comp)
269 : {
270 0 : return kokkosCoupledVectorTagValueByName(var_name, Moose::OLD_SOLUTION_TAG, comp);
271 : }
272 :
273 : Moose::Kokkos::VariableValue
274 0 : Coupleable::kokkosCoupledValuesOld(const std::string & var_name)
275 : {
276 0 : return kokkosCoupledVectorTagValuesByName(var_name, Moose::OLD_SOLUTION_TAG);
277 : }
278 :
279 : Moose::Kokkos::VariableGradient
280 0 : Coupleable::kokkosCoupledGradientOld(const std::string & var_name, unsigned int comp)
281 : {
282 0 : return kokkosCoupledVectorTagGradientByName(var_name, Moose::OLD_SOLUTION_TAG, comp);
283 : }
284 :
285 : Moose::Kokkos::VariableGradient
286 0 : Coupleable::kokkosCoupledGradientsOld(const std::string & var_name)
287 : {
288 0 : return kokkosCoupledVectorTagGradientsByName(var_name, Moose::OLD_SOLUTION_TAG);
289 : }
290 :
291 : Moose::Kokkos::VariableNodalValue
292 0 : Coupleable::kokkosCoupledNodalValueOld(const std::string & var_name, unsigned int comp)
293 : {
294 0 : return kokkosCoupledVectorTagNodalValueByName(var_name, Moose::OLD_SOLUTION_TAG, comp);
295 : }
296 :
297 : Moose::Kokkos::VariableNodalValue
298 0 : Coupleable::kokkosCoupledNodalValuesOld(const std::string & var_name)
299 : {
300 0 : return kokkosCoupledVectorTagNodalValuesByName(var_name, Moose::OLD_SOLUTION_TAG);
301 : }
302 :
303 : Moose::Kokkos::VariableValue
304 0 : Coupleable::kokkosCoupledValueOlder(const std::string & var_name, unsigned int comp)
305 : {
306 0 : return kokkosCoupledVectorTagValueByName(var_name, Moose::OLDER_SOLUTION_TAG, comp);
307 : }
308 :
309 : Moose::Kokkos::VariableValue
310 0 : Coupleable::kokkosCoupledValuesOlder(const std::string & var_name)
311 : {
312 0 : return kokkosCoupledVectorTagValuesByName(var_name, Moose::OLDER_SOLUTION_TAG);
313 : }
314 :
315 : Moose::Kokkos::VariableGradient
316 0 : Coupleable::kokkosCoupledGradientOlder(const std::string & var_name, unsigned int comp)
317 : {
318 0 : return kokkosCoupledVectorTagGradientByName(var_name, Moose::OLDER_SOLUTION_TAG, comp);
319 : }
320 :
321 : Moose::Kokkos::VariableGradient
322 0 : Coupleable::kokkosCoupledGradientsOlder(const std::string & var_name)
323 : {
324 0 : return kokkosCoupledVectorTagGradientsByName(var_name, Moose::OLDER_SOLUTION_TAG);
325 : }
326 :
327 : Moose::Kokkos::VariableNodalValue
328 0 : Coupleable::kokkosCoupledNodalValueOlder(const std::string & var_name, unsigned int comp)
329 : {
330 0 : return kokkosCoupledVectorTagNodalValueByName(var_name, Moose::OLDER_SOLUTION_TAG, comp);
331 : }
332 :
333 : Moose::Kokkos::VariableNodalValue
334 0 : Coupleable::kokkosCoupledNodalValuesOlder(const std::string & var_name)
335 : {
336 0 : return kokkosCoupledVectorTagNodalValuesByName(var_name, Moose::OLDER_SOLUTION_TAG);
337 : }
338 :
339 : Moose::Kokkos::VariableValue
340 19 : Coupleable::kokkosCoupledDot(const std::string & var_name, unsigned int comp)
341 : {
342 19 : return kokkosCoupledVectorTagValueByName(var_name, Moose::SOLUTION_DOT_TAG, comp);
343 : }
344 :
345 : Moose::Kokkos::VariableValue
346 0 : Coupleable::kokkosCoupledDots(const std::string & var_name)
347 : {
348 0 : return kokkosCoupledVectorTagValuesByName(var_name, Moose::SOLUTION_DOT_TAG);
349 : }
350 :
351 : Moose::Kokkos::VariableNodalValue
352 0 : Coupleable::kokkosCoupledNodalDot(const std::string & var_name, unsigned int comp)
353 : {
354 0 : return kokkosCoupledVectorTagNodalValueByName(var_name, Moose::SOLUTION_DOT_TAG, comp);
355 : }
356 :
357 : Moose::Kokkos::VariableNodalValue
358 0 : Coupleable::kokkosCoupledNodalDots(const std::string & var_name)
359 : {
360 0 : return kokkosCoupledVectorTagNodalValuesByName(var_name, Moose::SOLUTION_DOT_TAG);
361 : }
362 :
363 : Moose::Kokkos::Scalar<const Real>
364 19 : Coupleable::kokkosCoupledDotDu(const std::string & var_name, unsigned int comp)
365 : {
366 19 : const auto var = getVar(var_name, comp);
367 :
368 19 : if (!var)
369 0 : return Moose::Kokkos::Scalar<const Real>(_kokkos_default_value_zero);
370 : else
371 19 : return Moose::Kokkos::Scalar<const Real>(var->sys().duDotDu(var->number() + comp));
372 : }
373 :
374 : Moose::Kokkos::VariableValue
375 195 : Coupleable::kokkosZeroValue()
376 : {
377 195 : auto variable = kokkosZeroVariable();
378 :
379 390 : return Moose::Kokkos::VariableValue(variable);
380 195 : }
381 :
382 : Moose::Kokkos::VariableGradient
383 0 : Coupleable::kokkosZeroGradient()
384 : {
385 0 : auto variable = kokkosZeroVariable();
386 :
387 0 : return Moose::Kokkos::VariableGradient(variable);
388 0 : }
389 :
390 : Moose::Kokkos::VariableNodalValue
391 0 : Coupleable::kokkosZeroNodalValue()
392 : {
393 0 : auto variable = kokkosZeroVariable();
394 :
395 0 : return Moose::Kokkos::VariableNodalValue(_c_fe_problem.getKokkosSystems(), variable);
396 0 : }
|