Arcane  4.1.12.0
Developer documentation
Loading...
Searching...
No Matches
AlephKernel.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* AlephKernel.cc (C) 2000-2022 */
9/* */
10/* */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/aleph/AlephArcane.h"
15#include "arcane/utils/StringList.h"
16
17/*---------------------------------------------------------------------------*/
18/*---------------------------------------------------------------------------*/
19
20namespace Arcane
21{
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26AlephKernelSolverInitializeArguments::
27AlephKernelSolverInitializeArguments()
28: m_arguments(StringList{})
29{}
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
36AlephKernel::
37AlephKernel(IParallelMng* wpm,
38 Integer size,
39 IAlephFactory* factory,
40 Integer alephUnderlyingSolver,
41 Integer alephNumberOfCores,
42 bool alephOrdering)
43: TraceAccessor(wpm->traceMng())
44, m_isParallel(wpm->isParallel())
45, m_rank(wpm->commRank())
46, m_size(size)
47, m_world_size(wpm->commSize())
48, m_there_are_idles(true)
49, m_i_am_an_other(true)
50, m_parallel(wpm)
51, m_world_parallel(wpm)
52, m_factory(factory)
53, m_aleph_vector_idx(0)
54// For now, Sloop is set by default
55, m_underlying_solver((alephUnderlyingSolver == 0 ? 1 : alephUnderlyingSolver))
56, m_reorder(alephOrdering)
57, m_solver_index(0)
58, m_solver_size(alephNumberOfCores)
59, m_solved(false)
60, m_has_been_initialized(false)
61, m_solver_ranks(0)
62, m_matrix_queue(0)
63, m_arguments_queue(0)
64, m_results_queue(0)
65{
66 setup();
67}
68
69/*---------------------------------------------------------------------------*/
70/*---------------------------------------------------------------------------*/
78 ISubDomain* sd,
79 IAlephFactory* factory,
80 Integer alephUnderlyingSolver,
81 Integer alephNumberOfCores,
82 bool alephOrdering)
83: TraceAccessor(tm)
84, m_sub_domain(sd)
85, m_isParallel(sd->parallelMng()->isParallel())
86, m_rank(sd->parallelMng()->commRank())
87, m_size(sd->parallelMng()->commSize())
88, m_world_size(sd->parallelMng()->worldParallelMng()->commSize())
89, m_there_are_idles(m_size != m_world_size)
90, m_i_am_an_other(sd->parallelMng()->worldParallelMng()->commRank() > m_size)
91, m_parallel(sd->parallelMng())
92, m_world_parallel(sd->parallelMng()->worldParallelMng())
93, m_factory(factory)
94, m_aleph_vector_idx(0)
95// For now, Sloop is set by default
96, m_underlying_solver((alephUnderlyingSolver == 0 ? 1 : alephUnderlyingSolver))
97, m_reorder(alephOrdering)
98, m_solver_index(0)
99, m_solver_size(alephNumberOfCores)
100, m_solved(false)
101, m_has_been_initialized(false)
102{
103 setup();
104}
105
106/*---------------------------------------------------------------------------*/
107/*---------------------------------------------------------------------------*/
116 Integer alephUnderlyingSolver,
117 Integer alephNumberOfCores)
118: TraceAccessor(sd->parallelMng()->traceMng())
119, m_sub_domain(sd)
120, m_isParallel(sd->parallelMng()->isParallel())
121, m_rank(sd->parallelMng()->commRank())
122, m_size(sd->parallelMng()->commSize())
123, m_world_size(sd->parallelMng()->worldParallelMng()->commSize())
124, m_there_are_idles(m_size != m_world_size)
125, m_i_am_an_other(sd->parallelMng()->worldParallelMng()->commRank() > m_size)
126, m_parallel(sd->parallelMng())
127, m_world_parallel(sd->parallelMng()->worldParallelMng())
128, m_factory(new AlephFactory(sd->application(), sd->parallelMng()->traceMng()))
129, m_topology(new AlephTopology(this))
130, m_ordering(new AlephOrdering(this))
131, m_indexing(new AlephIndexing(this))
132, m_aleph_vector_idx(0)
133, m_underlying_solver(alephUnderlyingSolver == 0 ? 1 : alephUnderlyingSolver)
134, m_reorder(false)
135, m_solver_index(0)
136, m_solver_size(alephNumberOfCores)
137, m_solved(false)
138, m_has_been_initialized(false)
139{
140 debug() << "\33[1;31m[AlephKernel] New kernel with indexing+init options!\33[0m";
141 setup();
142}
143
144/*---------------------------------------------------------------------------*/
145/*---------------------------------------------------------------------------*/
150setup(void)
151{
152 ItacFunction(AlephKernel);
153 if (m_sub_domain) {
154 debug() << "\33[1;31m[AlephKernel] thisParallelMng's size=" << m_size << "\33[0m";
155 debug() << "\33[1;31m[AlephKernel] worldParallelMng's size=" << m_world_size << "\33[0m";
156 }
157 else
158 debug() << "\33[1;31m[AlephKernel] I am an additional site #" << m_rank << " among " << m_world_size << "\33[0m";
159 // Default solver used.
160 debug() << "\33[1;31m[AlephKernel] Aleph underlying solver has been set to "
161 << m_underlying_solver << "\33[0m";
162 // By default, all cores allocated to the calculation are used for each resolution
163 if (m_solver_size == 0) {
164 m_solver_size = m_world_size;
165 debug() << "\33[1;31m[AlephKernel] Aleph Number of Cores"
166 << " now matches world's number of processors: "
167 << m_solver_size << "\33[0m";
168 }
169 if (m_solver_size > m_size) {
170 m_solver_size = m_size;
171 debug() << "\33[1;31m[AlephKernel] Aleph Number of Cores"
172 << " exceeds in size, reverting to " << m_size << "\33[0m";
173 }
174 if ((m_size % m_solver_size) != 0)
175 throw FatalErrorException("AlephKernel", "Aleph Number of Cores modulo size");
176 debug() << "\33[1;31m[AlephKernel] Each solver takes "
177 << m_solver_size << " site(s)"
178 << "\33[0m";
179 // If there are 'others, we keep them informed of the configuration
180 if (m_there_are_idles && !m_i_am_an_other) {
182 cfg.add(m_underlying_solver);
183 cfg.add(m_solver_size);
184 cfg.add((m_reorder == true) ? 1 : 0);
185 cfg.add(m_size);
186 debug() << "\33[1;31m[AlephKernel] Sending to others configuration: " << cfg << "\33[0m";
187 m_world_parallel->broadcast(cfg.view(), 0);
188 }
189}
190
191/*---------------------------------------------------------------------------*/
192/*---------------------------------------------------------------------------*/
193
194AlephKernel::
195~AlephKernel()
196{
197 info(4) << "Destroying ~AlephKernel";
198
199 delete m_topology;
200 delete m_indexing;
201 delete m_ordering;
202
203 for (AlephKernelResults* rq : m_results_queue)
204 delete rq;
205 m_results_queue.clear();
206
207 for (AlephMatrix* mq : m_matrix_queue)
208 delete mq;
209 m_matrix_queue.clear();
210
211 for (AlephKernelArguments* aq : m_arguments_queue) {
212 // TODO: look into why this is not done in the AlephKernelArguments destructor.
213 delete aq->m_x_vector;
214 delete aq->m_b_vector;
215 delete aq->m_tmp_vector;
216 delete aq;
217 }
218 m_arguments_queue.clear();
219
220 // PETSc seems not to like this too much but this is needed
221 //for ( IParallelMng* pm : m_sub_parallel_mng_queue )
222 //delete pm;
223
224 info(4) << "Destroying ~AlephKernel] done";
225}
226
227/*---------------------------------------------------------------------------*/
228/*---------------------------------------------------------------------------*/
229// d80dee82
230void AlephKernel::
231initialize(Integer global_nb_row,
232 Integer local_nb_row)
233{
234 ItacFunction(AlephKernel);
235 //Timer::Action ta(subDomain(),"AlephKernel::initialize");
236 if (m_there_are_idles && !m_i_am_an_other) {
237 m_world_parallel->broadcast(UniqueArray<unsigned long>(1, 0xd80dee82l).view(), 0);
238 UniqueArray<Integer> args(0);
239 args.add(global_nb_row);
240 args.add(local_nb_row);
241 m_world_parallel->broadcast(args.view(), 0);
242 }
243 debug() << "\33[1;31m[initialize] Geometry set to " << global_nb_row
244 << " lines, I see " << local_nb_row << " of them"
245 << "\33[0m";
246 m_topology = new AlephTopology(traceMng(), this, global_nb_row, local_nb_row);
247 m_ordering = new AlephOrdering(this, global_nb_row, local_nb_row, m_reorder);
248 debug() << "\33[1;31m[initialize] done"
249 << "\33[0m";
250 m_has_been_initialized = true;
251}
252
253/*---------------------------------------------------------------------------*/
254/*---------------------------------------------------------------------------*/
255// 4b97b15d
256void AlephKernel::
257break_and_return(void)
258{
259 if (m_there_are_idles && !m_i_am_an_other)
260 m_world_parallel->broadcast(UniqueArray<unsigned long>(1, 0x4b97b15dl).view(), 0);
261}
262
263/*---------------------------------------------------------------------------*/
264/*---------------------------------------------------------------------------*/
273{
274 debug() << "\33[1;31m[mapranks] mapranks starting @ "
275 << m_solver_index * m_size
276 << ", m_size=" << m_size
277 << ", m_solver_size=" << m_solver_size
278 << ", m_world_size=" << m_world_size << "\33[0m";
279 traceMng()->flush();
280 for (int rnk = m_solver_index * m_size; rnk < (m_solver_index + 1) * m_size; rnk += 1) {
281 const int map = (rnk / (m_size / m_solver_size)) % m_world_size;
282 debug() << "\33[1;31m[mapranks] map=" << map << "\33[0m";
283 ranks[rnk % m_size] = map;
284 debug() << "\33[1;31m[mapranks] mapped solver #" << m_solver_index
285 << ", core " << rnk % m_size << " --> site " << map << "\33[0m";
286 }
287}
288
289/*---------------------------------------------------------------------------*/
290/*---------------------------------------------------------------------------*/
291
292bool AlephKernel::
293hitranks(Integer rank, ArrayView<Integer> ranks)
294{
295 for (int rnk = ranks.size() - 1; rnk >= 0; rnk -= 1)
296 if (ranks[rnk] == rank)
297 return true;
298 return false;
299}
300
301/*---------------------------------------------------------------------------*/
302/*---------------------------------------------------------------------------*/
303
304Ref<IParallelMng> AlephKernel::
305_createUnderlyingParallelMng(Integer nb_wanted_sites)
306{
307 info(4) << "[createUnderlyingParallelMng] nb_wanted_sites=" << nb_wanted_sites;
308 UniqueArray<Integer> kept_ranks;
309 for (Int32 rank = 0; rank < m_world_size; ++rank) {
310 if (hitranks(rank, m_solver_ranks[m_solver_index]))
311 kept_ranks.add(rank);
312 }
313 info(4) << "[createUnderlyingParallelMng] Now createSubParallelMng of size=" << kept_ranks.size();
314 Ref<IParallelMng> upm = m_world_parallel->createSubParallelMngRef(kept_ranks.constView());
315 info(4) << "[createUnderlyingParallelMng] done: upm=" << upm.get();
316 traceMng()->flush();
317 return upm;
318}
319
320/*---------------------------------------------------------------------------*/
321/*---------------------------------------------------------------------------*/
322// BaseForm[Hash["createSolverMatrix", "CRC32"], 16] = ef162166
323AlephMatrix* AlephKernel::
324createSolverMatrix(void)
325{
326 ItacFunction(AlephService);
327
328 if (isInitialized() == false) {
329 debug() << "\33[1;31m[createSolverMatrix] has_NOT_been_initialized!\33[0m"
330 << "\33[0m";
331 return new AlephMatrix(this);
332 }
333
334 if (m_there_are_idles && !m_i_am_an_other)
335 m_world_parallel->broadcast(UniqueArray<unsigned long>(1, 0xef162166l).view(), 0);
336
337 debug() << "\33[1;31m[createSolverMatrix]\33[0m"
338 << "\33[0m";
339
340 m_solved = false;
341
342 if (!m_configured) {
343 debug() << "\33[1;31m[createSolverMatrix] UN configured, building Underlying Parallel Managers index="
344 << index() << "\33[0m";
345 traceMng()->flush();
346 m_solver_ranks.add(SharedArray<Integer>(m_world_size));
347 m_solver_ranks[m_solver_index].fill(-1);
348 mapranks(m_solver_ranks[m_solver_index]);
349 traceMng()->flush();
350 Ref<IParallelMng> upm = _createUnderlyingParallelMng(m_solver_size);
351 if (upm.get()) {
352 debug() << "\33[1;31m[createSolverMatrix] upm->isParallel()=" << upm->isParallel() << "\33[0m";
353 debug() << "\33[1;31m[createSolverMatrix] upm->commSize()=" << upm->commSize() << "\33[0m";
354 debug() << "\33[1;31m[createSolverMatrix] upm->commRank()=" << upm->commRank() << "\33[0m";
355 }
356 else {
357 debug() << "\33[1;31m[createSolverMatrix] upm NULL"
358 << "\33[0m";
359 }
360 m_sub_parallel_mng_queue.add(upm);
361 debug() << "\33[1;31m[createSolverMatrix] Queuing new kernel arguments: X, B and Tmp with their topolgy"
362 << "\33[0m";
363 // We fetch the topology first so that the underlying library can account for it when processing the upcoming vectors and matrix
364 IAlephTopology* underlying_topology = factory()->GetTopology(this, index(), topology()->nb_row_size());
365 // If the library has an IAlephTopology, we trigger the prefix; we will perform the postfix after the solves
366 if (underlying_topology != NULL)
367 underlying_topology->backupAndInitialize();
368 m_arguments_queue.add(new AlephKernelArguments(traceMng(),
369 new AlephVector(this), // Vector X
370 new AlephVector(this), // Vector B
371 new AlephVector(this), // Vector tmp (for isAlreadySolved)
372 underlying_topology));
373 // We initialize the temporary vector which is not seen by the API
374 // No need to assemble it, it serves as output and then as a buffer
375 debug() << "\33[1;31m[createSolverMatrix] Creating Tmp vector for this set of arguments"
376 << "\33[0m";
377 m_arguments_queue.at(m_solver_index)->m_tmp_vector->create();
378 // We initialize the matrix after the topologies and vectors
379 debug() << "\33[1;31m[createSolverMatrix] Now queuing the matrix\33[0m";
380 m_matrix_queue.add(new AlephMatrix(this));
381 debug() << "\33[1;31m[createSolverMatrix] Now queuing the space for the resolution results\33[0m";
382 m_results_queue.add(new AlephKernelResults());
383 }
384 else {
385 if (getTopologyImplementation(m_solver_index) != NULL)
386 getTopologyImplementation(m_solver_index)->backupAndInitialize();
387 }
388 debug() << "\33[1;31m[createSolverMatrix] done!\33[0m";
389 traceMng()->flush();
390 return m_matrix_queue[m_solver_index];
391}
392
393/*---------------------------------------------------------------------------*/
394/*---------------------------------------------------------------------------*/
403{
404 ItacFunction(AlephKernel);
405 if (m_has_been_initialized == false) {
406 debug() << "\33[1;31m[createSolverVector] has_NOT_been_initialized!\33[0m";
407 return new AlephVector(this);
408 }
409 if (m_there_are_idles && !m_i_am_an_other)
410 m_world_parallel->broadcast(UniqueArray<unsigned long>(1, 0xc4b28f2l).view(), 0);
411 m_aleph_vector_idx++;
412 if ((m_aleph_vector_idx % 2) == 0) {
413 debug() << "\33[1;31m[createSolverVector] Get " << m_solver_index << "th X vector\33[0m";
414 return m_arguments_queue.at(m_solver_index)->m_x_vector;
415 }
416 else {
417 debug() << "\33[1;31m[createSolverVector] Get " << m_solver_index << "th B vector\33[0m";
418 return m_arguments_queue.at(m_solver_index)->m_b_vector;
419 }
420 traceMng()->flush();
421}
422
423/*---------------------------------------------------------------------------*/
424/*---------------------------------------------------------------------------*/
425// ba9488be
426
427void AlephKernel::
428postSolver(AlephParams* params,
429 AlephMatrix* fromThisMatrix,
430 AlephVector* fromeThisX,
431 AlephVector* fromThisB)
432{
433 ItacFunction(AlephKernel);
434
435 if (!isInitialized()) {
436 debug() << "\33[1;31m[postSolver] Trying to post a solver to an uninitialized kernel!\33[0m";
437 debug() << "\33[1;31m[postSolver] Now telling Indexer to do its job!\33[0m";
438 indexing()->nowYouCanBuildTheTopology(fromThisMatrix, fromeThisX, fromThisB);
439 }
440
441 if (m_there_are_idles && !m_i_am_an_other) {
442 m_world_parallel->broadcast(UniqueArray<unsigned long>(1, 0xba9488bel).view(), 0);
443 UniqueArray<Real> real_args(0);
444 real_args.add(params->epsilon());
445 real_args.add(params->alpha());
446 real_args.add(params->minRHSNorm());
447 real_args.add(params->DDMCParameterAmgDiagonalThreshold());
448
449 UniqueArray<int> bool_args(0);
450 bool_args.add(params->xoUser());
451 bool_args.add(params->checkRealResidue());
452 bool_args.add(params->printRealResidue());
453 bool_args.add(params->debugInfo());
454 bool_args.add(params->convergenceAnalyse());
455 bool_args.add(params->stopErrorStrategy());
456 bool_args.add(params->writeMatrixToFileErrorStrategy());
457 bool_args.add(params->DDMCParameterListingOutput());
458 bool_args.add(params->printCpuTimeResolution());
459 bool_args.add(params->getKeepSolverStructure());
460 bool_args.add(params->getSequentialSolver());
461
462 UniqueArray<Integer> int_args(0);
463 int_args.add(params->maxIter());
464 int_args.add(params->gamma());
465 int_args.add((Integer)params->precond());
466 int_args.add((Integer)params->method());
467 int_args.add((Integer)params->amgCoarseningMethod());
468 int_args.add(params->getOutputLevel());
469 int_args.add(params->getAmgCycle());
470 int_args.add(params->getAmgSolverIter());
471 int_args.add(params->getAmgSmootherIter());
472 int_args.add((Integer)params->getAmgSmootherOption());
473 int_args.add((Integer)params->getAmgCoarseningOption());
474 int_args.add((Integer)params->getAmgCoarseSolverOption());
475 int_args.add((Integer)params->getCriteriaStop());
476
477 // not broadcasted writeMatrixNameErrorStrategy
478 m_world_parallel->broadcast(real_args.view(), 0);
479 m_world_parallel->broadcast(bool_args.view(), 0);
480 m_world_parallel->broadcast(int_args.view(), 0);
481 }
482
483 debug() << "\33[1;31m[postSolver] Queuing solver " << m_solver_index << "\33[0m";
484 debug() << "\33[1;31m[postSolver] Backuping its params @" << params << "\33[0m";
485 m_arguments_queue.at(m_solver_index)->m_params = params;
486
487 // Update of solver and site indices
488 debug() << "\33[1;31m[postSolver] Update of solver and site indices"
489 << "\33[0m";
490 m_solver_index += 1;
491 debug() << "\33[1;31m[postSolver] m_solver_index=" << m_solver_index << "\33[0m";
492 traceMng()->flush();
493}
494
495/*---------------------------------------------------------------------------*/
496/*---------------------------------------------------------------------------*/
502syncSolver(Integer gid, Integer& nb_iteration, Real* residual_norm)
503{
504 ItacFunction(AlephKernel);
505
506 if (m_there_are_idles && !m_i_am_an_other) {
507 m_world_parallel->broadcast(UniqueArray<unsigned long>(1, 0xbf8d3adfl).view(), 0);
508 m_world_parallel->broadcast(UniqueArray<Integer>(1, gid).view(), 0);
509 }
510
511 if (!m_solved) {
512 debug() << "\33[1;31m[syncSolver] Not solved, launching the work"
513 << "\33[0m";
514 workSolver();
515 m_solved = true;
516 }
517
518 debug() << "\33[1;31m[syncSolver] Syncing " << gid << "\33[0m";
519 AlephVector* aleph_vector_x = m_arguments_queue.at(gid)->m_x_vector;
520 aleph_vector_x->reassemble_waitAndFill();
521 m_matrix_queue.at(gid)->reassemble_waitAndFill(m_results_queue.at(gid)->m_nb_iteration,
522 m_results_queue.at(gid)->m_residual_norm);
523
524 debug() << "\33[1;31m[syncSolver] Finishing " << gid << "\33[0m";
525 nb_iteration = m_results_queue.at(gid)->m_nb_iteration;
526 residual_norm[0] = m_results_queue.at(gid)->m_residual_norm[0];
527 residual_norm[1] = m_results_queue.at(gid)->m_residual_norm[1];
528 residual_norm[2] = m_results_queue.at(gid)->m_residual_norm[2];
529 residual_norm[3] = m_results_queue.at(gid)->m_residual_norm[3];
530
531 if (getTopologyImplementation(gid) != NULL)
532 getTopologyImplementation(gid)->restore();
533
534 debug() << "\33[1;31m[syncSolver] Done " << gid << "\33[0m";
535 traceMng()->flush();
536 return m_arguments_queue.at(gid)->m_x_vector;
537}
538
539/*---------------------------------------------------------------------------*/
540/*---------------------------------------------------------------------------*/
541
542void AlephKernel::
543workSolver(void)
544{
545 ItacFunction(AlephKernel);
546
547 debug() << "\33[1;31m[workSolver] Now working"
548 << "\33[0m";
549 for (int gid = 0; gid < m_solver_index; ++gid) {
550 ItacRegion(gidAssembleWaitAndFill, AlephKernel);
551 debug() << "\33[1;31m[workSolver] Waiting for assembling " << gid << "\33[0m";
552 AlephVector* aleph_vector_x = m_arguments_queue.at(gid)->m_x_vector;
553 AlephVector* aleph_vector_b = m_arguments_queue.at(gid)->m_b_vector;
554 AlephMatrix* aleph_matrix_A = m_matrix_queue.at(gid);
555 aleph_matrix_A->assemble_waitAndFill();
556 aleph_vector_b->assemble_waitAndFill();
557 aleph_vector_x->assemble_waitAndFill();
558 traceMng()->flush();
559 }
560
561 if (!m_configured) {
562 debug() << "\33[1;31m[workSolver] NOW CONFIGURED!"
563 << "\33[0m";
564 traceMng()->flush();
565 m_configured = true;
566 }
567
568 for (int gid = 0; gid < m_solver_index; ++gid) {
569 ItacRegion(gidSolving, AlephKernel);
570 debug() << "\33[1;31m[workSolver] Solving " << gid << " ?"
571 << "\33[0m";
572 if (getTopologyImplementation(gid) != NULL)
573 getTopologyImplementation(gid)->backupAndInitialize();
574 m_matrix_queue.at(gid)->solveNow(m_arguments_queue.at(gid)->m_x_vector,
575 m_arguments_queue.at(gid)->m_b_vector,
576 m_arguments_queue.at(gid)->m_tmp_vector,
577 m_results_queue.at(gid)->m_nb_iteration,
578 m_results_queue.at(gid)->m_residual_norm,
579 m_arguments_queue.at(gid)->m_params);
580 // After the solve, we 'restore' the session
581 if (getTopologyImplementation(gid) != NULL)
582 getTopologyImplementation(gid)->restore();
583 }
584
585 for (int gid = 0; gid < m_solver_index; ++gid) {
586 ItacRegion(gidReAssemble, AlephKernel);
587 debug() << "\33[1;31m[workSolver] Posting re-assembling " << gid << "\33[0m";
588 m_arguments_queue.at(gid)->m_x_vector->reassemble();
589 m_matrix_queue.at(gid)->reassemble(m_results_queue.at(gid)->m_nb_iteration,
590 m_results_queue.at(gid)->m_residual_norm);
591 }
592 traceMng()->flush();
593 // Flush number of pending solvers
594 m_solver_index = 0;
595}
596
597/*---------------------------------------------------------------------------*/
598/*---------------------------------------------------------------------------*/
599
600ISubDomain* AlephKernel::
601subDomain(void)
602{
603 if (!m_sub_domain && !m_i_am_an_other)
604 ARCANE_FATAL("[AlephKernel::subDomain]", "No sub-domain to work on!");
605 return m_sub_domain;
606}
607
608/*---------------------------------------------------------------------------*/
609/*---------------------------------------------------------------------------*/
610
611} // End namespace Arcane
612
613/*---------------------------------------------------------------------------*/
614/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
Indexing Manager.
AlephKernel(IParallelMng *, Integer, IAlephFactory *, Integer=0, Integer=0, bool=false)
AlephVector * createSolverVector(void)
AlephVector * syncSolver(Integer, Integer &, Real *)
void mapranks(Array< Integer > &)
Matrix of a linear system.
Definition AlephMatrix.h:33
void assemble_waitAndFill()
assemble_waitAndFill waits for the previously posted requests to be processed
Reordering manager.
Parameters of a linear system.
Definition AlephParams.h:32
Information about the parallel environment.
Vector of a linear system.
Definition AlephVector.h:33
Modifiable view of an array of type T.
constexpr Integer size() const noexcept
Returns the size of the array.
Base class for 1D data vectors.
void add(ConstReferenceType val)
Adds element val to the end of the array.
ArrayView< T > view() const
Mutable view of this array.
Interface of the parallelism manager for a subdomain.
Interface of the subdomain manager.
Definition ISubDomain.h:75
virtual void flush()=0
Flushes all streams.
TraceAccessor(ITraceMng *m)
Constructs an accessor via the trace manager m.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flow for a debug message.
TraceMessage info() const
Flow for an information message.
ITraceMng * traceMng() const
Trace manager.
1D data vector with value semantics (STL style).
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Int32 Integer
Type representing an integer.
List< String > StringList
Unicode string list.
Definition UtilsTypes.h:509
double Real
Type representing a real number.