@@ -140,24 +140,21 @@ namespace mgis::behaviour {
140140 MaterialStateManager::~MaterialStateManager () = default ;
141141
142142 [[nodiscard]] static MaterialStateManager::FieldHolder& getFieldHolder (
143- std::map<std::string, MaterialStateManager::FieldHolder>& m,
143+ std::map<std::string, MaterialStateManager::FieldHolder, std::less<> >& m,
144144 const std::string_view& n) noexcept {
145- // #if __cplusplus > 201103L
146- // return m[n];
147- // #else /* __cplusplus > 201103L */
148145 return m[std::string{n}];
149- // #endif /* __cplusplus > 201103L */
150146 } // end of getFieldHolder
151147
152- static std::map<std::string,
153- MaterialStateManager::FieldHolder>::const_iterator
154- getFieldHolderIterator (
155- const std::map<std::string, MaterialStateManager::FieldHolder>& m,
156- const std::string_view& n) {
148+ static std::map<std::string, MaterialStateManager::FieldHolder, std::less<>>::
149+ const_iterator
150+ getFieldHolderIterator (const std::map<std::string,
151+ MaterialStateManager::FieldHolder,
152+ std::less<>>& m,
153+ const std::string_view& n) {
157154 // #if __cplusplus > 201103L
158155 // return m.find(n);
159156 // #else /* __cplusplus > 201103L */
160- return m.find (std::string{n} );
157+ return m.find (n );
161158 // #endif /* __cplusplus > 201103L */
162159 } // end of getFieldHolder
163160
@@ -259,6 +256,20 @@ namespace mgis::behaviour {
259256 return true ;
260257 } // end of setMaterialProperty
261258
259+ bool unsetMaterialProperty (Context& ctx,
260+ MaterialStateManager& m,
261+ const std::string_view& n) noexcept {
262+ const auto omp = getVariable (ctx, m.b .mps , n);
263+ if (isInvalid (omp)) {
264+ return false ;
265+ }
266+ auto p = m.material_properties .find (n);
267+ if (p != m.material_properties .end ()) {
268+ m.material_properties .erase (p);
269+ }
270+ return true ;
271+ } // end of unsetMaterialProperty
272+
262273 bool isMaterialPropertyDefined (const MaterialStateManager& m,
263274 const std::string_view& n) {
264275 const auto p = getFieldHolderIterator (m.material_properties , n);
@@ -326,17 +337,71 @@ namespace mgis::behaviour {
326337 .value = v, .shall_be_updated = (p == MaterialStateManager::UPDATE)};
327338 } // end of setExternalStateVariable
328339
329- MGIS_EXPORT void setExternalStateVariable (
340+ void setExternalStateVariable (MaterialStateManager& m,
341+ const std::string_view& n,
342+ const std::span<real>& v,
343+ const MaterialStateManager::StorageMode s,
344+ const MaterialStateManager::UpdatePolicy p) {
345+ const auto esv = getVariable (m.b .esvs , n);
346+ const auto vs = getVariableSize (esv, m.b .hypothesis );
347+ mgis::raise_if (((static_cast <mgis::size_type>(v.size ()) != m.n * vs) &&
348+ (static_cast <mgis::size_type>(v.size ()) != vs)),
349+ " setExternalStateVariable: invalid number of values" );
350+ if (s == MaterialStateManager::LOCAL_STORAGE) {
351+ if (v.size () == 1u ) {
352+ getFieldHolder (m.external_state_variables , n) =
353+ MaterialStateManager::FieldHolder{
354+ .value = v[0 ],
355+ .shall_be_updated = (p == MaterialStateManager::UPDATE)};
356+ } else {
357+ getFieldHolder (m.external_state_variables , n) =
358+ MaterialStateManager::FieldHolder{
359+ .value = std::vector<real>{v.begin (), v.end ()},
360+ .shall_be_updated = (p == MaterialStateManager::UPDATE)};
361+ }
362+ } else {
363+ getFieldHolder (m.external_state_variables ,
364+ n) = MaterialStateManager::FieldHolder{
365+ .value = v, .shall_be_updated = (p == MaterialStateManager::UPDATE)};
366+ }
367+ } // end of setExternalStateVariable
368+
369+ bool setExternalStateVariable (
370+ Context& ctx,
371+ MaterialStateManager& m,
372+ const std::string_view& n,
373+ const real v,
374+ const MaterialStateManager::UpdatePolicy p) noexcept {
375+ const auto oesv = getVariable (ctx, m.b .esvs , n);
376+ if (isInvalid (oesv)) {
377+ return false ;
378+ }
379+ if ((*oesv)->type != Variable::SCALAR){
380+ return ctx.registerErrorMessage (
381+ " setExternalStateVariable: "
382+ " invalid external state variable "
383+ " (only scalar external state variable is supported)" );
384+ }
385+ getFieldHolder (m.external_state_variables ,
386+ n) = MaterialStateManager::FieldHolder{
387+ .value = v, .shall_be_updated = (p == MaterialStateManager::UPDATE)};
388+ return true ;
389+ } // end of setExternalStateVariable
390+
391+ bool setExternalStateVariable (
392+ Context& ctx,
330393 MaterialStateManager& m,
331394 const std::string_view& n,
332395 const std::span<real>& v,
333396 const MaterialStateManager::StorageMode s,
334- const MaterialStateManager::UpdatePolicy p) {
397+ const MaterialStateManager::UpdatePolicy p) noexcept {
335398 const auto esv = getVariable (m.b .esvs , n);
336399 const auto vs = getVariableSize (esv, m.b .hypothesis );
337- mgis::raise_if (((static_cast <mgis::size_type>(v.size ()) != m.n * vs) &&
338- (static_cast <mgis::size_type>(v.size ()) != vs)),
339- " setExternalStateVariable: invalid number of values" );
400+ if (((static_cast <mgis::size_type>(v.size ()) != m.n * vs) &&
401+ (static_cast <mgis::size_type>(v.size ()) != vs))) {
402+ return ctx.registerErrorMessage (
403+ " setExternalStateVariable: invalid number of values" );
404+ }
340405 if (s == MaterialStateManager::LOCAL_STORAGE) {
341406 if (v.size () == 1u ) {
342407 getFieldHolder (m.external_state_variables , n) =
@@ -354,8 +419,23 @@ namespace mgis::behaviour {
354419 n) = MaterialStateManager::FieldHolder{
355420 .value = v, .shall_be_updated = (p == MaterialStateManager::UPDATE)};
356421 }
422+ return true ;
357423 } // end of setExternalStateVariable
358424
425+ bool unsetExternalStateVariable (Context& ctx,
426+ MaterialStateManager& m,
427+ const std::string_view& n) noexcept {
428+ const auto oesv = getVariable (ctx, m.b .esvs , n);
429+ if (isInvalid (oesv)) {
430+ return false ;
431+ }
432+ auto p = m.external_state_variables .find (n);
433+ if (p != m.external_state_variables .end ()) {
434+ m.external_state_variables .erase (p);
435+ }
436+ return true ;
437+ } // end of unsetExternalStateVariable
438+
359439 bool isExternalStateVariableDefined (const MaterialStateManager& m,
360440 const std::string_view& n) {
361441 const auto p = getFieldHolderIterator (m.external_state_variables , n);
@@ -440,8 +520,8 @@ namespace mgis::behaviour {
440520 }; // end of update_field_holder
441521 auto check_mps =
442522 [](const Behaviour& b,
443- const std::map<std::string, MaterialStateManager::FieldHolder>&
444- mps) {
523+ const std::map<std::string, MaterialStateManager::FieldHolder,
524+ std::less<>>& mps) {
445525 for (const auto & mp : mps) {
446526 auto find_mp = [&mp](const Variable& d) {
447527 return mp.first == d.name ;
@@ -941,4 +1021,4 @@ namespace mgis::behaviour {
9411021
9421022#endif /* MGIS_HAVE_HDF5 */
9431023
944- } // end of namespace mgis::behaviour
1024+ } // end of namespace mgis::behaviour
0 commit comments