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 658 : Coupleable::kokkosCoupledVectorTagVariable(const std::string & var_name,
18 : const std::string & tag_name,
19 : unsigned int comp) const
20 : {
21 658 : Moose::Kokkos::Variable variable;
22 :
23 658 : if (isCoupled(var_name))
24 : {
25 152 : auto var = const_cast<MooseVariableField<Real> *>(
26 475 : getVarHelper<MooseVariableField<Real>>(var_name, comp));
27 :
28 627 : if (tag_name == Moose::OLD_SOLUTION_TAG)
29 36 : var->sys().needSolutionState(1);
30 591 : else if (tag_name == Moose::OLDER_SOLUTION_TAG)
31 24 : var->sys().needSolutionState(2);
32 :
33 627 : const auto tag = _c_fe_problem.getVectorTagID(tag_name);
34 :
35 627 : const_cast<Coupleable *>(this)->addFEVariableCoupleableVectorTag(tag);
36 :
37 1881 : variable.init({var}, tag, {});
38 : }
39 : else
40 93 : variable.init({_c_parameters.defaultCoupledValue(var_name, comp)}, {});
41 :
42 658 : return variable;
43 0 : }
44 :
45 : Moose::Kokkos::Variable
46 12 : Coupleable::kokkosCoupledVectorTagVariables(const std::string & var_name,
47 : const std::string & tag_name) const
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 : std::vector<const MooseVariableBase *> vars;
56 :
57 36 : for (unsigned int comp = 0; comp < components; ++comp)
58 : {
59 6 : auto var = const_cast<MooseVariableField<Real> *>(
60 18 : getVarHelper<MooseVariableField<Real>>(var_name, comp));
61 :
62 24 : if (tag_name == Moose::OLD_SOLUTION_TAG)
63 0 : var->sys().needSolutionState(1);
64 24 : else if (tag_name == Moose::OLDER_SOLUTION_TAG)
65 0 : var->sys().needSolutionState(2);
66 :
67 24 : vars.push_back(var);
68 : }
69 :
70 12 : const auto tag = _c_fe_problem.getVectorTagID(tag_name);
71 :
72 12 : const_cast<Coupleable *>(this)->addFEVariableCoupleableVectorTag(tag);
73 :
74 12 : variable.init({vars}, 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 231 : Coupleable::kokkosZeroVariable() const
91 : {
92 231 : Moose::Kokkos::Variable variable;
93 :
94 462 : variable.init({0}, {});
95 :
96 231 : 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) const
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) const
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) const
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) const
131 : {
132 0 : auto variable = kokkosCoupledVectorTagVariables(var_name, tag_name);
133 :
134 0 : return Moose::Kokkos::VariableGradient(variable);
135 0 : }
136 :
137 : Moose::Kokkos::VariableValue
138 316 : Coupleable::kokkosCoupledVectorTagNodalValueByName(const std::string & var_name,
139 : const std::string & tag_name,
140 : unsigned int comp) const
141 : {
142 316 : auto variable = kokkosCoupledVectorTagVariable(var_name, tag_name, comp);
143 :
144 316 : if (!variable.nodal())
145 0 : mooseError("Cannot get nodal values from the coupled variable '",
146 : var_name,
147 : "', because the associated variable is not nodal.");
148 :
149 632 : return Moose::Kokkos::VariableValue(variable, true);
150 316 : }
151 :
152 : Moose::Kokkos::VariableValue
153 0 : Coupleable::kokkosCoupledVectorTagNodalValuesByName(const std::string & var_name,
154 : const std::string & tag_name) const
155 : {
156 0 : auto variable = kokkosCoupledVectorTagVariables(var_name, tag_name);
157 :
158 0 : if (!variable.nodal())
159 0 : mooseError("Cannot get nodal values from the coupled variable '",
160 : var_name,
161 : "', because the associated variable is not nodal.");
162 :
163 0 : return Moose::Kokkos::VariableValue(variable, true);
164 0 : }
165 :
166 : Moose::Kokkos::VariableValue
167 48 : Coupleable::kokkosCoupledVectorTagDofValueByName(const std::string & var_name,
168 : const std::string & tag_name,
169 : unsigned int comp) const
170 : {
171 48 : auto variable = kokkosCoupledVectorTagVariable(var_name, tag_name, comp);
172 :
173 96 : return Moose::Kokkos::VariableValue(variable, true);
174 48 : }
175 :
176 : Moose::Kokkos::VariableValue
177 0 : Coupleable::kokkosCoupledVectorTagDofValuesByName(const std::string & var_name,
178 : const std::string & tag_name) const
179 : {
180 0 : auto variable = kokkosCoupledVectorTagVariables(var_name, tag_name);
181 :
182 0 : return Moose::Kokkos::VariableValue(variable, true);
183 0 : }
184 :
185 : Moose::Kokkos::VariableValue
186 156 : Coupleable::kokkosCoupledVectorTagValue(const std::string & var_name,
187 : const std::string & tag_param_name,
188 : unsigned int comp) const
189 : {
190 156 : if (!_c_parameters.isParamValid(tag_param_name))
191 0 : mooseError("Tag name parameter '", tag_param_name, "' is invalid");
192 :
193 156 : TagName tag_name = _c_parameters.get<TagName>(tag_param_name);
194 :
195 312 : return kokkosCoupledVectorTagValueByName(var_name, tag_name, comp);
196 156 : }
197 :
198 : Moose::Kokkos::VariableValue
199 0 : Coupleable::kokkosCoupledVectorTagValues(const std::string & var_name,
200 : const std::string & tag_param_name) const
201 : {
202 0 : if (!_c_parameters.isParamValid(tag_param_name))
203 0 : mooseError("Tag name parameter '", tag_param_name, "' is invalid");
204 :
205 0 : TagName tag_name = _c_parameters.get<TagName>(tag_param_name);
206 :
207 0 : return kokkosCoupledVectorTagValuesByName(var_name, tag_name);
208 0 : }
209 :
210 : Moose::Kokkos::VariableGradient
211 0 : Coupleable::kokkosCoupledVectorTagGradient(const std::string & var_name,
212 : const std::string & tag_param_name,
213 : unsigned int comp) const
214 : {
215 0 : if (!_c_parameters.isParamValid(tag_param_name))
216 0 : mooseError("Tag name parameter '", tag_param_name, "' is invalid");
217 :
218 0 : TagName tag_name = _c_parameters.get<TagName>(tag_param_name);
219 :
220 0 : return kokkosCoupledVectorTagGradientByName(var_name, tag_name, comp);
221 0 : }
222 :
223 : Moose::Kokkos::VariableGradient
224 0 : Coupleable::kokkosCoupledVectorTagGradients(const std::string & var_name,
225 : const std::string & tag_param_name) const
226 : {
227 0 : if (!_c_parameters.isParamValid(tag_param_name))
228 0 : mooseError("Tag name parameter '", tag_param_name, "' is invalid");
229 :
230 0 : TagName tag_name = _c_parameters.get<TagName>(tag_param_name);
231 :
232 0 : return kokkosCoupledVectorTagGradientsByName(var_name, tag_name);
233 0 : }
234 :
235 : Moose::Kokkos::VariableValue
236 60 : Coupleable::kokkosCoupledVectorTagNodalValue(const std::string & var_name,
237 : const std::string & tag_param_name,
238 : unsigned int comp) const
239 : {
240 60 : if (!_c_parameters.isParamValid(tag_param_name))
241 0 : mooseError("Tag name parameter '", tag_param_name, "' is invalid");
242 :
243 60 : TagName tag_name = _c_parameters.get<TagName>(tag_param_name);
244 :
245 120 : return kokkosCoupledVectorTagNodalValueByName(var_name, tag_name, comp);
246 60 : }
247 :
248 : Moose::Kokkos::VariableValue
249 0 : Coupleable::kokkosCoupledVectorTagNodalValues(const std::string & var_name,
250 : const std::string & tag_param_name) const
251 : {
252 0 : if (!_c_parameters.isParamValid(tag_param_name))
253 0 : mooseError("Tag name parameter '", tag_param_name, "' is invalid");
254 :
255 0 : TagName tag_name = _c_parameters.get<TagName>(tag_param_name);
256 :
257 0 : return kokkosCoupledVectorTagNodalValuesByName(var_name, tag_name);
258 0 : }
259 :
260 : Moose::Kokkos::VariableValue
261 0 : Coupleable::kokkosCoupledVectorTagDofValue(const std::string & var_name,
262 : const std::string & tag_param_name,
263 : unsigned int comp) const
264 : {
265 0 : if (!_c_parameters.isParamValid(tag_param_name))
266 0 : mooseError("Tag name parameter '", tag_param_name, "' is invalid");
267 :
268 0 : TagName tag_name = _c_parameters.get<TagName>(tag_param_name);
269 :
270 0 : return kokkosCoupledVectorTagDofValueByName(var_name, tag_name, comp);
271 0 : }
272 :
273 : Moose::Kokkos::VariableValue
274 0 : Coupleable::kokkosCoupledVectorTagDofValues(const std::string & var_name,
275 : const std::string & tag_param_name) const
276 : {
277 0 : if (!_c_parameters.isParamValid(tag_param_name))
278 0 : mooseError("Tag name parameter '", tag_param_name, "' is invalid");
279 :
280 0 : TagName tag_name = _c_parameters.get<TagName>(tag_param_name);
281 :
282 0 : return kokkosCoupledVectorTagDofValuesByName(var_name, tag_name);
283 0 : }
284 :
285 : Moose::Kokkos::VariableValue
286 155 : Coupleable::kokkosCoupledValue(const std::string & var_name, unsigned int comp) const
287 : {
288 155 : return _c_nodal ? kokkosCoupledVectorTagNodalValueByName(var_name, Moose::SOLUTION_TAG, comp)
289 119 : : kokkosCoupledVectorTagValueByName(var_name, Moose::SOLUTION_TAG, comp);
290 : }
291 :
292 : Moose::Kokkos::VariableValue
293 12 : Coupleable::kokkosCoupledValues(const std::string & var_name) const
294 : {
295 12 : return _c_nodal ? kokkosCoupledVectorTagNodalValuesByName(var_name, Moose::SOLUTION_TAG)
296 9 : : kokkosCoupledVectorTagValuesByName(var_name, Moose::SOLUTION_TAG);
297 : }
298 :
299 : Moose::Kokkos::VariableGradient
300 0 : Coupleable::kokkosCoupledGradient(const std::string & var_name, unsigned int comp) const
301 : {
302 0 : return kokkosCoupledVectorTagGradientByName(var_name, Moose::SOLUTION_TAG, comp);
303 : }
304 :
305 : Moose::Kokkos::VariableGradient
306 0 : Coupleable::kokkosCoupledGradients(const std::string & var_name) const
307 : {
308 0 : return kokkosCoupledVectorTagGradientsByName(var_name, Moose::SOLUTION_TAG);
309 : }
310 :
311 : Moose::Kokkos::VariableValue
312 184 : Coupleable::kokkosCoupledNodalValue(const std::string & var_name, unsigned int comp) const
313 : {
314 184 : return kokkosCoupledVectorTagNodalValueByName(var_name, Moose::SOLUTION_TAG, comp);
315 : }
316 :
317 : Moose::Kokkos::VariableValue
318 0 : Coupleable::kokkosCoupledNodalValues(const std::string & var_name) const
319 : {
320 0 : return kokkosCoupledVectorTagNodalValuesByName(var_name, Moose::SOLUTION_TAG);
321 : }
322 :
323 : Moose::Kokkos::VariableValue
324 24 : Coupleable::kokkosCoupledDofValue(const std::string & var_name, unsigned int comp) const
325 : {
326 24 : return kokkosCoupledVectorTagDofValueByName(var_name, Moose::SOLUTION_TAG, comp);
327 : }
328 :
329 : Moose::Kokkos::VariableValue
330 0 : Coupleable::kokkosCoupledDofValues(const std::string & var_name) const
331 : {
332 0 : return kokkosCoupledVectorTagDofValuesByName(var_name, Moose::SOLUTION_TAG);
333 : }
334 :
335 : Moose::Kokkos::VariableValue
336 24 : Coupleable::kokkosCoupledValueOld(const std::string & var_name, unsigned int comp) const
337 : {
338 24 : return _c_nodal ? kokkosCoupledVectorTagNodalValueByName(var_name, Moose::OLD_SOLUTION_TAG, comp)
339 18 : : kokkosCoupledVectorTagValueByName(var_name, Moose::OLD_SOLUTION_TAG, comp);
340 : }
341 :
342 : Moose::Kokkos::VariableValue
343 0 : Coupleable::kokkosCoupledValuesOld(const std::string & var_name) const
344 : {
345 0 : return _c_nodal ? kokkosCoupledVectorTagNodalValuesByName(var_name, Moose::OLD_SOLUTION_TAG)
346 0 : : kokkosCoupledVectorTagValuesByName(var_name, Moose::OLD_SOLUTION_TAG);
347 : }
348 :
349 : Moose::Kokkos::VariableGradient
350 0 : Coupleable::kokkosCoupledGradientOld(const std::string & var_name, unsigned int comp) const
351 : {
352 0 : return kokkosCoupledVectorTagGradientByName(var_name, Moose::OLD_SOLUTION_TAG, comp);
353 : }
354 :
355 : Moose::Kokkos::VariableGradient
356 0 : Coupleable::kokkosCoupledGradientsOld(const std::string & var_name) const
357 : {
358 0 : return kokkosCoupledVectorTagGradientsByName(var_name, Moose::OLD_SOLUTION_TAG);
359 : }
360 :
361 : Moose::Kokkos::VariableValue
362 0 : Coupleable::kokkosCoupledNodalValueOld(const std::string & var_name, unsigned int comp) const
363 : {
364 0 : return kokkosCoupledVectorTagNodalValueByName(var_name, Moose::OLD_SOLUTION_TAG, comp);
365 : }
366 :
367 : Moose::Kokkos::VariableValue
368 0 : Coupleable::kokkosCoupledNodalValuesOld(const std::string & var_name) const
369 : {
370 0 : return kokkosCoupledVectorTagNodalValuesByName(var_name, Moose::OLD_SOLUTION_TAG);
371 : }
372 :
373 : Moose::Kokkos::VariableValue
374 12 : Coupleable::kokkosCoupledDofValueOld(const std::string & var_name, unsigned int comp) const
375 : {
376 12 : return kokkosCoupledVectorTagDofValueByName(var_name, Moose::OLD_SOLUTION_TAG, comp);
377 : }
378 :
379 : Moose::Kokkos::VariableValue
380 0 : Coupleable::kokkosCoupledDofValuesOld(const std::string & var_name) const
381 : {
382 0 : return kokkosCoupledVectorTagDofValuesByName(var_name, Moose::OLD_SOLUTION_TAG);
383 : }
384 :
385 : Moose::Kokkos::VariableValue
386 12 : Coupleable::kokkosCoupledValueOlder(const std::string & var_name, unsigned int comp) const
387 : {
388 12 : return _c_nodal
389 9 : ? kokkosCoupledVectorTagNodalValueByName(var_name, Moose::OLDER_SOLUTION_TAG, comp)
390 9 : : kokkosCoupledVectorTagValueByName(var_name, Moose::OLDER_SOLUTION_TAG, comp);
391 : }
392 :
393 : Moose::Kokkos::VariableValue
394 0 : Coupleable::kokkosCoupledValuesOlder(const std::string & var_name) const
395 : {
396 0 : return _c_nodal ? kokkosCoupledVectorTagNodalValuesByName(var_name, Moose::OLDER_SOLUTION_TAG)
397 0 : : kokkosCoupledVectorTagValuesByName(var_name, Moose::OLDER_SOLUTION_TAG);
398 : }
399 :
400 : Moose::Kokkos::VariableGradient
401 0 : Coupleable::kokkosCoupledGradientOlder(const std::string & var_name, unsigned int comp) const
402 : {
403 0 : return kokkosCoupledVectorTagGradientByName(var_name, Moose::OLDER_SOLUTION_TAG, comp);
404 : }
405 :
406 : Moose::Kokkos::VariableGradient
407 0 : Coupleable::kokkosCoupledGradientsOlder(const std::string & var_name) const
408 : {
409 0 : return kokkosCoupledVectorTagGradientsByName(var_name, Moose::OLDER_SOLUTION_TAG);
410 : }
411 :
412 : Moose::Kokkos::VariableValue
413 0 : Coupleable::kokkosCoupledNodalValueOlder(const std::string & var_name, unsigned int comp) const
414 : {
415 0 : return kokkosCoupledVectorTagNodalValueByName(var_name, Moose::OLDER_SOLUTION_TAG, comp);
416 : }
417 :
418 : Moose::Kokkos::VariableValue
419 0 : Coupleable::kokkosCoupledNodalValuesOlder(const std::string & var_name) const
420 : {
421 0 : return kokkosCoupledVectorTagNodalValuesByName(var_name, Moose::OLDER_SOLUTION_TAG);
422 : }
423 :
424 : Moose::Kokkos::VariableValue
425 12 : Coupleable::kokkosCoupledDofValueOlder(const std::string & var_name, unsigned int comp) const
426 : {
427 12 : return kokkosCoupledVectorTagDofValueByName(var_name, Moose::OLDER_SOLUTION_TAG, comp);
428 : }
429 :
430 : Moose::Kokkos::VariableValue
431 0 : Coupleable::kokkosCoupledDofValuesOlder(const std::string & var_name) const
432 : {
433 0 : return kokkosCoupledVectorTagDofValuesByName(var_name, Moose::OLDER_SOLUTION_TAG);
434 : }
435 :
436 : Moose::Kokkos::VariableValue
437 19 : Coupleable::kokkosCoupledDot(const std::string & var_name, unsigned int comp) const
438 : {
439 19 : return _c_nodal ? kokkosCoupledVectorTagNodalValueByName(var_name, Moose::SOLUTION_DOT_TAG, comp)
440 15 : : kokkosCoupledVectorTagValueByName(var_name, Moose::SOLUTION_DOT_TAG, comp);
441 : }
442 :
443 : Moose::Kokkos::VariableValue
444 0 : Coupleable::kokkosCoupledDots(const std::string & var_name) const
445 : {
446 0 : return _c_nodal ? kokkosCoupledVectorTagNodalValuesByName(var_name, Moose::SOLUTION_DOT_TAG)
447 0 : : kokkosCoupledVectorTagValuesByName(var_name, Moose::SOLUTION_DOT_TAG);
448 : }
449 :
450 : Moose::Kokkos::VariableValue
451 0 : Coupleable::kokkosCoupledNodalDot(const std::string & var_name, unsigned int comp) const
452 : {
453 0 : return kokkosCoupledVectorTagNodalValueByName(var_name, Moose::SOLUTION_DOT_TAG, comp);
454 : }
455 :
456 : Moose::Kokkos::VariableValue
457 0 : Coupleable::kokkosCoupledNodalDots(const std::string & var_name) const
458 : {
459 0 : return kokkosCoupledVectorTagNodalValuesByName(var_name, Moose::SOLUTION_DOT_TAG);
460 : }
461 :
462 : Moose::Kokkos::Scalar<const Real>
463 19 : Coupleable::kokkosCoupledDotDu(const std::string & var_name, unsigned int comp) const
464 : {
465 19 : const auto var = getVar(var_name, comp);
466 :
467 19 : if (!var)
468 0 : return Moose::Kokkos::Scalar<const Real>(_kokkos_default_value_zero);
469 : else
470 19 : return Moose::Kokkos::Scalar<const Real>(var->sys().duDotDu(var->number() + comp));
471 : }
472 :
473 : Moose::Kokkos::VariableValue
474 231 : Coupleable::kokkosZeroValue() const
475 : {
476 231 : auto variable = kokkosZeroVariable();
477 :
478 462 : return Moose::Kokkos::VariableValue(variable);
479 231 : }
480 :
481 : Moose::Kokkos::VariableGradient
482 0 : Coupleable::kokkosZeroGradient() const
483 : {
484 0 : auto variable = kokkosZeroVariable();
485 :
486 0 : return Moose::Kokkos::VariableGradient(variable);
487 0 : }
488 :
489 : Moose::Kokkos::VariableValue
490 0 : Coupleable::kokkosZeroNodalValue() const
491 : {
492 0 : auto variable = kokkosZeroVariable();
493 :
494 0 : return Moose::Kokkos::VariableValue(variable, true);
495 0 : }
|