14#include "arcane/CaseOptionSimple.h"
16#include "arcane/utils/ValueConvert.h"
17#include "arcane/utils/ITraceMng.h"
18#include "arcane/utils/FatalErrorException.h"
19#include "arcane/utils/ApplicationInfo.h"
20#include "arcane/utils/CommandLineArguments.h"
21#include "arcane/utils/ParameterCaseOption.h"
22#include "arcane/utils/StringBuilder.h"
24#include "arcane/core/IApplication.h"
25#include "arcane/core/CaseOptionException.h"
26#include "arcane/core/CaseOptionBuildInfo.h"
27#include "arcane/core/XmlNodeList.h"
28#include "arcane/core/ICaseFunction.h"
29#include "arcane/core/ICaseMng.h"
30#include "arcane/core/ICaseDocument.h"
31#include "arcane/core/CaseNodeNames.h"
32#include "arcane/core/CaseOptionError.h"
33#include "arcane/core/IPhysicalUnitConverter.h"
34#include "arcane/core/IPhysicalUnitSystem.h"
35#include "arcane/core/IStandardFunction.h"
36#include "arcane/core/ICaseDocumentVisitor.h"
37#include "arcane/core/internal/StringVariableReplace.h"
48template<
typename T>
void
49_copyCaseOptionValue(T& out,
const T& in);
51template<>
void _copyCaseOptionValue(
String& out,
const String& in) { out = in; }
52template<>
void _copyCaseOptionValue(
bool& out,
const bool& in) { out = in; }
53template<>
void _copyCaseOptionValue(
Real& out,
const Real& in) { out = in; }
54template<>
void _copyCaseOptionValue(
Int16& out,
const Int16& in) { out = in; }
55template<>
void _copyCaseOptionValue(
Int32& out,
const Int32& in) { out = in; }
56template<>
void _copyCaseOptionValue(
Int64& out,
const Int64& in) { out = in; }
57template<>
void _copyCaseOptionValue(
Real2& out,
const Real2& in) { out = in; }
58template<>
void _copyCaseOptionValue(
Real3& out,
const Real3& in) { out = in; }
59template<>
void _copyCaseOptionValue(
Real2x2& out,
const Real2x2& in) { out = in; }
60template<>
void _copyCaseOptionValue(
Real3x3& out,
const Real3x3& in) { out = in; }
62template<
typename T>
void
68template<
typename T>
void
74template<
typename T>
void
86, m_is_optional(cob.isOptional())
87, m_has_valid_value(true)
95CaseOptionSimple(
const CaseOptionBuildInfo& cob,
const String& physical_unit)
97, m_is_optional(cob.isOptional())
98, m_has_valid_value(true)
99, m_default_physical_unit(physical_unit)
109 delete m_unit_converter;
115void CaseOptionSimple::
116_search(
bool is_phase1)
122 const String& velem_name = name();
123 XmlNodeList velems = rootElement().children(velem_name);
125 Integer nb_elem = velems.size();
126 ICaseDocumentFragment* doc = caseDocumentFragment();
130 CaseOptionError::addWarning(doc,A_FUNCINFO,velem.xpathFullName(),
131 String::format(
"Only one token of the element is allowed (nb_occur={0})",
138 const ParameterList& params = caseMng()->application()->applicationInfo().commandLineArguments().parameters();
139 const ParameterCaseOption pco{ params.getParameterCaseOption(doc->language()) };
141 String reference_input = pco.getParameterOrNull(String::format(
"{0}/{1}", rootElement().xpathFullName(), velem_name), 1,
false);
142 if (!reference_input.null()) {
146 velem = rootElement().createElement(name());
148 velem.setValue(reference_input);
151 velem.setValue(StringVariableReplace::replaceWithCmdLineArgs(params, velem.value(),
true));
158 _searchFunction(velem);
160 String physical_unit = m_element.attrValue(
"unit");
161 if (!physical_unit.null()){
162 _setPhysicalUnit(physical_unit);
163 if (_allowPhysicalUnit()){
165 m_unit_converter = caseMng()->physicalUnitSystem()->createConverter(physical_unit,defaultPhysicalUnit());
168 CaseOptionError::addError(doc,A_FUNCINFO,velem.xpathFullName(),
169 String::format(
"Usage of a physic unit ('{0}') is not allowed for this kind of option",
177void CaseOptionSimple::
178_setPhysicalUnit(
const String& value)
180 m_physical_unit = value;
189 return m_physical_unit;
195void CaseOptionSimple::
202 String fname = caseDocumentFragment()->caseNodeNames()->function_ref;
204 if (func_name.
null())
210 msg->
pfatal() <<
"In element <" << velem.
name()
211 <<
">: no function named <" << func_name <<
">";
215 IStandardFunction* sf =
dynamic_cast<IStandardFunction*
>(func);
217 msg->
info() <<
"Use standard function: " << func_name;
218 m_standard_function = sf;
221 msg->
info() <<
"Use function: " << func_name;
229void CaseOptionSimple::
230_setChangedSinceLastIteration(
bool has_changed)
232 m_changed_since_last_iteration = has_changed;
238bool CaseOptionSimple::
239hasChangedSinceLastIteration()
const
241 return m_changed_since_last_iteration;
250 if (!m_element.null())
251 return m_element.xpathFullName();
260defaultPhysicalUnit()
const
262 return m_default_physical_unit;
268void CaseOptionSimple::
271 visitor->applyVisitor(
this);
289template<
typename DataType>
static void
292 ARCANE_UNUSED(converter);
293 ARCANE_UNUSED(
value);
306_checkPhysicalConvert(IPhysicalUnitConverter* converter,RealUniqueArray& values)
311 converter->convert(input_values,values);
315template<
typename DataType>
static bool
316_allowConvert(
const DataType& value)
318 ARCANE_UNUSED(value);
323_allowConvert(
const Real& value)
325 ARCANE_UNUSED(value);
330_allowConvert(
const RealUniqueArray& value)
332 ARCANE_UNUSED(value);
339template<
typename T> CaseOptionSimpleT<T>::
340CaseOptionSimpleT(
const CaseOptionBuildInfo& cob)
341: CaseOptionSimple(cob)
343 _copyCaseOptionValue(m_value,
Type());
353 _copyCaseOptionValue(m_value,
Type());
362 using Type =
typename CaseOptionTraitsT<T>::ContainerType;
363 return _allowConvert(Type());
372template<
typename Type>
376 static String collapse(
const String& str)
382class StringCollapser<
String>
385 static String collapse(
const String& str)
405 CaseOptionSimple::_search(is_phase1);
413 bool has_valid_value =
true;
421 has_valid_value =
false;
423 _setHasValidValue(has_valid_value);
424 if (has_valid_value){
426 str_val = StringCollapser<Type>::collapse(str_val);
427 bool is_bad = builtInGetValue(val,str_val);
451 if (_isInitialized())
467class FunctionConverterT
474 ARCANE_UNUSED(value);
480class FunctionConverterT<
Real>
483 void convert(ICaseFunction& tbl,
Real t,
Real& value)
484 { tbl.value(t,value); }
488class FunctionConverterT<
Real3>
491 void convert(ICaseFunction& tbl,
Real t,Real3& value)
492 { tbl.value(t,value); }
496class FunctionConverterT<bool>
499 void convert(ICaseFunction& tbl,
Real t,
bool& value)
500 { tbl.value(t,value); }
504class FunctionConverterT<
Integer>
507 void convert(ICaseFunction& tbl,
Real t,
Integer& value)
508 { tbl.value(t,value); }
512class FunctionConverterT<
String>
515 void convert(ICaseFunction& tbl,
Real t,String& value)
516 { tbl.value(t,value); }
522template<
typename ParamType,
typename ValueType>
523class ComputeFunctionValue
526 static void convert(ICaseFunction* func,ParamType t,ValueType& new_value)
528 FunctionConverterT<ValueType>().convert(*func,t,new_value);
541 Type new_value(m_value);
543 ComputeFunctionValue<Real,T>::convert(func,t,new_value);
556 Type new_value(m_value);
558 ComputeFunctionValue<Integer,T>::convert(func,t,new_value);
570 _checkIsInitialized();
574 Type new_value(m_value);
577 ComputeFunctionValue<Real,T>::convert(func,current_time,new_value);
580 ComputeFunctionValue<Integer,T>::convert(func,current_iteration,new_value);
586 this->_setChangedSinceLastIteration(m_value!=new_value);
588 msg->
debug() <<
"New value for option <" <<
name() <<
"> " << new_value;
589 _copyCaseOptionValue(m_value,new_value);
599 _checkIsInitialized();
621template<
typename T> CaseOptionMultiSimpleT<T>::
622CaseOptionMultiSimpleT(
const CaseOptionBuildInfo& cob,
624: CaseOptionMultiSimple(cob)
634 const T* avalue = m_view.
data();
644 using Type =
typename CaseOptionTraitsT<T>::ContainerType;
645 return _allowConvert(Type());
665 const ParameterList& params =
caseMng()->application()->applicationInfo().commandLineArguments().parameters();
671 pco.indexesInParam(full_xpath, option_in_param,
false);
674 Integer asize = elem_list.size();
678 if (asize == 0 && option_in_param.
empty() && is_optional) {
687 if (!option_in_param.
empty()) {
688 max_in_param = option_in_param[0];
689 for (
Integer index : option_in_param) {
690 if (index > max_in_param)
691 max_in_param = index;
693 if (max_occurs >= 0) {
694 if (max_in_param > max_occurs) {
695 StringBuilder msg =
"Bad number of occurences in command line (greater than max)";
696 msg +=
" index_max_in_param=";
698 msg +=
" max_occur=";
707 if (max_occurs >= 0) {
708 if (asize > max_occurs) {
709 StringBuilder msg =
"Bad number of occurences (greater than max)";
712 msg +=
" max_occur=";
722 Integer final_size = std::max(asize, std::max(min_occurs, max_in_param));
724 const Type* old_value = m_view.data();
726 using Type =
typename CaseOptionTraitsT<T>::ContainerType;
727 Type* ptr_value =
new Type[final_size];
738 for (
Integer i = 0; i < final_size; ++i) {
742 if (option_in_param.
contains(i + 1)) {
743 str_val = pco.getParameterOrNull(full_xpath, i + 1,
false);
747 else if (i < asize) {
750 str_val = velem.
value();
755 if (str_val.
null()) {
760 str_val = StringVariableReplace::replaceWithCmdLineArgs(params, str_val,
true);
769 str_val = StringCollapser<Type>::collapse(str_val);
770 bool is_bad = builtInGetValue(val, str_val);
776 _copyCaseOptionValue(ptr_value[i], val);
787 for(
Integer i=0; i<this->size(); ++i )
788 o << this->
_ptr()[i] <<
" ";
797 visitor->applyVisitor(
this);
807 ComputeFunctionValue<Real,String>::convert(func,t,v);
814String CaseOptionSimple::
815_convertFunctionIntegerToString(ICaseFunction* func,
Integer t)
818 ComputeFunctionValue<Integer,String>::convert(func,t,v);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
bool empty() const
Capacité (nombre d'éléments alloués) du vecteur.
bool contains(ConstReferenceType v) const
Vrai si le tableau contient l'élément de valeur v.
constexpr pointer _ptr() noexcept
Retourne un pointeur sur le tableau.
constexpr const_pointer data() const noexcept
Pointeur sur le début de la vue.
void _setArray(pointer v, Integer s) noexcept
Modifie le pointeur et la taille du tableau.
Classe de base des vecteurs 1D de données.
Classe de base d'une option du jeu de donnée.
String name() const
Retourne le nom de l'option correspondant au langage du jeu de données.
String _defaultValue() const
Retourne la valeur par défaut de l'option ou 0 s'il n'y en a pas.
ICaseMng * caseMng() const
Gestionnaire de cas.
ICaseDocumentFragment * caseDocumentFragment() const
Retourne le document associé à cette option.
bool isOptional() const
Permet de savoir si une option est optionnelle.
Integer maxOccurs() const
Nombre maximum d'occurences (pour une option multiple) (-1 == unbounded)
XmlNode rootElement() const
Retourne l'élément racine du DOM.
Integer minOccurs() const
Nombre minimum d'occurences (pour une option multiple)
static void addInvalidTypeError(ICaseDocumentFragment *document, const TraceInfo &where, const String &node_name, const XmlNode &parent, const String &value, const String &expected_type)
Erreur lorsqu'une valeur d'une jeu de données n'est pas du bon type. Cette erreur est collective.
static void addOptionNotFoundError(ICaseDocumentFragment *document, const TraceInfo &where, const String &node_name, const XmlNode &parent)
Erreur lorsqu'une option du jeu de données n'est pas trouvée. Cette erreur est collective.
Exception en rapport avec le jeu de données.
Option du jeu de données de type liste de types simples (réel, entier, booléen, .....
typename CaseOptionTraitsT< T >::ContainerType Type
Type de la valeur de l'option.
typename CaseOptionTraitsT< T >::ArrayViewType ArrayViewType
Type de la vue sur les valeurs de l'option.
void print(const String &lang, std::ostream &o) const override
Imprime la valeur de l'option dans le langage lang,sur le flot o.
void visit(ICaseDocumentVisitor *visitor) const override
Applique le visiteur sur cette option.
void _search(bool is_phase1) override
Cherche la valeur de l'option dans le jeu de donnée.
Option du jeu de données de type simple (réel, entier, booléen, ...)
virtual void _search(bool is_phase1)
Cherche la valeur de l'option dans le jeu de données.
Type valueAtParameter(Real t) const
Retourne la valeur de l'option pour le paramètre réel t.
CaseOptionTraitsT< T >::ContainerType Type
Type de l'option.
virtual void print(const String &lang, std::ostream &o) const
Imprime la valeur de l'option dans le langage lang,sur le flot o.
const Type & value() const
virtual void updateFromFunction(Real current_time, Integer current_iteration)
void setDefaultValue(const Type &def_value)
Positionne la valeur par défaut de l'option.
Classe de base des options simples (uniquement une valeur).
bool hasValidValue() const
Indique si l'option a une valeur invalide.
ICaseFunction * function() const override
Fonction associée à cette option (0 si aucune).
bool isOptional() const
Indique si l'option est facultative.
IPhysicalUnitConverter * physicalUnitConverter() const
Convertisseur d'unité physique.
bool isPresent() const
Retourne true si l'option est présente.
Interface du visiteur pour une option du jeu de données.
@ ParamUnknown
Type de paramètre inconnu.
@ ParamReal
Paramètre de type Real.
@ ParamInteger
Paramètre de type Integer.
virtual eParamType paramType() const =0
Type du paramètre de la fonction.
virtual Real convert(Real value)=0
Retourne la valeur convertie de value.
Interface du gestionnaire de traces.
virtual TraceMessage pfatal()=0
Flot pour un message d'erreur fatale parallèle.
virtual TraceMessage info()=0
Flot pour un message d'information.
virtual TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium)=0
Flot pour un message de debug.
Classe représentant l'ensemble des paramètres pouvant modifier les options du jeu de données.
ParameterCaseOption getParameterCaseOption(const String &language) const
Méthode permettant de récupérer un objet de type ParameterCaseOption.
Classe gérant un vecteur de réel de dimension 2.
Classe gérant une matrice de réel de dimension 2x2.
Classe gérant un vecteur de réel de dimension 3.
Classe gérant une matrice de réel de dimension 3x3.
Constructeur de chaîne de caractère unicode.
String toString() const
Retourne la chaîne de caractères construite.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
static String collapseWhiteSpace(const String &rhs)
Effectue une normalisation des caractères espaces.
Vecteur 1D de données avec sémantique par valeur (style STL).
Liste de noeuds d'un arbre DOM.
String attrValue(const String &name, bool throw_exception=false) const
Valeur de l'attribut name.
String value() const
Valeur du noeud.
bool null() const
Vrai si le noeud est nul.
String name() const
Nom du noeud.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
bool builtInPutValue(const String &v, String &s)
Converti la valeur v dans la chaîne s.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
UniqueArray< Real > RealUniqueArray
Tableau dynamique à une dimension de réels.
std::int16_t Int16
Type entier signé sur 16 bits.
double Real
Type représentant un réel.
std::int32_t Int32
Type entier signé sur 32 bits.