Skip to content

Commit 376702c

Browse files
authored
Merge pull request #175 from solidsgroup/docs-update
Docs update
2 parents 4a6def4 + 1b6def4 commit 376702c

File tree

7 files changed

+193
-65
lines changed

7 files changed

+193
-65
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,4 @@ report.tar.gz
5959
alamo.egg-info
6060
alamo
6161
setup.py
62-
62+
alamo.py

src/BC/Operator/Elastic/Expression.H

Lines changed: 134 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -401,60 +401,150 @@ public:
401401
bcmap["trac"] = Type::Traction;
402402
bcmap["periodic"] = Type::Periodic;
403403

404-
std::vector<std::string> str;
404+
std::vector<std::string> type, val;
405405

406-
// TYPES
407-
408-
#if AMREX_SPACEDIM==3
409-
if (pp.contains("type.xloylozlo")) { pp_queryarr("type.xloylozlo",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::XLO_YLO_ZLO][i] = bcmap[str[i]]; } // 3D Corner
410-
if (pp.contains("type.xloylozhi")) { pp_queryarr("type.xloylozhi",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::XLO_YLO_ZHI][i] = bcmap[str[i]]; } // 3D Corner
411-
if (pp.contains("type.xloyhizlo")) { pp_queryarr("type.xloyhizlo",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::XLO_YHI_ZLO][i] = bcmap[str[i]]; } // 3D Corner
412-
if (pp.contains("type.xloyhizhi")) { pp_queryarr("type.xloyhizhi",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::XLO_YHI_ZHI][i] = bcmap[str[i]]; } // 3D Corner
413-
if (pp.contains("type.xhiylozlo")) { pp_queryarr("type.xhiylozlo",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::XHI_YLO_ZLO][i] = bcmap[str[i]]; } // 3D Corner
414-
if (pp.contains("type.xhiylozhi")) { pp_queryarr("type.xhiylozhi",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::XHI_YLO_ZHI][i] = bcmap[str[i]]; } // 3D Corner
415-
if (pp.contains("type.xhiyhizlo")) { pp_queryarr("type.xhiyhizlo",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::XHI_YHI_ZLO][i] = bcmap[str[i]]; } // 3D Corner
416-
if (pp.contains("type.xhiyhizhi")) { pp_queryarr("type.xhiyhizhi",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::XHI_YHI_ZHI][i] = bcmap[str[i]]; } // 3D Corner
417-
#endif
406+
//
407+
// Lambda to parse the type and val strings, and initialize parser.
408+
//
418409

