41 Integer numberOfResolutionsPerSolvers,
47 , m_sub_domain(subDomain)
48 , m_aleph_number_of_resolutions_per_solvers(numberOfResolutionsPerSolvers)
53 m_aleph_kernel(
new AlephKernel(subDomain, underlyingSolver, numberOfCores))
58 , m_get_solution_idx(0)
60 info() << Trace::Color::cyan() <<
"[AlephSolver] New solver "
61 <<
"with " << numberOfResolutionsPerSolvers <<
" resolutions, "
62 <<
"underlying solver is '" << underlyingSolver <<
"', "
63 <<
"and numberOfCores is " << numberOfCores;
64 m_aleph_mat.resize(numberOfResolutionsPerSolvers);
65 m_aleph_rhs.resize(numberOfResolutionsPerSolvers);
66 m_aleph_sol.resize(numberOfResolutionsPerSolvers);
68 m_vector_zeroes.add(0.0);
73 info() << Trace::Color::cyan() <<
"[AlephSolver] Delete solver";
74 delete m_aleph_kernel;
75 delete m_aleph_params;
87 Real residual_norm[4];
89 indexs.
resize(m_aleph_number_of_resolutions_per_solvers);
90 values.
resize(m_aleph_number_of_resolutions_per_solvers);
93 i < m_aleph_number_of_resolutions_per_solvers;
95 postSingleResolution(cell_temperature,
97 i, m_delta_t, values[i], indexs[i]);
100 for (
int i = m_aleph_number_of_resolutions_per_solvers - 1; i >= 0; i -= 1) {
101 debug() << Trace::Color::cyan() <<
"[AlephSolver::launchResolutions] Getting solution #" << i;
102 AlephVector* solution = m_aleph_kernel->syncSolver(i, nb_iteration, &residual_norm[0]);
103 if (i != m_get_solution_idx)
105 info() << Trace::Color::cyan() <<
"Solved in \33[7m" << nb_iteration <<
"\33[m iterations,"
106 <<
"residuals=[\33[1m" << residual_norm[0] <<
"\33[m," << residual_norm[3] <<
"]";
107 debug() << Trace::Color::cyan() <<
"[AlephSolver::launchResolutions] Applying solution #" << m_get_solution_idx;
108 solution->getLocalComponents(values[i]);
109 m_get_solution_idx += 1;
111 m_get_solution_idx %= m_aleph_number_of_resolutions_per_solvers;
113 debug() << Trace::Color::cyan() <<
"[AlephSolver::launchResolutions] Now get our results";
115 cell_temperature[cell] =
116 values[m_get_solution_idx][m_aleph_kernel->indexing()->get(cell_temperature, *cell)];
117 debug() << Trace::Color::cyan() <<
"[AlephSolver::launchResolutions] done";
131 Real deltaT = (1.0 + (
Real)i) * optionDeltaT;
133 Real fake_residual_norm[4];
136 debug() << Trace::Color::cyan()
137 <<
"[AlephSolver::postSingleResolution] Resize (" << m_vector_zeroes.size()
138 <<
") + filling the right-hand side";
139 values.
resize(m_vector_zeroes.size());
140 indexs.
resize(m_vector_zeroes.size());
142 Integer row = m_aleph_kernel->indexing()->get(cell_temperature, cell);
145 values[row] = cell_temperature[cell];
148 debug() << Trace::Color::cyan() <<
"[AlephSolver::postSingleResolution] ENUMERATE_FACE";
150 if (!iFace->cell(0).isOwn())
152 values[m_aleph_kernel->indexing()->get(cell_temperature, iFace->cell(0))] +=
153 deltaT * (face_temperature[iFace]) / geoFaceSurface(*iFace,
nodesCoordinates());
157 m_aleph_mat.setAt(i, m_aleph_kernel->createSolverMatrix());
158 m_aleph_rhs.setAt(i, m_aleph_kernel->createSolverVector());
159 m_aleph_sol.setAt(i, m_aleph_kernel->createSolverVector());
161 m_aleph_mat.at(i)->create();
162 m_aleph_rhs.at(i)->create();
163 m_aleph_sol.at(i)->create();
164 m_aleph_mat.at(i)->reset();
167 setValues(cell_temperature, face_temperature, deltaT, m_aleph_mat.at(i));
168 m_aleph_mat.at(i)->assemble();
170 debug() << Trace::Color::cyan() <<
"[AlephSolver::postSingleResolution] setLocalComponents";
172 m_aleph_rhs.at(i)->setLocalComponents(values.
view());
173 m_aleph_rhs.at(i)->assemble();
176 m_aleph_sol.at(i)->setLocalComponents(m_vector_zeroes.view());
177 m_aleph_sol.at(i)->assemble();
179 debug() << Trace::Color::cyan() <<
"\33[37m[AlephSolver::postSingleResolution] Now solve with Aleph";
180 m_aleph_mat.at(i)->solve(m_aleph_sol.at(i),
183 &fake_residual_norm[0],
200 debug() << Trace::Color::cyan() <<
"[AlephSolver::setValues] inner-faces";
202 if (iFace->backCell().isOwn()) {
204 aleph_mat->
setValue(cell_temperature, iFace->backCell(),
205 cell_temperature, iFace->frontCell(),
207 coefs[iFace->backCell()] += 1.0 / surface;
209 if (iFace->frontCell().isOwn()) {
211 aleph_mat->
setValue(cell_temperature, iFace->frontCell(),
212 cell_temperature, iFace->backCell(),
214 coefs[iFace->frontCell()] += 1.0 / surface;
217 debug() << Trace::Color::cyan() <<
"[AlephSolver::setValues] outer-faces";
219 if (!iFace->cell(0).isOwn())
223 debug() << Trace::Color::cyan() <<
"[AlephSolver::setValues] diagonal";
225 aleph_mat->
setValue(cell_temperature, cell,
226 cell_temperature, cell,
227 1.0 + deltaT * coefs[cell]);
229 debug() << Trace::Color::cyan() <<
"[AlephSolver::setValues] done";
240 const Real3 xyz0 = nodes_coords[face.
node(0)];
241 const Real3 xyz1 = nodes_coords[face.
node(1)];
242 const Real3 xyz3 = nodes_coords[face.
node(3)];
243 return (xyz0 - xyz1).normL2() * (xyz0 - xyz3).normL2();
246 const Real3 xyz0 = nodes_coords[face.
node(0)];
247 const Real3 xyz1 = nodes_coords[face.
node(1)];
248 return (xyz0 - xyz1).normL2();
256 Integer m_aleph_number_of_resolutions_per_solvers;
virtual ITimeLoopMng * timeLoopMng()=0
Returns the time loop manager.