Arcane  4.1.12.0
Developer documentation
Loading...
Searching...
No Matches
InternalInfosDumper.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/* InternalInfosDumper.cc (C) 2000-2025 */
9/* */
10/* Dumping Arcane's internal information. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/impl/InternalInfosDumper.h"
15
16#include "arcane/utils/String.h"
17#include "arcane/utils/PlatformUtils.h"
18#include "arcane/utils/FatalErrorException.h"
19#include "arcane/utils/ITraceMng.h"
20#include "arcane/utils/ScopedPtr.h"
21#include "arcane/utils/ApplicationInfo.h"
22#include "arcane/utils/JSONWriter.h"
23#include "arcane/utils/FileContent.h"
24
26#include "arcane/core/IParallelMng.h"
27#include "arcane/core/Directory.h"
28#include "arcane/core/ServiceFinder2.h"
29#include "arcane/core/IApplication.h"
30#include "arcane/core/ICodeService.h"
31#include "arcane/core/SubDomainBuildInfo.h"
32#include "arcane/core/IServiceLoader.h"
33#include "arcane/core/IParallelSuperMng.h"
34#include "arcane/core/IMainFactory.h"
35#include "arcane/core/ISession.h"
36#include "arcane/core/ISubDomain.h"
37#include "arcane/core/ITimeLoopMng.h"
38#include "arcane/core/IVariableMng.h"
39#include "arcane/core/IXmlDocumentHolder.h"
40#include "arcane/core/XmlNodeList.h"
41#include "arcane/core/IModuleMng.h"
42#include "arcane/core/IModule.h"
43#include "arcane/core/VariableRef.h"
44#include "arcane/core/VariableCollection.h"
45#include "arcane/core/IIOMng.h"
46#include "arcane/core/ITimeLoop.h"
47#include "arcane/core/ICaseMng.h"
48#include "arcane/core/ICaseOptions.h"
49#include "arcane/core/IRessourceMng.h"
50
51#include "arcane/impl/TimeLoopReader.h"
52
53#include <set>
54#include <map>
55
56/*---------------------------------------------------------------------------*/
57/*---------------------------------------------------------------------------*/
58
59namespace Arcane
60{
61
62extern "C++" ARCANE_IMPL_EXPORT Ref<ICodeService>
63createArcaneCodeService(IApplication* app);
64
65/*---------------------------------------------------------------------------*/
66/*---------------------------------------------------------------------------*/
67
68InternalInfosDumper::
69InternalInfosDumper(IApplication* application)
70: m_application(application)
71{
72}
73
74/*---------------------------------------------------------------------------*/
75/*---------------------------------------------------------------------------*/
76
77Ref<ICodeService> InternalInfosDumper::
78_getDefaultService()
79{
80 String code_name = platform::getEnvironmentVariable("STDENV_CODE_NAME");
81 if (code_name.null())
82 ARCANE_FATAL("environment variable 'STDENV_CODE_NAME' is not defined");
83
84 IApplication* app = m_application;
85 ServiceFinder2T<ICodeService, IApplication> code_services_utils(app, app);
86 String full_code_name = code_name + "Code";
87 Ref<ICodeService> code = code_services_utils.createReference(full_code_name);
88 if (!code) {
89 // The Arcane named code service is special and is used to generate
90 // the internal documentation. If it is not registered, we create
91 // the instance directly.
92 if (code_name == "Arcane")
93 code = createArcaneCodeService(app);
94 }
95 if (!code)
96 ARCANE_FATAL("No code service named '{0}' found", full_code_name);
97 return code;
98}
99
100/*---------------------------------------------------------------------------*/
101/*---------------------------------------------------------------------------*/
102
103void InternalInfosDumper::
104dumpInternalInfos()
105{
106 ITraceMng* tr = m_application->traceMng();
107 IMainFactory* main_factory = m_application->mainFactory();
108 tr->info() << "Dumping internal infos to Arcane";
109 Ref<ICodeService> code_service = _getDefaultService();
110 ISession* session(code_service->createSession());
111 IParallelSuperMng* psm = m_application->parallelSuperMng();
112 Ref<IParallelMng> world_pm = psm->internalCreateWorldParallelMng(0);
113 SubDomainBuildInfo sdbi(world_pm, 0);
114 sdbi.setCaseFileName(String());
115 sdbi.setCaseBytes(ByteConstArrayView());
116 ISubDomain* sub_domain(session->createSubDomain(sdbi));
117 ScopedPtrT<IServiceLoader> service_loader(main_factory->createServiceLoader());
118 // The services are already registered when the subdomain is created
119 {
120 TimeLoopReader stl(m_application);
121 stl.readTimeLoops();
122 stl.registerTimeLoops(sub_domain);
123 }
124 // Load all available modules
125 service_loader->loadModules(sub_domain, true);
126
127 // Store all IServiceInfo in the array.
128 UniqueArray<IServiceInfo*> service_infos;
129 {
130 std::set<IServiceInfo*> done_set;
131 for (ServiceFactory2Collection::Enumerator j(m_application->serviceFactories2()); ++j;) {
132 Internal::IServiceFactory2* sf2 = *j;
133 IServiceInfo* s = sf2->serviceInfo();
134 if (done_set.find(s) == done_set.end()) {
135 service_infos.add(s);
136 done_set.insert(s);
137 }
138 }
139 }
140
141 IModuleMng* module_mng = sub_domain->moduleMng();
142 IVariableMng* variable_mng = sub_domain->variableMng();
143
144 VariableRefList var_ref_list;
145
146 String us_name("name");
147 String us_ref("ref");
148 String us_datatype("datatype");
149 String us_dimension("dimension");
150 String us_kind("kind");
151 String us_root("root");
152 String us_modules("modules");
153 String us_module("module");
154 String us_services("services");
155 String us_service("service");
156
157 ScopedPtrT<IXmlDocumentHolder> doc_holder(m_application->ressourceMng()->createXmlDocument());
158 XmlNode doc_element = doc_holder->documentNode();
159 XmlNode root_element = doc_element.createAndAppendElement(us_root);
160
161 XmlNode modules = root_element.createAndAppendElement(us_modules);
162 // List of modules with the variables they use.
163 for (ModuleCollection::Enumerator i(module_mng->modules()); ++i;) {
164 XmlNode module_element = modules.createAndAppendElement(us_module);
165 module_element.setAttrValue(us_name, String((*i)->name()));
166 var_ref_list.clear();
167 variable_mng->variables(var_ref_list, *i);
168 for (VariableRefList::Enumerator j(var_ref_list); ++j;) {
169 XmlNode variable_element = module_element.createAndAppendElement("variable-ref");
170 variable_element.setAttrValue(us_ref, String((*j)->name()));
171 }
172 }
173
174 XmlNode variables = root_element.createAndAppendElement("variables");
175 // List of variables.
176 VariableCollection var_prv_list(variable_mng->variables());
177 for (VariableCollection::Enumerator j(var_prv_list); ++j;) {
178 IVariable* var = *j;
179 String dim(String::fromNumber(var->dimension()));
180 XmlNode variable_element = variables.createAndAppendElement("variable");
181 variable_element.setAttrValue(us_name, var->name());
182 variable_element.setAttrValue(us_datatype, dataTypeName(var->dataType()));
183 variable_element.setAttrValue(us_dimension, dim);
184 variable_element.setAttrValue(us_kind, itemKindName(var->itemKind()));
185 }
186
187 // List of time loops
188 ITimeLoopMng* tm = sub_domain->timeLoopMng();
189 StringList timeloop_name_list;
190 tm->timeLoopsName(timeloop_name_list);
191
192 XmlNode timeloops = root_element.createAndAppendElement("timeloops");
193 for (StringCollection::Enumerator i(timeloop_name_list); ++i;) {
194 XmlNode timeloop_elem = timeloops.createAndAppendElement("timeloop");
195 timeloop_elem.setAttrValue(us_name, *i);
196 }
197
198 // List of services
199 {
200 // List of services that implement a given interface
201 std::map<String, List<IServiceInfo*>> interfaces_to_service;
202 XmlNode services_elem = root_element.createAndAppendElement(us_services);
203
204 for (int i = 0, n = service_infos.size(); i < n; ++i) {
205 IServiceInfo* service_info = service_infos[i];
206 XmlNode service_elem = services_elem.createAndAppendElement(us_service);
207 service_elem.setAttrValue(us_name, service_info->localName());
208 {
209 auto xml_file_base_name = service_info->caseOptionsFileName();
210 if (!xml_file_base_name.null()) {
211 service_elem.setAttrValue("file-base-name", xml_file_base_name);
212 }
213 }
214 for (StringCollection::Enumerator j(service_info->implementedInterfaces()); ++j;) {
215 XmlNode interface_elem = service_elem.createAndAppendElement("implement-class");
216 interface_elem.setAttrValue(us_name, *j);
217 interfaces_to_service[*j].add(service_info);
218 }
219 }
220
221 {
222 XmlNode classes_elem = services_elem.createAndAppendElement("services-class");
223 std::map<String, List<IServiceInfo*>>::const_iterator begin = interfaces_to_service.begin();
224 std::map<String, List<IServiceInfo*>>::const_iterator end = interfaces_to_service.end();
225 for (; begin != end; ++begin) {
226 XmlNode class_elem = classes_elem.createAndAppendElement("class");
227 class_elem.setAttrValue(us_name, begin->first);
228 for (List<IServiceInfo*>::Enumerator i(begin->second); ++i;) {
229 IServiceInfo* service_info = *i;
230 XmlNode service_elem = class_elem.createAndAppendElement(us_service);
231 service_elem.setAttrValue(us_name, service_info->localName());
232 {
233 auto xml_file_base_name = service_info->caseOptionsFileName();
234 if (!xml_file_base_name.null()) {
235 service_elem.setAttrValue("file-base-name", xml_file_base_name);
236 }
237 }
238 }
239 }
240 }
241 }
242
243 Directory shared_dir(m_application->applicationInfo().dataDir());
244 String filename = shared_dir.file("arcane_internal.xml");
245 cerr << "** FILE IS " << filename << '\n';
246 sub_domain->ioMng()->writeXmlFile(doc_holder.get(), filename);
247}
248
249/*---------------------------------------------------------------------------*/
250/*---------------------------------------------------------------------------*/
251
252void InternalInfosDumper::
253dumpInternalAllInfos()
254{
255 m_application->traceMng()->info() << "Dumping time loop information";
256 IMainFactory* main_factory = m_application->mainFactory();
257 Ref<ICodeService> code_service = _getDefaultService();
258
259 ByteConstSpan config_bytes = m_application->configBuffer();
260 ScopedPtrT<IXmlDocumentHolder> config_doc(m_application->ioMng()->parseXmlBuffer(config_bytes, String()));
261 if (!config_doc.get())
262 ARCANE_FATAL("Can not parse code configuration file");
263 XmlNode elem = config_doc->documentNode().documentElement();
264
265 // The time loop is specified in the config file.
266 // XmlNode elem = m_application->configRootElement();
267 elem = elem.child("Execution");
268 elem = elem.child("BouclesTemps");
269
270 ScopedPtrT<IServiceLoader> service_loader(main_factory->createServiceLoader());
271
272 ScopedPtrT<IXmlDocumentHolder> doc_holder(m_application->ressourceMng()->createXmlDocument());
273 XmlNode doc_element = doc_holder->documentNode();
274 XmlNode root_element = doc_element.createAndAppendElement(String("root"));
275
276 String us_name("name");
277
278 TimeLoopReader stl(m_application);
279 stl.readTimeLoops();
280
281 {
282 const ApplicationInfo& app_info = m_application->applicationInfo();
284 XmlNode elem2(root_element.createAndAppendElement("general"));
285 elem2.createAndAppendElement("codename", String(app_info.codeName()));
286 elem2.createAndAppendElement("codefullversion", String(m_application->mainVersionStr()));
287 elem2.createAndAppendElement("codeversion", String(m_application->majorAndMinorVersionStr()));
288 }
289
290 IParallelSuperMng* psm = m_application->parallelSuperMng();
292
293 for (TimeLoopCollection::Enumerator i(stl.timeLoops()); ++i;) {
294 ITimeLoop* timeloop = *i;
295 const String& timeloop_name = timeloop->name();
296
297 ISession* session = nullptr;
298 ISubDomain* sd = nullptr;
299 try {
300 session = code_service->createSession();
301 service_loader->loadSessionServices(session);
302 SubDomainBuildInfo sdbi(world_pm, 0);
303 sdbi.setCaseFileName(String());
304 sdbi.setCaseBytes(ByteConstArrayView());
305 sd = session->createSubDomain(sdbi);
306 //service_loader->loadSubDomainServices(sd);
307
308 ITimeLoopMng* loop_mng = sd->timeLoopMng();
309 loop_mng->registerTimeLoop(timeloop);
310 loop_mng->setUsedTimeLoop(timeloop_name);
311 }
312 catch (...) {
313 session = nullptr;
314 sd = nullptr;
315 }
316 if (!sd)
317 continue;
318 XmlNode mng_element = root_element.createAndAppendElement("timeloop");
319 mng_element.setAttrValue(us_name, timeloop_name);
320 sd->dumpInternalInfos(mng_element);
321 }
322
323 Directory shared_dir(m_application->applicationInfo().dataDir());
324 String filename = shared_dir.file("arcane-caseinfos.xml");
325 cerr << "** FILE IS " << filename << '\n';
326 m_application->ioMng()->writeXmlFile(doc_holder.get(), filename);
327}
328
329/*---------------------------------------------------------------------------*/
330/*---------------------------------------------------------------------------*/
331
332void InternalInfosDumper::
333_dumpSubDomainInternalInfos(ISubDomain* sd, JSONWriter& json_writer)
334{
335 // Information about the time loop used.
336 {
337 ITimeLoopMng* tlm = sd->timeLoopMng();
338 ITimeLoop* time_loop = tlm->usedTimeLoop();
339 JSONWriter::Object jo_timeloopinfo(json_writer, "timeloopinfo");
340 json_writer.write("title", time_loop->title());
341 json_writer.write("description", time_loop->description());
342
343 JSONWriter::Array ja_userclass(json_writer, "userclass");
344 for (StringCollection::Enumerator j(time_loop->userClasses()); ++j;) {
345 json_writer.writeValue(*j);
346 }
347 }
348
349 String ustr_module("module");
350 String ustr_name("name");
351 String ustr_activated("activated");
352 String ustr_variable("variable");
353 String ustr_variable_ref("variable-ref");
354 String ustr_ref("ref");
355 String ustr_datatype("datatype");
356 String ustr_dimension("dimension");
357 String ustr_kind("kind");
358 String ustr_caseblock("caseblock");
359 String ustr_tagname("tagname");
360
361 IVariableMng* var_mng = sd->variableMng();
362
363 // List of modules with the variables they use.
364 {
365 JSONWriter::Array ja_modules(json_writer, "modules");
366 for (IModule* module : sd->moduleMng()->modules()) {
367 JSONWriter::Object jo_module(json_writer);
368 json_writer.write(ustr_name, module->name());
369 json_writer.write(ustr_activated, module->used());
370
371 VariableRefList var_ref_list;
372 var_mng->variables(var_ref_list, module);
373 JSONWriter::Array ja_variables(json_writer, "variables");
374 for (VariableRef* vr : var_ref_list)
375 json_writer.writeValue(vr->variable()->fullName());
376 }
377 }
378
379 // List of variables.
380 {
381 VariableCollection var_prv_list = var_mng->variables();
382 JSONWriter::Array jo_variables(json_writer, "variables");
383 for (VariableCollection::Enumerator j(var_prv_list); ++j;) {
384 IVariable* var = *j;
385 JSONWriter::Object jo_variable(json_writer);
386 json_writer.write(ustr_name, var->fullName());
387 json_writer.write(ustr_datatype, dataTypeName(var->dataType()));
388 json_writer.write(ustr_dimension, (Int64)var->dimension());
389 json_writer.write(ustr_kind, itemKindName(var->itemKind()));
390 }
391 }
392
393 // List of option blocks
394 {
395 ICaseMng* cm = sd->caseMng();
396 CaseOptionsCollection blocks = cm->blocks();
397
398 JSONWriter::Array ja_blocks(json_writer, "caseblocks");
399 for (ICaseOptions* block : blocks) {
400 JSONWriter::Object jo_block(json_writer);
401 json_writer.write(ustr_tagname, block->rootTagName());
402
403 IModule* block_module = block->caseModule();
404 if (block_module)
405 json_writer.write(ustr_module, block_module->name());
406 }
407 }
408}
409
410/*---------------------------------------------------------------------------*/
411/*---------------------------------------------------------------------------*/
412
416void InternalInfosDumper::
417dumpArcaneDatabase()
418{
419 IApplication* app = m_application;
420 ITraceMng* tr = app->traceMng();
421 IMainFactory* main_factory = m_application->mainFactory();
422 tr->info() << "Generating Arcane Database";
423 Ref<ICodeService> code_service = _getDefaultService();
424 ISession* session(code_service->createSession());
427 SubDomainBuildInfo sdbi(world_pm, 0);
428 sdbi.setCaseFileName(String());
429 sdbi.setCaseBytes(ByteConstArrayView());
430 ISubDomain* sub_domain(session->createSubDomain(sdbi));
431 ScopedPtrT<IServiceLoader> service_loader(main_factory->createServiceLoader());
432
433 ByteConstSpan config_bytes = m_application->configBuffer();
434 ScopedPtrT<IXmlDocumentHolder> config_doc(app->ioMng()->parseXmlBuffer(config_bytes, String()));
435 if (!config_doc.get())
436 ARCANE_FATAL("Can not parse code configuration file");
437
438 // Services are already registered during the creation of the sub-domain
439 {
440 TimeLoopReader stl(m_application);
441 stl.readTimeLoops();
442 stl.registerTimeLoops(sub_domain);
443 }
444 // Load all available modules
445 service_loader->loadModules(sub_domain, true);
446
447 // Store all created IServiceInfo in this array
448 UniqueArray<IServiceInfo*> service_infos;
449 {
450 std::set<IServiceInfo*> done_set;
451 for (ServiceFactory2Collection::Enumerator j(m_application->serviceFactories2()); ++j;) {
453 IServiceInfo* s = sf2->serviceInfo();
454 if (done_set.find(s) == done_set.end()) {
455 service_infos.add(s);
456 done_set.insert(s);
457 }
458 }
459 }
460
461 IModuleMng* module_mng = sub_domain->moduleMng();
462 IVariableMng* variable_mng = sub_domain->variableMng();
463
464 String us_name("name");
465 String us_ref("ref");
466 String us_datatype("datatype");
467 String us_dimension("dimension");
468 String us_kind("kind");
469 String us_root("root");
470 String us_modules("modules");
471 String us_module("module");
472 String us_services("services");
473 String us_service("service");
474
475 ScopedPtrT<IXmlDocumentHolder> doc_holder(m_application->ressourceMng()->createXmlDocument());
476 XmlNode doc_element = doc_holder->documentNode();
477 XmlNode root_element = doc_element.createAndAppendElement(us_root);
478
479 JSONWriter json_writer(JSONWriter::FormatFlags::None);
480 json_writer.beginObject();
481 json_writer.write("version", "1");
482
483 // List of modules with the variables they use.
484 {
485 JSONWriter::Array ja_modules(json_writer, "modules");
486 for (IModule* module : module_mng->modules()) {
487 JSONWriter::Object jo(json_writer);
488 json_writer.write(us_name, module->name());
489 VariableRefList var_ref_list;
490 variable_mng->variables(var_ref_list, module);
491 JSONWriter::Array ja_var_ref(json_writer, "variable-references");
492 for (VariableRefList::Enumerator j(var_ref_list); ++j;) {
493 json_writer.writeValue((*j)->name());
494 }
495 }
496 }
497
498 // List of variables with their characteristics
499 {
500 VariableCollection var_prv_list(variable_mng->variables());
501 JSONWriter::Array ja(json_writer, "variables");
502 for (VariableCollection::Enumerator j(var_prv_list); ++j;) {
503 IVariable* var = *j;
504
505 JSONWriter::Object jo(json_writer);
506 json_writer.write(us_name, var->name());
507 json_writer.write(us_datatype, dataTypeName(var->dataType()));
508 json_writer.write(us_dimension, (Int64)var->dimension());
509 json_writer.write(us_kind, itemKindName(var->itemKind()));
510 }
511 }
512
513 // List of services that implement a given interface
514 std::map<String, List<IServiceInfo*>> interfaces_to_service;
515
516 // List of services
517 {
518 JSONWriter::Array ja_services(json_writer, us_services);
519
520 for (IServiceInfo* service_info : service_infos) {
521 JSONWriter::Object jo(json_writer);
522 json_writer.write(us_name, service_info->localName());
523 json_writer.writeIfNotNull("file-base-name", service_info->caseOptionsFileName());
524
525 // Save the content by splitting it into several strings
526 // which prevents having overly long lines.
527 Span<const Byte> content = service_info->axlContent().bytes();
528 Int64 content_size = content.size();
529 if (content_size > 0) {
530 Int64 block_size = 80;
531 Int64 nb_block = content_size / block_size;
532 if ((content_size % block_size) != 0)
533 ++nb_block;
534 JSONWriter::Array ja_axl_content(json_writer, "axl-content");
535 Int64 index = 0;
536 for (Integer k = 0; k < nb_block; ++k) {
537 auto z = content.subSpan(index, block_size);
538 json_writer.writeValue(z);
539 index += block_size;
540 }
541 }
542
543 // Save the list of interfaces implemented by this service
544 {
545 JSONWriter::Array ja_implemented_interfaces(json_writer, "implemented-interfaces");
546 for (StringCollection::Enumerator j(service_info->implementedInterfaces()); ++j;) {
547 interfaces_to_service[*j].add(service_info);
548 json_writer.writeValue(*j);
549 }
550 }
551 }
552 }
553
554 // List of service interfaces and the services implementing them.
555 {
556 JSONWriter::Array jo_services_interfaces(json_writer, "service-interfaces");
557 for (const auto& x : interfaces_to_service) {
558 JSONWriter::Object jo_class(json_writer);
559 json_writer.write(us_name, x.first);
560 JSONWriter::Array ja_services(json_writer, "services");
561 for (IServiceInfo* service_info : x.second) {
562 JSONWriter::Object jo_service(json_writer);
563 json_writer.write(us_name, service_info->localName());
564 json_writer.writeIfNotNull("file-base-name", service_info->caseOptionsFileName());
565 }
566 }
567 }
568
569 TimeLoopReader stl(m_application);
570 stl.readTimeLoops();
571
572 {
573 const ApplicationInfo& app_info = m_application->applicationInfo();
574 JSONWriter::Object jo_general(json_writer, "general");
575 json_writer.write("codename", app_info.codeName());
576 json_writer.write("codefullversion", m_application->mainVersionStr());
577 json_writer.write("codeversion", m_application->majorAndMinorVersionStr());
578 }
579
580 {
581 JSONWriter::Array jo_timeloops(json_writer, "timeloops");
582 for (TimeLoopCollection::Enumerator i(stl.timeLoops()); ++i;) {
583 ITimeLoop* timeloop = *i;
584 const String& timeloop_name = timeloop->name();
585
586 JSONWriter::Object jo_timeloop(json_writer);
587 json_writer.write(us_name, timeloop_name);
588
589 ISession* session = nullptr;
590 ISubDomain* sd = nullptr;
591 try {
592 session = code_service->createSession();
593 service_loader->loadSessionServices(session);
594 SubDomainBuildInfo sdbi(world_pm, 0);
595 sdbi.setCaseFileName(String());
596 sdbi.setCaseBytes(ByteConstArrayView());
597 sd = session->createSubDomain(sdbi);
598
599 ITimeLoopMng* loop_mng = sd->timeLoopMng();
600 loop_mng->registerTimeLoop(timeloop);
601 loop_mng->setUsedTimeLoop(timeloop_name);
602 }
603 catch (...) {
604 session = nullptr;
605 sd = nullptr;
606 }
607 // TODO: Indicate if sd is null.
608 if (sd) {
609 _dumpSubDomainInternalInfos(sd, json_writer);
610 }
611 }
612 }
613
614 json_writer.endObject();
615
616 {
617 // Writes the JSON file.
618 Directory shared_dir(m_application->applicationInfo().dataDir());
619 String json_filename = shared_dir.file("arcane_database.json");
620 cerr << "** FILE2 IS " << json_filename << '\n';
621 String buf(json_writer.getBuffer());
622 // TODO: check if it would not be preferable to save the file
623 // in the current directory.
624 std::ofstream ofile(json_filename.localstr());
625 buf.writeBytes(ofile);
626 }
627}
628
629/*---------------------------------------------------------------------------*/
630/*---------------------------------------------------------------------------*/
631
632} // End namespace Arcane
633
634/*---------------------------------------------------------------------------*/
635/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
File containing declarations concerning the message passing model.
Application information.
const String & codeName() const
Returns the name of the calculation code linked to the application.
void add(ConstReferenceType val)
Adds element val to the end of the array.
Class managing a directory.
Definition Directory.h:36
String file(const String &file_name) const override
Returns the full path of the file file_name in the directory.
Definition Directory.cc:120
Application interface.
virtual IIOMng * ioMng()=0
Input/output manager.
virtual IParallelSuperMng * parallelSuperMng()=0
Supervisory parallelism manager.
virtual ITraceMng * traceMng() const =0
Trace manager.
virtual IXmlDocumentHolder * parseXmlBuffer(Span< const Byte > buffer, const String &name)=0
Reads and parses the XML file contained in the buffer buffer.
Factory for Arcane classes.
virtual IServiceLoader * createServiceLoader()=0
Creates an instance of the service loader.
Module manager interface.
Definition IModuleMng.h:39
virtual ModuleCollection modules() const =0
List of modules.
Interface of a module.
Definition IModule.h:40
Abstract class of the parallelism supervisor.
virtual Ref< IParallelMng > internalCreateWorldParallelMng(Int32 local_rank)=0
Creates a parallelism manager for all allocated cores.
Interface for service or module information.
virtual String localName() const =0
Local part of the service name.
virtual const String & caseOptionsFileName() const =0
Name of the file containing the dataset (null if none).
Interface for a case execution session.
Definition ISession.h:38
virtual ISubDomain * createSubDomain(const SubDomainBuildInfo &sdbi)=0
Creates a sub-domain with the parameters contained in sdbi.
Interface of the subdomain manager.
Definition ISubDomain.h:75
virtual IModuleMng * moduleMng()=0
Returns the module manager.
virtual void dumpInternalInfos(XmlNode &elem)=0
Dumps internal architecture information. The information is stored in an XML tree with root as the ro...
virtual ITimeLoopMng * timeLoopMng()=0
Returns the time loop manager.
virtual IVariableMng * variableMng()=0
Returns the variable manager.
virtual ICaseMng * caseMng()=0
Returns the dataset manager.
Interface for the time loop manager.
virtual ITimeLoop * usedTimeLoop() const =0
Returns the time loop used.
virtual void registerTimeLoop(ITimeLoop *time_loop)=0
Registration and selection of the time loop.
virtual void setUsedTimeLoop(const String &name)=0
Positions the time loop to be executed. Selects the time loop named name as the one to be executed....
Interface of a time loop.
Definition ITimeLoop.h:33
virtual String title() const =0
Title of the time loop.
virtual String description() const =0
Description of the time loop.
virtual StringCollection userClasses() const =0
List of user classes associated with the time loop.
virtual String name() const =0
Name of the time loop.
virtual TraceMessage info()=0
Stream for an information message.
Variable manager interface.
virtual void variables(VariableRefCollection v, IModule *i)=0
Gets all variables of module i.
Interface of a variable.
Definition IVariable.h:40
virtual eDataType dataType() const =0
Data type managed by the variable (Real, Integer, ...).
virtual eItemKind itemKind() const =0
Kind of mesh entities on which the variable is based.
virtual Integer dimension() const =0
Dimension of the variable.
virtual String name() const =0
Variable name.
virtual IServiceInfo * serviceInfo() const =0
Returns the IServiceInfo associated with this factory.
T * get() const
Returns the object referenced by the instance.
Definition Ptr.h:122
Reference to an instance.
Encapsulation of an automatically destructing pointer.
Definition ScopedPtr.h:44
constexpr __host__ __device__ SizeType size() const noexcept
Returns the size of the array.
Definition Span.h:327
View of an array of elements of type T.
Definition Span.h:635
constexpr __host__ __device__ Span< T, DynExtent > subSpan(Int64 abegin, Int64 asize) const
Sub-view starting from element abegin and containing asize elements.
Definition Span.h:736
void writeBytes(std::ostream &o) const
Writes the string in UTF-8 format to the stream o.
Definition String.cc:1247
const char * localstr() const
Returns the conversion of the instance into UTF-8 encoding.
Definition String.cc:229
Parameters necessary for building a subdomain.
Time loop loading functor.
TimeLoopCollection timeLoops() const
List of read time loops.
void readTimeLoops()
Performs the reading of available time loops.
void registerTimeLoops(ISubDomain *sd)
Registers the list of time loops in the manager sd.
1D data vector with value semantics (STL style).
Node of a DOM tree.
Definition XmlNode.h:51
XmlNode child(const String &name) const
Child node of this node with name name.
Definition XmlNode.cc:73
void setAttrValue(const String &name, const String &value)
Sets the attribute name to the value value.
Definition XmlNode.cc:248
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int64_t Int64
Signed integer type of 64 bits.
Int32 Integer
Type representing an integer.
List< String > StringList
Unicode string list.
Definition UtilsTypes.h:509
Collection< ICaseOptions * > CaseOptionsCollection
Collection of dataset options.
const char * itemKindName(eItemKind kind)
Entity kind name.
ConstArrayView< Byte > ByteConstArrayView
C equivalent of a 1D array of characters.
Definition UtilsTypes.h:476
List< VariableRef * > VariableRefList
Array of variable references.
const char * dataTypeName(eDataType type)
Data type name.
Definition DataTypes.cc:72