419-
#if AMREX_SPACEDIM==3
420-
if (pp.contains("type.ylozlo")) { pp_queryarr("type.ylozlo",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::YLO_ZLO][i] = bcmap[str[i]]; } // 3D Edge
421-
if (pp.contains("type.ylozhi")) { pp_queryarr("type.ylozhi",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::YLO_ZHI][i] = bcmap[str[i]]; } // 3D Edge
422-
if (pp.contains("type.yhizlo")) { pp_queryarr("type.yhizlo",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::YHI_ZLO][i] = bcmap[str[i]]; } // 3D Edge
423-
if (pp.contains("type.yhizhi")) { pp_queryarr("type.yhizhi",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::YHI_ZHI][i] = bcmap[str[i]]; } // 3D Edge
424-
if (pp.contains("type.zloxlo")) { pp_queryarr("type.zloxlo",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::ZLO_XLO][i] = bcmap[str[i]]; } // 3D Edge
425-
if (pp.contains("type.zloxhi")) { pp_queryarr("type.zloxhi",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::ZLO_XHI][i] = bcmap[str[i]]; } // 3D Edge
426-
if (pp.contains("type.zhixlo")) { pp_queryarr("type.zhixlo",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::ZHI_XLO][i] = bcmap[str[i]]; } // 3D Edge
427-
if (pp.contains("type.zhixhi")) { pp_queryarr("type.zhixhi",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::ZHI_XHI][i] = bcmap[str[i]]; } // 3D Edge
428-
#endif
429-
if (pp.contains("type.xloylo")) { pp_queryarr("type.xloylo",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::XLO_YLO][i] = bcmap[str[i]]; } // 3D Edge / 2D Corner
430-
if (pp.contains("type.xloyhi")) { pp_queryarr("type.xloyhi",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::XLO_YHI][i] = bcmap[str[i]]; } // 3D Edge / 2D Corner
431-
if (pp.contains("type.xhiylo")) { pp_queryarr("type.xhiylo",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::XHI_YLO][i] = bcmap[str[i]]; } // 3D Edge / 2D Corner
432-
if (pp.contains("type.xhiyhi")) { pp_queryarr("type.xhiyhi",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::XHI_YHI][i] = bcmap[str[i]]; } // 3D Edge / 2D Corner
433-
434-
if (pp.contains("type.xlo")) { pp_queryarr("type.xlo",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::XLO][i] = bcmap[str[i]]; } // 3D Face 2D Edge
435-
if (pp.contains("type.xhi")) { pp_queryarr("type.xhi",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::XHI][i] = bcmap[str[i]]; } // 3D Face 2D Edge
436-
if (pp.contains("type.ylo")) { pp_queryarr("type.ylo",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::YLO][i] = bcmap[str[i]]; } // 3D Face 2D Edge
437-
if (pp.contains("type.yhi")) { pp_queryarr("type.yhi",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::YHI][i] = bcmap[str[i]]; } // 3D Face 2D Edge
438-
#if AMREX_SPACEDIM==3
439-
if (pp.contains("type.zlo")) { pp_queryarr("type.zlo",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::ZLO][i] = bcmap[str[i]]; } // 3D Face
440-
if (pp.contains("type.zhi")) { pp_queryarr("type.zhi",str); for (int i = 0; i < AMREX_SPACEDIM; i++) value.m_bc_type[Face::ZHI][i] = bcmap[str[i]]; } // 3D Face
441-
#endif
410+
auto set = [&] (std::vector<std::string> type, std::vector<std::string> val, Face face)
411+
{
412+
if (type.size() == 1)
413+
type.resize(AMREX_SPACEDIM,type[0]);
414+
else if (type.size() < AMREX_SPACEDIM)
415+
Util::Abort(INFO,"Invalid number of types specified for ", facestr[face]);
442416

443-
// VALS
417+
if (val.size() == 1)
418+
val.resize(AMREX_SPACEDIM,val[0]);
419+
else if (val.size() < AMREX_SPACEDIM)
420+
Util::Abort(INFO,"Invalid number of vals specified for ", facestr[face]);
444421

445-
for (int face = 0; face != Face::INT; face++)
446-
{
447-
std::vector<std::string> val(AMREX_SPACEDIM,"0.0");
448-
val.resize(AMREX_SPACEDIM,"0.0");
449-
std::string querystr = std::string("val.") + std::string(facestr[face]);
450-
pp_queryarr(querystr.c_str(),val);
451422
for (int i = 0 ; i < AMREX_SPACEDIM; i++)
452423
{
424+
// set enums to appropriate type
425+
value.m_bc_type[face][i] = bcmap[type[i]];
426+
427+
// initialize the parser
453428
value.m_bc_func_parser[face][i] = amrex::Parser(val[i].c_str());
454429
value.m_bc_func_parser[face][i].registerVariables({"x","y","z","t"});
455430
value.m_bc_func[face][i] = value.m_bc_func_parser[face][i].compile<4>();
456431
}
457-
}
432+
};
433+
434+
pp_queryarr_default("type.xlo",type, "disp"); // 3D Face / 2D Edge type
435+
pp_queryarr_default("val.xlo", val , "0.0"); // 3D Face / 2D Edge value
436+
set(type,val,Face::XLO);
437+
438+
pp_queryarr_default("type.xhi",type, "disp"); // 3D Face / 2D Edge type
439+
pp_queryarr_default("val.xhi" ,val , "0.0"); // 3D Face / 2D Edge value
440+
set(type,val,Face::XHI);
441+
442+
pp_queryarr_default("type.ylo",type, "disp"); // 3D Face / 2D Edge type
443+
pp_queryarr_default("val.ylo" ,val , "0.0"); // 3D Face / 2D Edge value
444+
set(type,val,Face::YLO);
445+
446+
pp_queryarr_default("type.yhi",type, "disp"); // 3D Face / 2D Edge type
447+
pp_queryarr_default("val.yhi", val , "0.0"); // 3D Face / 2D Edge value
448+
set(type,val,Face::YHI);
449+
450+
#if AMREX_SPACEDIM==3
451+
pp_queryarr_default("type.zlo",type, "disp"); // 3D Face type
452+
pp_queryarr_default("val.zlo", val , "0.0"); // 3D Face value
453+
set(type,val,Face::ZLO);
454+
455+
pp_queryarr_default("type.zhi",type, "disp"); // 3D Face type
456+
pp_queryarr_default("val.zhi", val , "0.0"); // 3D Face value
457+
set(type,val,Face::ZHI);
458+
#endif
459+
460+
461+
pp.queryarr_default("type.xloylo",type, "disp"); // 3D Edge / 2D Corner type
462+
pp.queryarr_default("val.xloylo", val , "0.0"); // 3D Edge / 2D Corner value
463+
set(type,val,Face::XLO_YLO);
464+
465+
pp_queryarr_default("type.xloyhi",type, "disp"); // 3D Edge / 2D Corner type
466+
pp_queryarr_default("val.xloyhi", val , "0.0"); // 3D Edge / 2D Corner value
467+
set(type,val,Face::XLO_YHI);
468+
469+
pp_queryarr_default("type.xhiylo",type, "disp"); // 3D Edge / 2D Corner type
470+
pp_queryarr_default("val.xhiylo", val , "0.0"); // 3D Edge / 2D Corner value
471+
set(type,val,Face::XHI_YLO);
472+
473+
pp_queryarr_default("type.xhiyhi",type, "disp"); // 3D Edge / 2D Corner type
474+
pp_queryarr_default("val.xhiyhi", val , "0.0"); // 3D Edge / 2D Corner value
475+
set(type,val,Face::XHI_YHI);
476+
477+
#if AMREX_SPACEDIM==3
478+
pp_queryarr_default("type.xloylozlo",type,"disp"); // 3D Corner type
479+
pp_queryarr_default("val.xloylozlo",val,"0.0"); // 3D Corner value
480+
set(type,val,Face::XLO_YLO_ZLO);
481+
482+
pp_queryarr_default("type.xloylozhi",type, "disp"); // 3D Corner type
483+
pp_queryarr_default("val.xloylozhi", val , "0.0"); // 3D Corner value
484+
set(type,val,Face::XLO_YLO_ZHI);
485+
486+
pp_queryarr_default("type.xloyhizlo",type, "disp"); // 3D Corner type
487+
pp_queryarr_default("val.xloyhizlo", val , "0.0"); // 3D Corner value
488+
set(type,val,Face::XLO_YHI_ZLO);
489+
490+
pp_queryarr_default("type.xloyhizhi",type, "disp"); // 3D Corner type
491+
pp_queryarr_default("val.xloyhizhi", val , "0.0"); // 3D Corner value
492+
set(type,val,Face::XLO_YHI_ZHI);
493+
494+
pp_queryarr_default("type.xhiylozlo",type, "disp"); // 3D Corner type
495+
pp_queryarr_default("val.xhiylozlo", val , "0.0"); // 3D Corner value
496+
set(type,val,Face::XHI_YLO_ZLO);
497+
498+
pp_queryarr_default("type.xhiylozhi",type, "disp"); // 3D Corner type
499+
pp_queryarr_default("val.xhiylozhi", val , "0.0"); // 3D Corner value
500+
set(type,val,Face::XHI_YLO_ZHI);
501+
502+
pp_queryarr_default("type.xhiyhizlo",type, "disp"); // 3D Corner type
503+
pp_queryarr_default("val.xhiyhizlo", val , "0.0"); // 3D Corner value
504+
set(type,val,Face::XHI_YHI_ZLO);
505+
506+
pp_queryarr_default("type.xhiyhizhi",type, "disp"); // 3D Corner type
507+
pp_queryarr_default("val.xhiyhizhi", val , "0.0"); // 3D Corner value
508+
set(type,val,Face::XHI_YHI_ZHI);
509+
510+
pp_queryarr_default("type.ylozlo",type, "disp"); // 3D Edge type
511+
pp_queryarr_default("val.ylozlo", val , "0.0"); // 3D Edge value
512+
set(type,val,Face::YLO_ZLO);
513+
514+
pp_queryarr_default("type.ylozhi",type, "disp"); // 3D Edge type
515+
pp_queryarr_default("val.ylozhi", val , "0.0"); // 3D Edge value
516+
set(type,val,Face::YLO_ZHI);
517+
518+
pp_queryarr_default("type.yhizlo",type, "disp"); // 3D Edge type
519+
pp_queryarr_default("val.yhizlo", val , "0.0"); // 3D Edge value
520+
set(type,val,Face::YHI_ZLO);
521+
522+
pp_queryarr_default("type.yhizhi",type, "disp"); // 3D Edge type
523+
pp_queryarr_default("val.yhizhi", val , "0.0"); // 3D Edge value
524+
set(type,val,Face::YHI_ZHI);
525+
526+
pp_queryarr_default("type.zloxlo",type, "disp"); // 3D Edge type
527+
pp_queryarr_default("val.zloxlo", val , "0.0"); // 3D Edge value
528+
set(type,val,Face::ZLO_XLO);
529+
530+
pp_queryarr_default("type.zloxhi",type, "disp"); // 3D Edge type
531+
pp_queryarr_default("val.zloxhi", val , "0.0"); // 3D Edge value
532+
set(type,val,Face::ZLO_XHI);
533+
534+
pp_queryarr_default("type.zhixlo",type, "disp"); // 3D Edge type
535+
pp_queryarr_default("val.zhixlo", val , "0.0"); // 3D Edge value
536+
set(type,val,Face::ZHI_XLO);
537+
538+
pp_queryarr_default("type.zhixhi",type, "disp"); // 3D Edge type
539+
pp_queryarr_default("val.zhixhi", val , "0.0"); // 3D Edge value
540+
set(type,val,Face::ZHI_XHI);
541+
#endif
542+
543+
544+
545+
546+
547+
458548

