Skip to content

Commit 4c43dd9

Browse files
committed
add the unsetMaterialProperty and unsetExternalStateVariable function. Small API break du to adding std::less<> to the definition of the maps that stores field holders
1 parent 989dc8e commit 4c43dd9

3 files changed

Lines changed: 175 additions & 39 deletions

File tree

include/MGIS/Behaviour/MaterialStateManager.hxx

Lines changed: 74 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ namespace mgis::behaviour {
165165
* (std::span<mgis::real>
166166
* case).
167167
*/
168-
std::map<std::string, FieldHolder> material_properties;
168+
std::map<std::string, FieldHolder, std::less<>> material_properties;
169169
/*! \brief mass density
170170
* The mass density can be uniform or not.
171171
* In the non uniform case, the data can be hold by the structure
@@ -190,7 +190,7 @@ namespace mgis::behaviour {
190190
* (std::span<mgis::real>
191191
* case).
192192
*/
193-
std::map<std::string, FieldHolder> external_state_variables;
193+
std::map<std::string, FieldHolder, std::less<>> external_state_variables;
194194
//! \brief number of integration points
195195
const size_type n;
196196
//! underlying behaviour
@@ -219,7 +219,7 @@ namespace mgis::behaviour {
219219

220220
/*!
221221
* \brief set the given material property
222-
* \param[out] m: material data manager
222+
* \param[out] m: material state manager
223223
* \param[in] n: name
224224
* \param[in] v: value
225225
* \param[in] p: update policy
@@ -231,7 +231,7 @@ namespace mgis::behaviour {
231231
const MaterialStateManager::UpdatePolicy = MaterialStateManager::UPDATE);
232232
/*!
233233
* \brief set the given material property
234-
* \param[out] m: material data manager
234+
* \param[out] m: material state manager
235235
* \param[in] n: name
236236
* \param[in] v: values
237237
* \param[in] s: storage mode
@@ -246,7 +246,9 @@ namespace mgis::behaviour {
246246
const MaterialStateManager::UpdatePolicy = MaterialStateManager::UPDATE);
247247
/*!
248248
* \brief set the given material property
249-
* \param[out] m: material data manager
249+
*
250+
* \param[in, out] ctx: execution context
251+
* \param[out] m: material state manager
250252
* \param[in] n: name
251253
* \param[in] v: value
252254
* \param[in] p: update policy
@@ -260,7 +262,9 @@ namespace mgis::behaviour {
260262
MaterialStateManager::UPDATE) noexcept;
261263
/*!
262264
* \brief set the given material property
263-
* \param[out] m: material data manager
265+
*
266+
* \param[in, out] ctx: execution context
267+
* \param[out] m: material state manager
264268
* \param[in] n: name
265269
* \param[in] v: values
266270
* \param[in] s: storage mode
@@ -275,25 +279,33 @@ namespace mgis::behaviour {
275279
MaterialStateManager::LOCAL_STORAGE,
276280
const MaterialStateManager::UpdatePolicy =
277281
MaterialStateManager::UPDATE) noexcept;
282+
/*!
283+
* \brief remove the field holder associated with the given material property,
284+
* if defined
285+
*
286+
* \param[in, out] ctx: execution context
287+
* \param[out] m: material state manager
288+
* \param[in] n: name
289+
*/
290+
MGIS_EXPORT [[nodiscard]] bool unsetMaterialProperty(
291+
Context&, MaterialStateManager&, const std::string_view&) noexcept;
278292
/*!
279293
* \return true if the given external state variable is defined.
280-
* \param[out] m: material data manager
294+
* \param[out] m: material state manager
281295
* \param[in] n: name
282-
* \param[in] v: values
283-
* \param[in] s: storage mode
284296
*/
285297
MGIS_EXPORT bool isMaterialPropertyDefined(const MaterialStateManager&,
286298
const std::string_view&);
287299
/*!
288300
* \brief chek if the given material property is uniform
289-
* \param[out] m: material data manager
301+
* \param[out] m: material state manager
290302
* \param[in] n: name
291303
*/
292304
MGIS_EXPORT bool isMaterialPropertyUniform(const MaterialStateManager&,
293305
const std::string_view&);
294306
/*!
295307
* \brief set the mass density
296-
* \param[out] m: material data manager
308+
* \param[out] m: material state manager
297309
* \param[in] v: value
298310
* \param[in] p: update policy
299311
*/
@@ -303,7 +315,7 @@ namespace mgis::behaviour {
303315
const MaterialStateManager::UpdatePolicy = MaterialStateManager::UPDATE);
304316
/*!
305317
* \brief set the mass density
306-
* \param[out] m: material data manager
318+
* \param[out] m: material state manager
307319
* \param[in] v: values
308320
* \param[in] s: storage mode
309321
* \param[in] p: update policy
@@ -316,17 +328,17 @@ namespace mgis::behaviour {
316328
const MaterialStateManager::UpdatePolicy = MaterialStateManager::UPDATE);
317329
/*!
318330
* \return true if the given external state variable is defined.
319-
* \param[out] m: material data manager
331+
* \param[out] m: material state manager
320332
*/
321333
MGIS_EXPORT bool isMassDensityDefined(const MaterialStateManager&);
322334
/*!
323335
* \return true if the mass density is uniform
324-
* \param[out] m: material data manager
336+
* \param[out] m: material state manager
325337
*/
326338
MGIS_EXPORT bool isMassDensityUniform(const MaterialStateManager&);
327339
/*!
328340
* \brief set the given external state variable
329-
* \param[out] m: material data manager
341+
* \param[out] m: material state manager
330342
* \param[in] n: name
331343
* \param[in] v: value
332344
* \param[in] p: update policy
@@ -338,7 +350,7 @@ namespace mgis::behaviour {
338350
const MaterialStateManager::UpdatePolicy = MaterialStateManager::UPDATE);
339351
/*!
340352
* \brief set the given external state variable
341-
* \param[out] m: material data manager
353+
* \param[out] m: material state manager
342354
* \param[in] n: name
343355
* \param[in] v: values
344356
* \param[in] s: storage mode
@@ -352,17 +364,60 @@ namespace mgis::behaviour {
352364
MaterialStateManager::LOCAL_STORAGE,
353365
const MaterialStateManager::UpdatePolicy = MaterialStateManager::UPDATE);
354366
/*!
355-
* \return true if the given external state variable is defined.
356-
* \param[out] m: material data manager
367+
* \brief set the given external state variable
368+
*
369+
* \param[in, out] ctx: execution context
370+
* \param[out] m: material state manager
371+
* \param[in] n: name
372+
* \param[in] v: value
373+
* \param[in] p: update policy
374+
*/
375+
MGIS_EXPORT [[nodiscard]] bool setExternalStateVariable(
376+
Context&,
377+
MaterialStateManager&,
378+
const std::string_view&,
379+
const real,
380+
const MaterialStateManager::UpdatePolicy =
381+
MaterialStateManager::UPDATE) noexcept;
382+
/*!
383+
* \brief set the given external state variable
384+
*
385+
* \param[in, out] ctx: execution context
386+
* \param[out] m: material state manager
357387
* \param[in] n: name
358388
* \param[in] v: values
359389
* \param[in] s: storage mode
390+
* \param[in] p: update policy
391+
*/
392+
MGIS_EXPORT [[nodiscard]] bool setExternalStateVariable(
393+
Context&,
394+
MaterialStateManager&,
395+
const std::string_view&,
396+
const std::span<mgis::real>&,
397+
const MaterialStateManager::StorageMode =
398+
MaterialStateManager::LOCAL_STORAGE,
399+
const MaterialStateManager::UpdatePolicy =
400+
MaterialStateManager::UPDATE) noexcept;
401+
/*!
402+
* \brief remove the field holder associated with the given external state
403+
* variable, if defined
404+
*
405+
* \param[in, out] ctx: execution context
406+
* \param[out] m: material state manager
407+
* \param[in] n: name
408+
*/
409+
MGIS_EXPORT [[nodiscard]] bool unsetExternalStateVariable(
410+
Context&, MaterialStateManager&, const std::string_view&) noexcept;
411+
/*!
412+
* \return true if the given external state variable is defined.
413+
* \param[out] m: material state manager
414+
* \param[in] n: name
360415
*/
361416
MGIS_EXPORT bool isExternalStateVariableDefined(const MaterialStateManager&,
362417
const std::string_view&);
363418
/*!
364419
* \return true if the given external state variable is uniform.
365-
* \param[out] m: material data manager
420+
* \param[out] m: material state manager
366421
* \param[in] n: name
367422
*/
368423
MGIS_EXPORT bool isExternalStateVariableUniform(const MaterialStateManager&,

src/Integrate.cxx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ namespace mgis::behaviour::internals {
5656
*/
5757
static std::vector<Evaluator> buildEvaluators(
5858
std::vector<real>& v,
59-
std::map<std::string, MaterialStateManager::FieldHolder>& values,
59+
std::map<std::string, MaterialStateManager::FieldHolder, std::less<>>&
60+
values,
6061
const MaterialDataManager& m,
6162
const std::vector<Variable>& ds) {
6263
mgis::raise_if(v.size() != getArraySize(ds, m.b.hypothesis),

src/MaterialStateManager.cxx

Lines changed: 99 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)