12#include "AlephArcane.h"
15#include "arcane/utils/String.h"
17#include "arcane/utils/ArcanePrecomp.h"
19#include "arcane/core/IMesh.h"
20#include "arcane/core/VariableInfo.h"
21#include "arcane/core/IVariable.h"
22#include "arcane/core/IVariableMng.h"
25#define ALEPH_INDEX_NOT_USED (-1)
43, m_sub_domain(kernel->subDomain())
47 debug() <<
"\33[1;33m[AlephIndexing::AlephIndexing] NEW"
49 m_known_items_all_address.resize(0);
56updateKnownItems(VariableItemInt32* var_idx,
60 m_known_items_all_address.add(&(*var_idx)[itm]);
64 (*var_idx)[itm] = m_current_idx;
65 m_known_items_own += 1;
69 (*var_idx)[itm] = m_current_idx;
75 return m_current_idx - 1;
82findWhichLidFromMapMap(IVariable* var,
90 VarMapIdx::const_iterator iVarMap = m_var_map_idx.find(var);
93 if (iVarMap == m_var_map_idx.end()) {
96 String var_idx_name(var->name());
97 var_idx_name = var_idx_name + String(
"_idx");
100 var_idx_name, IVariable::PSubDomainDepend),
103 m_var_map_idx.insert(std::make_pair(var, var_idx));
105 var_idx->fill(ALEPH_INDEX_NOT_USED);
106 return updateKnownItems(var_idx, itm);
110 if ((*var_idx)[itm] == ALEPH_INDEX_NOT_USED) {
113 return updateKnownItems(var_idx, itm);
117 return (*var_idx)[itm];
124get(
const VariableRef& variable,
125 const ItemEnumerator& itm)
127 return get(variable, *itm);
129Int32 AlephIndexing::get(
const VariableRef& variable,
132 IVariable* var = variable.variable();
133 if (m_kernel->isInitialized()) {
134 auto x = m_var_map_idx.find(var);
135 if (x == m_var_map_idx.end())
137 return (*x->second)[itm] - m_kernel->topology()->part()[m_kernel->rank()];
140 if (var->dimension() != 1)
141 throw ArgumentException(A_FUNCINFO,
"cannot get non-scalar variables!");
143 if (var->itemKind() >= IK_Unknown)
144 throw ArgumentException(A_FUNCINFO,
"Unknown Item Kind!");
146 return findWhichLidFromMapMap(var, itm);
153buildIndexesFromAddress(
void)
155 const Integer topology_row_offset = m_kernel->topology()->part()[m_kernel->rank()];
156 VarMapIdx::const_iterator iVarIdx = m_var_map_idx.begin();
157 debug() <<
"\33[1;7;33m[buildIndexesFromAddress] Re-indexing variables with offset " << topology_row_offset <<
"\33[m";
159 for (; iVarIdx != m_var_map_idx.end(); ++iVarIdx) {
160 ItemGroup group = iVarIdx->first->itemGroup();
164 if ((*var_idx)[itm] == ALEPH_INDEX_NOT_USED)
167 (*var_idx)[itm] += topology_row_offset;
169 debug() <<
"\t\33[1;7;33m[buildIndexesFromAddress] Synchronizing idx for variable " << iVarIdx->second->name() <<
"\33[m";
170 iVarIdx->second->synchronize();
181 return m_known_items_own;
188nowYouCanBuildTheTopology(AlephMatrix* fromThisMatrix,
189 AlephVector* fromThisX,
190 AlephVector* fromThisB)
193 Integer lki = localKnownItems();
195 Integer gki = m_kernel->parallel()->reduce(Parallel::ReduceSum, lki);
196 debug() <<
"\33[1;33m[AlephIndexing::nowYouCanBuildTheTopology] Working with lki="
197 << lki <<
", gki=" << gki <<
"\33[m";
199 m_kernel->initialize(gki, lki);
202 debug() <<
"\33[1;7;33m[AlephIndexing::nowYouCanBuildTheTopology] Kernel is now initialized, rewinding Aleph operations!\33[m";
204 if (m_kernel->isParallel())
205 buildIndexesFromAddress();
207 debug() <<
"\33[1;33m[AlephIndexing::nowYouCanBuildTheTopology] asking kernel for a Matrix\33[m";
208 AlephMatrix* firstMatrix = m_kernel->createSolverMatrix();
209 debug() <<
"\33[1;33m[AlephIndexing::nowYouCanBuildTheTopology] asking kernel for a RHS Vector\33[m";
210 AlephVector* firstRhsVector = m_kernel->createSolverVector();
211 debug() <<
"\33[1;33m[AlephIndexing::nowYouCanBuildTheTopology] asking kernel for a LHS Vector\33[m";
212 AlephVector* firstLhsVector = m_kernel->createSolverVector();
213 debug() <<
"\33[1;33m[AlephIndexing::nowYouCanBuildTheTopology] firstMatrix->create()\33[m";
214 firstMatrix->create();
215 debug() <<
"\33[1;33m[AlephIndexing::nowYouCanBuildTheTopology] firstRhsVector->create()\33[m";
216 firstRhsVector->create();
217 debug() <<
"\33[1;33m[AlephIndexing::nowYouCanBuildTheTopology] firstLhsVector->create()\33[m";
218 firstLhsVector->create();
220 debug() <<
"\33[1;33m[AlephIndexing::nowYouCanBuildTheTopology] reSetValues fromThisMatrix\33[m";
221 fromThisMatrix->reSetValuesIn(firstMatrix,
222 m_known_items_all_address);
224 debug() <<
"\33[1;33m[AlephIndexing::nowYouCanBuildTheTopology] reAddValues fromThisMatrix\33[m";
225 fromThisMatrix->reAddValuesIn(firstMatrix,
226 m_known_items_all_address);
228 debug() <<
"\33[1;33m[AlephIndexing::nowYouCanBuildTheTopology] firstMatrix->assemble()\33[m";
229 firstMatrix->assemble();
231 debug() <<
"\33[1;33m[AlephIndexing::nowYouCanBuildTheTopology] firstRhsVector reSetLocalComponents/assemble\33[m";
232 firstRhsVector->reSetLocalComponents(fromThisB);
233 firstRhsVector->assemble();
234 debug() <<
"\33[1;33m[AlephIndexing::nowYouCanBuildTheTopology] firstLhsVector reSetLocalComponents/assemble\33[m";
235 firstLhsVector->reSetLocalComponents(fromThisX);
236 firstLhsVector->assemble();
237 debug() <<
"\33[1;33m[AlephIndexing::nowYouCanBuildTheTopology] nothing more to do here!\33[m";
246 debug() <<
"\t\33[1;33m[AlephIndexing::~AlephIndexing] deleting each new'ed VarMapIdx..."
248 VarMapIdx::const_iterator iVarIdx = m_var_map_idx.begin();
249 for (; iVarIdx != m_var_map_idx.end(); ++iVarIdx)
250 delete iVarIdx->second;
251 debug() <<
"\t\33[1;33m[AlephIndexing::~AlephIndexing] done!"
Arcane configuration file.
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
Declarations of Arcane's general types.
ItemVariableScalarRefT< Int32 > VariableItemInt32
32-bit integer type quantity
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Int32 Integer
Type representing an integer.