41 this =
this@models.muscle.AMuscleConfig;
58 m.ODESolver.RelTol= 1e-10;
59 m.ODESolver.AbsTol= 1e-10;
67 geo = fem.geometry.RegularHex8Grid([0 2],[0 1],[0 1]);
69 geo = fem.geometry.RegularHex8Grid([0:.5:1],[0:1:2],[0:.5:1]);
71 geo = geo.toCube27Node;
81 geo = this.
FEM.Geometry;
85 displ_dir(:,geo.Elements(1,geo.MasterFaces(1:2,:))) =
true;
87 displ_dir(:,geo.Elements(1:4,geo.MasterFaces(1,:))) =
true;
88 displ_dir(:,geo.Elements(5:8,geo.MasterFaces(2,:))) =
true;
105 a = models.muscle.tests.Activation(version);
108 f1 = m.getPositionDirichletBCFaceIdx(1,1);
109 f2 = m.getPositionDirichletBCFaceIdx(1,2);
110 m.setGaussIntegrationRule(4);
112 f1 = m.getPositionDirichletBCFaceIdx(1:4,1);
113 f2 = m.getPositionDirichletBCFaceIdx(5:8,2);
117 maxp = [1 rand(1,5)*10];
121 [
t,y] = m.simulate(mu);
122 pdf = m.getResidualForces(
t,y);
125 res = res &&
all(abs(sum(pdf)) < 1e-8);
127 force_l = sum(pdf(f1,end),1);
128 force_r = sum(pdf(f2,end),1);
129 fprintf(
" P_{max}=%g => Force left %gN, right %gN\n ",...
130 maxp(
k),force_l,force_r);
132 res = res && norm(version*maxp(
k)-force_l) < 1e-8;
function geo = getGeometry()
Single cube with same config as reference element.
function addOption(name, default, varargin)
function configureModel(m)
static function res = test_Activation()
Version 2 has 2mm^2 area,so double force is expected!
Tests the force generated by an isometrically fixed muscle.
function displ_dir = setPositionDirichletBC(displ_dir)
function anull = seta0(anull)