459549
#if AMREX_SPACEDIM==2
460550
// We may wish to use an input file that has 3D BC inputs

src/IO/ParmParse.H

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
#include <list>
9393

9494
#include "Util/Util.H"
95-
#include "Set/Set.H"
95+
#include "Set/Base.H"
9696
#include "AMReX_ParmParse.H"
9797

9898

@@ -455,6 +455,26 @@ public:
455455
return -1;
456456
}
457457

458+
int queryarr_default( std::string name, Set::Matrix & value, Set::Matrix defaultvalue,
459+
std::string file = "", std::string func= "", int line = -1)
460+
{
461+
try
462+
{
463+
if (!contains(name.c_str()))
464+
{
465+
add(name.c_str(),Util::String::Join(defaultvalue));
466+
value = defaultvalue;
467+
return 0;
468+
}
469+
return queryarr(name.c_str(),value, file, func, line);
470+
}
471+
catch (...)
472+
{
473+
Util::ParmParseException(INFO,file,func,line,full(name));
474+
}
475+
return -1;
476+
}
477+
458478

459479
template <typename T>
460480
int

src/Model/Solid/Finite/NeoHookeanPredeformed.H

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,15 @@ public:
6161
else if (pp.contains("F0"))
6262
{
6363
Set::Matrix F0;
64-
pp_queryarr("F0", F0); // Large-deformation eigendeformation (Identity = no deformation)
64+
// Large-deformation eigendeformation (Identity = no deformation)
65+
pp_queryarr_default("F0", F0, Set::Matrix::Identity());
6566
value.F0 = F0;
6667
}
6768
else if (pp.contains("eps0"))
6869
{
6970
Set::Matrix eps0;
70-
pp_queryarr("eps0",eps0); // Small-deformation eigendeformation (Zero = no deformation)
71+
// Small-deformation eigendeformation (Zero = no deformation)
72+
pp_queryarr_default("eps0",eps0, Set::Matrix::Zero());
7173
value.F0 = eps0 + Set::Matrix::Identity();
7274
}
7375
else

