17 MooseEnum specialIC(
"none rock joint",
"none");
20 "For certain combinations of plastic models, the set of active " 21 "constraints can be initialized optimally. 'none': no special " 22 "initialization is performed. For all other choices, the " 23 "plastic_models must be chosen to have the following types. 'rock': " 24 "'TensileMulti MohrCoulombMulti'. 'joint': 'WeakPlaneTensile " 26 params.
addParam<std::vector<UserObjectName>>(
28 "List of names of user objects that define the plastic models that could " 29 "be active for this material. If no plastic_models are provided, only " 30 "elasticity will be used.");
31 params.
addClassDescription(
"RawComponentAssembler class to calculate yield functions, etc, used " 32 "in multi-surface finite-strain plasticity");
39 _params(moose_object->parameters()),
40 _num_models(_params.
get<
std::vector<UserObjectName>>(
"plastic_models").size()),
46 _f[
model] = &getUserObjectByName<SolidMechanicsPlasticModel>(
54 unsigned int surface = 0;
56 for (
unsigned model_surface = 0; model_surface <
_f[
model]->numberSurfaces(); ++model_surface)
68 for (
unsigned model_surface = 0; model_surface <
_f[
model]->numberSurfaces(); ++model_surface)
76 mooseError(
"Choosing specialIC=rock, you must have plasticity models of type 'TensileMulti " 77 "MohrCoulombMulti'\n");
78 if (!(
_f[0]->modelName().compare(
"TensileMulti") == 0 &&
79 _f[1]->modelName().compare(
"MohrCoulombMulti") == 0))
80 mooseError(
"Choosing specialIC=rock, you must have plasticity models of type 'TensileMulti " 81 "MohrCoulombMulti'\n");
86 mooseError(
"Choosing specialIC=joint, you must have plasticity models of type " 87 "'WeakPlaneTensile WeakPlaneShear'\n");
88 if (!(
_f[0]->modelName().compare(
"WeakPlaneTensile") == 0 &&
89 _f[1]->modelName().compare(
"WeakPlaneShear") == 0))
90 mooseError(
"Choosing specialIC=joint, you must have plasticity models of type " 91 "'WeakPlaneTensile WeakPlaneShear'\n");
97 const std::vector<Real> & intnl,
98 const std::vector<bool> & active,
99 std::vector<Real> &
f)
101 mooseAssert(intnl.size() ==
_num_models,
"Incorrect size of internal parameters");
102 mooseAssert(active.size() ==
_num_surfaces,
"Incorrect size of active");
105 std::vector<unsigned int> active_surfaces_of_model;
106 std::vector<unsigned int>::iterator active_surface;
107 std::vector<Real> model_f;
111 if (active_surfaces_of_model.size() > 0)
113 _f[
model]->yieldFunctionV(stress, intnl[
model], model_f);
114 for (active_surface = active_surfaces_of_model.begin();
115 active_surface != active_surfaces_of_model.end();
117 f.push_back(model_f[*active_surface]);
125 const std::vector<Real> & intnl,
126 const std::vector<bool> & active,
127 std::vector<RankTwoTensor> & df_dstress)
129 mooseAssert(intnl.size() ==
_num_models,
"Incorrect size of internal parameters");
130 mooseAssert(active.size() ==
_num_surfaces,
"Incorrect size of active");
132 df_dstress.resize(0);
133 std::vector<unsigned int> active_surfaces_of_model;
134 std::vector<unsigned int>::iterator active_surface;
135 std::vector<RankTwoTensor> model_df_dstress;
139 if (active_surfaces_of_model.size() > 0)
141 _f[
model]->dyieldFunction_dstressV(stress, intnl[
model], model_df_dstress);
142 for (active_surface = active_surfaces_of_model.begin();
143 active_surface != active_surfaces_of_model.end();
145 df_dstress.push_back(model_df_dstress[*active_surface]);
152 const std::vector<Real> & intnl,
153 const std::vector<bool> & active,
154 std::vector<Real> & df_dintnl)
156 mooseAssert(intnl.size() ==
_num_models,
"Incorrect size of internal parameters");
157 mooseAssert(active.size() ==
_num_surfaces,
"Incorrect size of active");
160 std::vector<unsigned int> active_surfaces_of_model;
161 std::vector<unsigned int>::iterator active_surface;
162 std::vector<Real> model_df_dintnl;
166 if (active_surfaces_of_model.size() > 0)
168 _f[
model]->dyieldFunction_dintnlV(stress, intnl[
model], model_df_dintnl);
169 for (active_surface = active_surfaces_of_model.begin();
170 active_surface != active_surfaces_of_model.end();
172 df_dintnl.push_back(model_df_dintnl[*active_surface]);
179 const std::vector<Real> & intnl,
180 const std::vector<bool> & active,
181 std::vector<RankTwoTensor> & r)
183 mooseAssert(intnl.size() ==
_num_models,
"Incorrect size of internal parameters");
184 mooseAssert(active.size() ==
_num_surfaces,
"Incorrect size of active");
187 std::vector<unsigned int> active_surfaces_of_model;
188 std::vector<unsigned int>::iterator active_surface;
189 std::vector<RankTwoTensor> model_r;
193 if (active_surfaces_of_model.size() > 0)
195 _f[
model]->flowPotentialV(stress, intnl[
model], model_r);
196 for (active_surface = active_surfaces_of_model.begin();
197 active_surface != active_surfaces_of_model.end();
199 r.push_back(model_r[*active_surface]);
207 const std::vector<Real> & intnl,
208 const std::vector<bool> & active,
209 std::vector<RankFourTensor> & dr_dstress)
211 mooseAssert(intnl.size() ==
_num_models,
"Incorrect size of internal parameters");
212 mooseAssert(active.size() ==
_num_surfaces,
"Incorrect size of active");
214 dr_dstress.resize(0);
215 std::vector<unsigned int> active_surfaces_of_model;
216 std::vector<unsigned int>::iterator active_surface;
217 std::vector<RankFourTensor> model_dr_dstress;
221 if (active_surfaces_of_model.size() > 0)
223 _f[
model]->dflowPotential_dstressV(stress, intnl[
model], model_dr_dstress);
224 for (active_surface = active_surfaces_of_model.begin();
225 active_surface != active_surfaces_of_model.end();
227 dr_dstress.push_back(model_dr_dstress[*active_surface]);
234 const std::vector<Real> & intnl,
235 const std::vector<bool> & active,
236 std::vector<RankTwoTensor> & dr_dintnl)
238 mooseAssert(intnl.size() ==
_num_models,
"Incorrect size of internal parameters");
239 mooseAssert(active.size() ==
_num_surfaces,
"Incorrect size of active");
242 std::vector<unsigned int> active_surfaces_of_model;
243 std::vector<unsigned int>::iterator active_surface;
244 std::vector<RankTwoTensor> model_dr_dintnl;
248 if (active_surfaces_of_model.size() > 0)
250 _f[
model]->dflowPotential_dintnlV(stress, intnl[
model], model_dr_dintnl);
251 for (active_surface = active_surfaces_of_model.begin();
252 active_surface != active_surfaces_of_model.end();
254 dr_dintnl.push_back(model_dr_dintnl[*active_surface]);
261 const std::vector<Real> & intnl,
262 const std::vector<bool> & active,
263 std::vector<Real> & h)
265 mooseAssert(intnl.size() ==
_num_models,
"Incorrect size of internal parameters");
266 mooseAssert(active.size() ==
_num_surfaces,
"Incorrect size of active");
269 std::vector<unsigned int> active_surfaces_of_model;
270 std::vector<unsigned int>::iterator active_surface;
271 std::vector<Real> model_h;
275 if (active_surfaces_of_model.size() > 0)
277 _f[
model]->hardPotentialV(stress, intnl[
model], model_h);
278 for (active_surface = active_surfaces_of_model.begin();
279 active_surface != active_surfaces_of_model.end();
281 h.push_back(model_h[*active_surface]);
289 const std::vector<Real> & intnl,
290 const std::vector<bool> & active,
291 std::vector<RankTwoTensor> & dh_dstress)
293 mooseAssert(intnl.size() ==
_num_models,
"Incorrect size of internal parameters");
294 mooseAssert(active.size() ==
_num_surfaces,
"Incorrect size of active");
296 dh_dstress.resize(0);
297 std::vector<unsigned int> active_surfaces_of_model;
298 std::vector<unsigned int>::iterator active_surface;
299 std::vector<RankTwoTensor> model_dh_dstress;
303 if (active_surfaces_of_model.size() > 0)
305 _f[
model]->dhardPotential_dstressV(stress, intnl[
model], model_dh_dstress);
306 for (active_surface = active_surfaces_of_model.begin();
307 active_surface != active_surfaces_of_model.end();
309 dh_dstress.push_back(model_dh_dstress[*active_surface]);
316 const std::vector<Real> & intnl,
317 const std::vector<bool> & active,
318 std::vector<Real> & dh_dintnl)
320 mooseAssert(intnl.size() ==
_num_models,
"Incorrect size of internal parameters");
321 mooseAssert(active.size() ==
_num_surfaces,
"Incorrect size of active");
324 std::vector<unsigned int> active_surfaces_of_model;
325 std::vector<unsigned int>::iterator active_surface;
326 std::vector<Real> model_dh_dintnl;
330 if (active_surfaces_of_model.size() > 0)
332 _f[
model]->dhardPotential_dintnlV(stress, intnl[
model], model_dh_dintnl);
333 for (active_surface = active_surfaces_of_model.begin();
334 active_surface != active_surfaces_of_model.end();
336 dh_dintnl.push_back(model_dh_dintnl[*active_surface]);
344 const std::vector<Real> & intnl,
346 std::vector<bool> & act)
349 "buildActiveConstraints called with f.size = " <<
f.size() <<
" while there are " 352 "buildActiveConstraints called with intnl.size = " 353 << intnl.size() <<
" while there are " <<
_num_models <<
" models");
365 std::vector<Real> model_f(0);
366 for (
unsigned model_surface = 0; model_surface <
_f[
model]->numberSurfaces(); ++model_surface)
367 model_f.push_back(
f[ind++]);
368 std::vector<bool> model_act;
371 model_f, stress, intnl[
model], Eijkl, model_act, returned_stress);
372 for (
unsigned model_surface = 0; model_surface <
_f[
model]->numberSurfaces(); ++model_surface)
373 act.push_back(model_act[model_surface]);
381 const std::vector<Real> & intnl,
383 std::vector<bool> & act)
385 act.assign(2,
false);
388 std::vector<bool> active_tensile;
389 std::vector<bool> active_shear;
390 std::vector<Real> f_single;
395 _f[0]->activeConstraints(f_single, stress, intnl[0], Eijkl, active_tensile, returned_stress);
396 _f[1]->yieldFunctionV(returned_stress, intnl[1], f_single);
397 if (f_single[0] <=
_f[1]->_f_tol)
399 act[0] = active_tensile[0];
404 f_single.assign(1, 0);
406 _f[1]->activeConstraints(f_single, stress, intnl[1], Eijkl, active_shear, returned_stress);
407 _f[0]->yieldFunctionV(returned_stress, intnl[0], f_single);
408 if (f_single[0] <=
_f[0]->_f_tol)
410 act[1] = active_shear[0];
415 act[0] = act[1] =
true;
422 const std::vector<Real> & intnl,
424 std::vector<bool> & act)
426 act.assign(9,
false);
429 std::vector<bool> active_tensile;
430 std::vector<bool> active_MC;
431 std::vector<Real> f_single;
438 _f[0]->activeConstraints(f_single, stress, intnl[0], Eijkl, active_tensile, returned_stress);
439 _f[1]->yieldFunctionV(returned_stress, intnl[1], f_single);
440 if (f_single[0] <=
_f[1]->_f_tol && f_single[1] <=
_f[1]->_f_tol &&
441 f_single[2] <=
_f[1]->_f_tol && f_single[3] <=
_f[1]->_f_tol &&
442 f_single[4] <=
_f[1]->_f_tol && f_single[5] <=
_f[1]->_f_tol)
444 act[0] = active_tensile[0];
445 act[1] = active_tensile[1];
446 act[2] = active_tensile[2];
451 f_single.assign(6, 0);
458 _f[1]->activeConstraints(f_single, stress, intnl[1], Eijkl, active_MC, returned_stress);
459 _f[0]->yieldFunctionV(returned_stress, intnl[0], f_single);
460 if (f_single[0] <=
_f[0]->_f_tol && f_single[1] <=
_f[0]->_f_tol && f_single[2] <=
_f[0]->_f_tol)
462 act[3] = active_MC[0];
463 act[4] = active_MC[1];
464 act[5] = active_MC[2];
465 act[6] = active_MC[3];
466 act[7] = active_MC[4];
467 act[8] = active_MC[5];
475 if (active_tensile[0] ==
false && active_tensile[1] ==
true && active_tensile[2] ==
true &&
476 active_MC[0] ==
true && active_MC[1] ==
true && active_MC[2] ==
false &&
477 active_MC[3] ==
true && active_MC[4] ==
false && active_MC[5] ==
false)
479 act[1] = act[2] = act[6] =
true;
483 if (active_tensile[0] ==
false && active_tensile[1] ==
true && active_tensile[2] ==
true &&
484 active_MC[0] ==
false && active_MC[1] ==
true && active_MC[2] ==
false &&
485 active_MC[3] ==
true && active_MC[4] ==
false && active_MC[5] ==
true)
487 act[1] = act[2] = act[6] =
true;
492 if (active_tensile[0] ==
false && active_tensile[1] ==
true && active_tensile[2] ==
true &&
493 active_MC[0] ==
false && active_MC[1] ==
true && active_MC[2] ==
false &&
494 active_MC[3] ==
true && active_MC[4] ==
false && active_MC[5] ==
false)
496 act[1] = act[2] = act[4] = act[6] =
true;
499 if (active_tensile[0] ==
false && active_tensile[1] ==
true && active_tensile[2] ==
true &&
500 active_MC[0] ==
false && active_MC[1] ==
false && active_MC[2] ==
false &&
501 active_MC[3] ==
true && active_MC[4] ==
false && active_MC[5] ==
true)
503 act[1] = act[2] = act[4] = act[6] =
true;
508 if (active_tensile[0] ==
false && active_tensile[1] ==
true && active_tensile[2] ==
true &&
509 active_MC[0] ==
false && active_MC[1] ==
false && active_MC[2] ==
false &&
510 active_MC[3] ==
true && active_MC[4] ==
false && active_MC[5] ==
false)
512 act[1] = act[2] = act[6] =
true;
517 if (active_tensile[0] ==
false && active_tensile[1] ==
false && active_tensile[2] ==
true &&
518 active_MC[0] ==
true && active_MC[1] ==
true && active_MC[2] ==
false &&
519 active_MC[3] ==
true && active_MC[4] ==
false && active_MC[5] ==
false)
521 act[2] = act[6] =
true;
526 if (active_tensile[0] ==
false && active_tensile[1] ==
false && active_tensile[2] ==
true &&
527 active_MC[0] ==
false && active_MC[1] ==
true && active_MC[2] ==
false &&
528 active_MC[3] ==
true && active_MC[4] ==
false && active_MC[5] ==
true)
530 act[2] = act[6] =
true;
536 if (active_tensile[0] ==
false && active_tensile[1] ==
false && active_tensile[2] ==
true &&
537 active_MC[0] ==
false && active_MC[1] ==
false && active_MC[2] ==
false &&
538 active_MC[3] ==
true && active_MC[4] ==
false && active_MC[5] ==
false)
540 act[1] = act[2] = act[6] =
true;
546 act[3] = active_MC[0];
547 act[4] = active_MC[1];
548 act[5] = active_MC[2];
549 act[6] = active_MC[3];
550 act[7] = active_MC[4];
551 act[8] = active_MC[5];
598 const std::vector<Real> & intnl_old,
600 Real ep_plastic_tolerance,
602 std::vector<Real> & intnl,
603 std::vector<Real> & pm,
604 std::vector<Real> & cumulative_pm,
606 std::vector<Real> & yf,
607 unsigned & num_successful_plastic_returns,
608 unsigned & custom_model)
611 "returnMapAll: Incorrect size of internal parameters");
612 mooseAssert(intnl.size() ==
_num_models,
"returnMapAll: Incorrect size of internal parameters");
613 mooseAssert(pm.size() ==
_num_surfaces,
"returnMapAll: Incorrect size of pm");
615 num_successful_plastic_returns = 0;
622 std::vector<Real> model_f;
624 std::vector<Real> model_pm;
625 bool trial_stress_inadmissible;
626 bool successful_return =
true;
627 unsigned the_single_plastic_model = 0;
628 bool using_custom_return_map =
true;
637 if (using_custom_return_map)
640 bool model_returned =
_f[
model]->returnMap(trial_stress,
643 ep_plastic_tolerance,
649 trial_stress_inadmissible);
650 if (!trial_stress_inadmissible)
654 for (
unsigned model_surface = 0; model_surface <
_f[
model]->numberSurfaces();
656 yf.push_back(model_f[model_surface]);
658 else if (trial_stress_inadmissible && !model_returned)
665 for (
unsigned model_surface = 0; model_surface <
_f[
model]->numberSurfaces();
667 yf.push_back(model_f[model_surface]);
670 using_custom_return_map =
false;
671 successful_return =
false;
679 if (trial_stress_inadmissible)
680 num_successful_plastic_returns++;
681 the_single_plastic_model =
model;
682 stress = returned_stress;
699 _f[
model]->yieldFunctionV(trial_stress, intnl_old[
model], model_f);
700 for (
unsigned model_surface = 0; model_surface <
_f[
model]->numberSurfaces(); ++model_surface)
701 yf.push_back(model_f[model_surface]);
705 if (num_successful_plastic_returns == 0)
711 stress = trial_stress;
714 return successful_return;
721 std::vector<Real> yf_at_returned_stress(0);
722 bool all_admissible =
true;
725 if (
model == the_single_plastic_model)
728 for (
unsigned model_surface = 0; model_surface <
_f[
model]->numberSurfaces(); ++model_surface)
729 yf_at_returned_stress.push_back(model_f[model_surface]);
732 _f[
model]->yieldFunctionV(stress, intnl_old[
model], model_f);
733 for (
unsigned model_surface = 0; model_surface <
_f[
model]->numberSurfaces(); ++model_surface)
735 if (model_f[model_surface] >
_f[
model]->_f_tol)
737 all_admissible =
false;
738 yf_at_returned_stress.push_back(model_f[model_surface]);
750 stress = trial_stress;
756 _f[
model]->yieldFunctionV(trial_stress, intnl[
model], model_f);
757 for (
unsigned model_surface = 0; model_surface <
_f[
model]->numberSurfaces(); ++model_surface)
758 yf.push_back(model_f[model_surface]);
760 num_successful_plastic_returns = 0;
768 for (
unsigned surface = 0; surface < yf_at_returned_stress.size(); ++surface)
769 yf.push_back(yf_at_returned_stress[surface]);
770 delta_dp = model_delta_dp;
771 for (
unsigned model_surface = 0; model_surface <
_f[the_single_plastic_model]->numberSurfaces();
775 model_pm[model_surface];
778 custom_model = the_single_plastic_model;
791 for (
unsigned model_surface = 0; model_surface <
_f[
model]->numberSurfaces(); ++model_surface)
799 const std::vector<bool> & active,
800 std::vector<unsigned int> & active_surfaces)
802 active_surfaces.resize(0);
803 for (
unsigned model_surface = 0; model_surface <
_f[
model]->numberSurfaces(); ++model_surface)
811 const std::vector<bool> & active,
812 std::vector<unsigned int> & active_surfaces_of_model)
814 active_surfaces_of_model.resize(0);
815 for (
unsigned model_surface = 0; model_surface <
_f[
model]->numberSurfaces(); ++model_surface)
817 active_surfaces_of_model.push_back(model_surface);
std::vector< std::vector< unsigned int > > _surfaces_given_model
_surfaces_given_model[model_number] = vector of surface numbers for this model
void activeModelSurfaces(int model, const std::vector< bool > &active, std::vector< unsigned int > &active_surfaces_of_model)
Returns the internal surface number(s) of the active surfaces of the given model This may be of size=...
std::vector< unsigned int > _model_surface_given_surface
given a surface number, this returns the corresponding-model's internal surface number ...
virtual void dyieldFunction_dstress(const RankTwoTensor &stress, const std::vector< Real > &intnl, const std::vector< bool > &active, std::vector< RankTwoTensor > &df_dstress)
The derivative of the active yield function(s) with respect to stress.
MooseEnum _specialIC
Allows initial set of active constraints to be chosen optimally.
unsigned int modelNumber(unsigned int surface)
returns the model number, given the surface number
void mooseError(Args &&... args)
virtual void buildActiveConstraints(const std::vector< Real > &f, const RankTwoTensor &stress, const std::vector< Real > &intnl, const RankFourTensor &Eijkl, std::vector< bool > &act)
Constructs a set of active constraints, given the yield functions, f.
virtual void dhardPotential_dintnl(const RankTwoTensor &stress, const std::vector< Real > &intnl, const std::vector< bool > &active, std::vector< Real > &dh_dintnl)
The derivative of the active hardening potentials with respect to the active internal parameters...
bool returnMapAll(const RankTwoTensor &trial_stress, const std::vector< Real > &intnl_old, const RankFourTensor &E_ijkl, Real ep_plastic_tolerance, RankTwoTensor &stress, std::vector< Real > &intnl, std::vector< Real > &pm, std::vector< Real > &cumulative_pm, RankTwoTensor &delta_dp, std::vector< Real > &yf, unsigned &num_successful_plastic_returns, unsigned &custom_model)
Performs a returnMap for each plastic model using their inbuilt returnMap functions.
std::vector< unsigned int > _model_given_surface
given a surface number, this returns the model number
const InputParameters & _params
virtual void yieldFunction(const RankTwoTensor &stress, const std::vector< Real > &intnl, const std::vector< bool > &active, std::vector< Real > &f)
The active yield function(s)
static InputParameters validParams()
virtual void dhardPotential_dstress(const RankTwoTensor &stress, const std::vector< Real > &intnl, const std::vector< bool > &active, std::vector< RankTwoTensor > &dh_dstress)
The derivative of the active hardening potentials with respect to stress By assumption in the Userobj...
void buildActiveConstraintsRock(const std::vector< Real > &f, const RankTwoTensor &stress, const std::vector< Real > &intnl, const RankFourTensor &Eijkl, std::vector< bool > &act)
"Rock" version Constructs a set of active constraints, given the yield functions, f...
void buildActiveConstraintsJoint(const std::vector< Real > &f, const RankTwoTensor &stress, const std::vector< Real > &intnl, const RankFourTensor &Eijkl, std::vector< bool > &act)
"Joint" version Constructs a set of active constraints, given the yield functions, f.
unsigned int _num_surfaces
Number of surfaces within the plastic models.
Real f(Real x)
Test function for Brents method.
void assign(const TypeTensor< T2 > &)
virtual void dflowPotential_dintnl(const RankTwoTensor &stress, const std::vector< Real > &intnl, const std::vector< bool > &active, std::vector< RankTwoTensor > &dr_dintnl)
The derivative of the active flow potentials with respect to the active internal parameters The UserO...
bool anyActiveSurfaces(int model, const std::vector< bool > &active)
returns true if any internal surfaces of the given model are active according to 'active' ...
virtual void flowPotential(const RankTwoTensor &stress, const std::vector< Real > &intnl, const std::vector< bool > &active, std::vector< RankTwoTensor > &r)
The active flow potential(s) - one for each yield function.
const PertinentGeochemicalSystem model(database, {"H2O", "H+", "HCO3-", "O2(aq)", "Ca++", ">(s)FeOH", "radius_neg1", "radius_neg1.5"}, {"Calcite"}, {}, {"Calcite_asdf"}, {"CH4(aq)"}, {">(s)FeOCa+"}, "O2(aq)", "e-")
unsigned int _num_models
Number of plastic models for this material.
MultiPlasticityRawComponentAssembler(const MooseObject *moose_object)
virtual void dflowPotential_dstress(const RankTwoTensor &stress, const std::vector< Real > &intnl, const std::vector< bool > &active, std::vector< RankFourTensor > &dr_dstress)
The derivative of the active flow potential(s) with respect to stress.
virtual void hardPotential(const RankTwoTensor &stress, const std::vector< Real > &intnl, const std::vector< bool > &active, std::vector< Real > &h)
The active hardening potentials (one for each internal parameter and for each yield function) by assu...
virtual void dyieldFunction_dintnl(const RankTwoTensor &stress, const std::vector< Real > &intnl, const std::vector< bool > &active, std::vector< Real > &df_dintnl)
The derivative of active yield function(s) with respect to their internal parameters (the user object...
const Elem & get(const ElemType type_in)
std::vector< const SolidMechanicsPlasticModel * > _f
User objects that define the yield functions, flow potentials, etc.
void activeSurfaces(int model, const std::vector< bool > &active, std::vector< unsigned int > &active_surfaces)
Returns the external surface number(s) of the active surfaces of the given model This may be of size=...