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/StringBuilder.h"
20#include "arcane/utils/internal/ParameterCaseOption.h"
22#include "arcane/core/CaseOptionException.h"
23#include "arcane/core/CaseOptionBuildInfo.h"
24#include "arcane/core/XmlNodeList.h"
25#include "arcane/core/ICaseFunction.h"
26#include "arcane/core/ICaseMng.h"
27#include "arcane/core/ICaseDocument.h"
28#include "arcane/core/CaseNodeNames.h"
29#include "arcane/core/CaseOptionError.h"
30#include "arcane/core/IPhysicalUnitConverter.h"
31#include "arcane/core/IPhysicalUnitSystem.h"
32#include "arcane/core/IStandardFunction.h"
33#include "arcane/core/ICaseDocumentVisitor.h"
34#include "arcane/core/internal/StringVariableReplace.h"
35#include "arcane/core/internal/ICaseMngInternal.h"
46template<
typename T>
void
47_copyCaseOptionValue(T& out,
const T& in);
49template<>
void _copyCaseOptionValue(
String& out,
const String& in) { out = in; }
50template<>
void _copyCaseOptionValue(
bool& out,
const bool& in) { out = in; }
51template<>
void _copyCaseOptionValue(
Real& out,
const Real& in) { out = in; }
52template<>
void _copyCaseOptionValue(
Int16& out,
const Int16& in) { out = in; }
53template<>
void _copyCaseOptionValue(
Int32& out,
const Int32& in) { out = in; }
54template<>
void _copyCaseOptionValue(
Int64& out,
const Int64& in) { out = in; }
55template<>
void _copyCaseOptionValue(
Real2& out,
const Real2& in) { out = in; }
56template<>
void _copyCaseOptionValue(
Real3& out,
const Real3& in) { out = in; }
57template<>
void _copyCaseOptionValue(
Real2x2& out,
const Real2x2& in) { out = in; }
58template<>
void _copyCaseOptionValue(
Real3x3& out,
const Real3x3& in) { out = in; }
60template<
typename T>
void
66template<
typename T>
void
72template<
typename T>
void
84, m_is_optional(cob.isOptional())
85, m_has_valid_value(true)
93CaseOptionSimple(
const CaseOptionBuildInfo& cob,
const String& physical_unit)
95, m_is_optional(cob.isOptional())
96, m_has_valid_value(true)
97, m_default_physical_unit(physical_unit)
107 delete m_unit_converter;
113void CaseOptionSimple::
114_search(
bool is_phase1)
120 const String& velem_name = name();
121 XmlNodeList velems = rootElement().children(velem_name);
123 Integer nb_elem = velems.size();
124 ICaseDocumentFragment* doc = caseDocumentFragment();
128 CaseOptionError::addWarning(doc,A_FUNCINFO,velem.xpathFullName(),
129 String::format(
"Only one token of the element is allowed (nb_occur={0})",
136 const ParameterListWithCaseOption& params = caseMng()->_internalImpl()->parameters();
137 const ParameterCaseOption pco{ params.getParameterCaseOption(doc->language()) };
139 String reference_input = pco.getParameterOrNull(String::format(
"{0}/{1}", rootElement().xpathFullName(), velem_name), 1,
false);
140 if (!reference_input.null()) {
144 velem = rootElement().createElement(name());
146 velem.setValue(reference_input);
149 velem.setValue(StringVariableReplace::replaceWithCmdLineArgs(params, velem.value(),
true));
156 _searchFunction(velem);
158 String physical_unit = m_element.attrValue(
"unit");
159 if (!physical_unit.null()){
160 _setPhysicalUnit(physical_unit);
161 if (_allowPhysicalUnit()){
163 m_unit_converter = caseMng()->physicalUnitSystem()->createConverter(physical_unit,defaultPhysicalUnit());
166 CaseOptionError::addError(doc,A_FUNCINFO,velem.xpathFullName(),
167 String::format(
"Usage of a physic unit ('{0}') is not allowed for this kind of option",
175void CaseOptionSimple::
176_setPhysicalUnit(
const String& value)
178 m_physical_unit = value;
187 return m_physical_unit;
193void CaseOptionSimple::
200 String fname = caseDocumentFragment()->caseNodeNames()->function_ref;
202 if (func_name.
null())
208 msg->
pfatal() <<
"In element <" << velem.
name()
209 <<
">: no function named <" << func_name <<
">";
213 IStandardFunction* sf =
dynamic_cast<IStandardFunction*
>(func);
215 msg->
info() <<
"Use standard function: " << func_name;
216 m_standard_function = sf;
219 msg->
info() <<
"Use function: " << func_name;
227void CaseOptionSimple::
228_setChangedSinceLastIteration(
bool has_changed)
230 m_changed_since_last_iteration = has_changed;
236bool CaseOptionSimple::
237hasChangedSinceLastIteration()
const
239 return m_changed_since_last_iteration;
248 if (!m_element.null())
249 return m_element.xpathFullName();
258defaultPhysicalUnit()
const
260 return m_default_physical_unit;
266void CaseOptionSimple::
269 visitor->applyVisitor(
this);
287template<
typename DataType>
static void
290 ARCANE_UNUSED(converter);
291 ARCANE_UNUSED(
value);
304_checkPhysicalConvert(IPhysicalUnitConverter* converter,RealUniqueArray& values)
309 converter->convert(input_values,values);
313template<
typename DataType>
static bool
314_allowConvert(
const DataType& value)
316 ARCANE_UNUSED(value);
321_allowConvert(
const Real& value)
323 ARCANE_UNUSED(value);
328_allowConvert(
const RealUniqueArray& value)
330 ARCANE_UNUSED(value);
337template<
typename T> CaseOptionSimpleT<T>::
338CaseOptionSimpleT(
const CaseOptionBuildInfo& cob)
339: CaseOptionSimple(cob)
341 _copyCaseOptionValue(m_value,
Type());
351 _copyCaseOptionValue(m_value,
Type());
360 using Type =
typename CaseOptionTraitsT<T>::ContainerType;
361 return _allowConvert(Type());
370template<
typename Type>
374 static String collapse(
const String& str)
380class StringCollapser<
String>
383 static String collapse(
const String& str)
403 CaseOptionSimple::_search(is_phase1);
411 bool has_valid_value =
true;
419 has_valid_value =
false;
421 _setHasValidValue(has_valid_value);
422 if (has_valid_value){
424 str_val = StringCollapser<Type>::collapse(str_val);
425 bool is_bad = builtInGetValue(val,str_val);
449 if (_isInitialized())
465class FunctionConverterT
472 ARCANE_UNUSED(value);
478class FunctionConverterT<
Real>
481 void convert(ICaseFunction& tbl,
Real t,
Real& value)
482 { tbl.value(t,value); }
486class FunctionConverterT<
Real3>
489 void convert(ICaseFunction& tbl,
Real t,Real3& value)
490 { tbl.value(t,value); }
494class FunctionConverterT<bool>
497 void convert(ICaseFunction& tbl,
Real t,
bool& value)
498 { tbl.value(t,value); }
502class FunctionConverterT<
Integer>
505 void convert(ICaseFunction& tbl,
Real t,
Integer& value)
506 { tbl.value(t,value); }
510class FunctionConverterT<
String>
513 void convert(ICaseFunction& tbl,
Real t,String& value)
514 { tbl.value(t,value); }
520template<
typename ParamType,
typename ValueType>
521class ComputeFunctionValue
524 static void convert(ICaseFunction* func,ParamType t,ValueType& new_value)
526 FunctionConverterT<ValueType>().convert(*func,t,new_value);
539 Type new_value(m_value);
541 ComputeFunctionValue<Real,T>::convert(func,t,new_value);
554 Type new_value(m_value);
556 ComputeFunctionValue<Integer,T>::convert(func,t,new_value);
568 _checkIsInitialized();
572 Type new_value(m_value);
575 ComputeFunctionValue<Real,T>::convert(func,current_time,new_value);
578 ComputeFunctionValue<Integer,T>::convert(func,current_iteration,new_value);
584 this->_setChangedSinceLastIteration(m_value!=new_value);
586 msg->
debug() <<
"New value for option <" <<
name() <<
"> " << new_value;
587 _copyCaseOptionValue(m_value,new_value);
597 _checkIsInitialized();
619template<
typename T> CaseOptionMultiSimpleT<T>::
620CaseOptionMultiSimpleT(
const CaseOptionBuildInfo& cob,
622: CaseOptionMultiSimple(cob)
632 const T* avalue = m_view.
data();
642 using Type =
typename CaseOptionTraitsT<T>::ContainerType;
643 return _allowConvert(Type());
663 const ParameterListWithCaseOption& params =
caseMng()->_internalImpl()->parameters();
664 const ParameterCaseOption pco{ params.getParameterCaseOption(
caseDocumentFragment()->language()) };
669 pco.indexesInParam(full_xpath, option_in_param,
false);
672 Integer asize = elem_list.size();
676 if (asize == 0 && option_in_param.
empty() && is_optional) {
685 if (!option_in_param.
empty()) {
686 max_in_param = option_in_param[0];
687 for (
Integer index : option_in_param) {
688 if (index > max_in_param)
689 max_in_param = index;
691 if (max_occurs >= 0) {
692 if (max_in_param > max_occurs) {
693 StringBuilder msg =
"Bad number of occurences in command line (greater than max)";
694 msg +=
" index_max_in_param=";
696 msg +=
" max_occur=";
705 if (max_occurs >= 0) {
706 if (asize > max_occurs) {
707 StringBuilder msg =
"Bad number of occurences (greater than max)";
710 msg +=
" max_occur=";
720 Integer final_size = std::max(asize, std::max(min_occurs, max_in_param));
722 const Type* old_value = m_view.data();
724 using Type =
typename CaseOptionTraitsT<T>::ContainerType;
725 Type* ptr_value =
new Type[final_size];
736 for (
Integer i = 0; i < final_size; ++i) {
740 if (option_in_param.
contains(i + 1)) {
741 str_val = pco.getParameterOrNull(full_xpath, i + 1,
false);
745 else if (i < asize) {
748 str_val = velem.
value();
753 if (str_val.
null()) {
758 str_val = StringVariableReplace::replaceWithCmdLineArgs(params, str_val,
true);
767 str_val = StringCollapser<Type>::collapse(str_val);
768 bool is_bad = builtInGetValue(val, str_val);
774 _copyCaseOptionValue(ptr_value[i], val);
785 for(
Integer i=0; i<this->size(); ++i )
786 o << this->
_ptr()[i] <<
" ";
795 visitor->applyVisitor(
this);
805 ComputeFunctionValue<Real,String>::convert(func,t,v);
812String CaseOptionSimple::
813_convertFunctionIntegerToString(ICaseFunction* func,
Integer t)
816 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 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.