src/Set/Base.H

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ bool operator == (const Quaternion a, const Quaternion b)
114114
}
115115

116116

117-
static Scalar Garbage = NAN;
117+
[[maybe_unused]] static Scalar Garbage = NAN;
118118

119119
AMREX_FORCE_INLINE
120120
Vector Position(const int &i, const int &j, const int &k, const amrex::Geometry &geom, const amrex::IndexType &ixType)

src/Util/String.H

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include <string>
1111

12+
#include "AMReX_Config.H"
1213
#include "Set/Base.H"
1314
#include "Util/Util.H"
1415

@@ -18,7 +19,7 @@ namespace Util
1819
/// \brief A collection of string operations
1920
namespace String
2021
{
21-
AMREX_ATTRIBUTE_WEAK AMREX_FORCE_INLINE
22+
AMREX_FORCE_INLINE
2223
int ReplaceAll(std::string &str, const std::string before, const std::string after)
2324
{
2425
size_t start_pos = 0;
@@ -29,7 +30,7 @@ int ReplaceAll(std::string &str, const std::string before, const std::string aft
2930
return 0;
3031
}
3132

32-
AMREX_ATTRIBUTE_WEAK AMREX_FORCE_INLINE
33+
AMREX_FORCE_INLINE
3334
int ReplaceAll(std::string &str, const char before, const std::string after)
3435
{
3536
size_t start_pos = 0;
@@ -40,7 +41,7 @@ int ReplaceAll(std::string &str, const char before, const std::string after)
4041
return 0;
4142
}
4243

43-
AMREX_ATTRIBUTE_WEAK AMREX_FORCE_INLINE
44+
AMREX_FORCE_INLINE
4445
std::string Wrap(std::string text, unsigned per_line)
4546
{
4647
unsigned line_begin = 0;
@@ -78,7 +79,7 @@ std::string Wrap(std::string text, unsigned per_line)
7879
return text;
7980
}
8081

81-
AMREX_ATTRIBUTE_WEAK AMREX_FORCE_INLINE
82+
AMREX_FORCE_INLINE
8283
std::string Join(const std::vector<std::string> & vec, char separator = '_')
8384
{
8485
std::ostringstream oss;
@@ -91,8 +92,8 @@ std::string Join(const std::vector<std::string> & vec, char separator = '_')
9192
return oss.str();
9293
}
9394

94-
AMREX_ATTRIBUTE_WEAK AMREX_FORCE_INLINE
95-
std::string Join(const Set::Vector & vec, char separator = '_')
95+
AMREX_FORCE_INLINE
96+
std::string Join(const Set::Vector & vec, char separator = ' ')
9697
{
9798
std::ostringstream oss;
9899
for (unsigned int i = 0; i < vec.size(); ++i) {
@@ -104,7 +105,22 @@ std::string Join(const Set::Vector & vec, char separator = '_')
104105
return oss.str();
105106
}
106107

107-
AMREX_ATTRIBUTE_WEAK AMREX_FORCE_INLINE
108+
AMREX_FORCE_INLINE
109+
std::string Join(const Set::Matrix & vec, char separator = ' ')
110+
{
111+
std::ostringstream oss;
112+
for (unsigned int i = 0; i < AMREX_SPACEDIM; ++i) {
113+
for (unsigned int j = 0; j < AMREX_SPACEDIM; ++j) {
114+
oss << vec(i,j);
115+
if (i < AMREX_SPACEDIM - 1 && j < AMREX_SPACEDIM - 1 ) { // Don't add separator after the last element
116+
oss << separator;
117+
}
118+
}
119+
}
120+
return oss.str();
121+
}
122+
123+
AMREX_FORCE_INLINE
108124
std::vector<std::string> Split(std::string &str, const char delim = ' ')
109125
{
110126
std::vector<std::string> ret;
@@ -116,19 +132,19 @@ std::vector<std::string> Split(std::string &str, const char delim = ' ')
116132
return ret;
117133
}
118134

119-
AMREX_ATTRIBUTE_WEAK AMREX_FORCE_INLINE
135+
AMREX_FORCE_INLINE
120136
bool Contains(std::string &str, const std::string find)
121137
{
122138
if (str.find(find) != std::string::npos) return true;
123139
else return false;
124140
}
125141

126142
template<class T>
127-
AMREX_ATTRIBUTE_WEAK AMREX_FORCE_INLINE
143+
AMREX_FORCE_INLINE
128144
T Parse(std::string);
129145

130146
template<>
131-
AMREX_ATTRIBUTE_WEAK AMREX_FORCE_INLINE
147+
AMREX_FORCE_INLINE
132148
std::complex<int> Parse(std::string input)
133149
{
134150
int re=0, im=0;

tests/DynamicBar/input

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
#@ exe=mechanics
44
#@ dim=2
55
#@ check-file = reference/pressure-profile-2d.dat
6-
#@ args = bc.expression.val.xlo = "1.0*(t<4)" "0"
7-
#@ args = bc.expression.val.xloylo = "1.0*(t<4)" "0"
8-
#@ args = bc.expression.val.xloyhi = "1.0*(t<4)" "0"
6+
#@ args = bc.expression.val.xlo = "1.0*(t<4)" "0" "0"
7+
#@ args = bc.expression.val.xloylo = "1.0*(t<4)" "0" "0"
8+
#@ args = bc.expression.val.xloyhi = "1.0*(t<4)" "0" "0"
99
#@
1010
#@ [pressure-profile-3d]
1111
#@ exe=mechanics
1212
#@ dim=3
1313
#@ check-file = reference/pressure-profile-3d.dat
14-
#@ args = bc.expression.val.xlo = "1.0*(t<4)" "0"
15-
#@ args = bc.expression.val.xloylo = "1.0*(t<4)" "0"
16-
#@ args = bc.expression.val.xloyhi = "1.0*(t<4)" "0"
14+
#@ args = bc.expression.val.xlo = "1.0*(t<4)" "0" "0"
15+
#@ args = bc.expression.val.xloylo = "1.0*(t<4)" "0" "0"
16+
#@ args = bc.expression.val.xloyhi = "1.0*(t<4)" "0" "0"
1717
#@
1818
#@ [flyer-plate-impact-2d]
1919
#@ exe=mechanics

0 commit comments

Comments
 (0)