use of artisynth.core.femmodels.FemNode in project artisynth_core by artisynth.
the class MFreeFactory method cloneFem.
public static MFreeModel3d cloneFem(MFreeModel3d model, FemModel3d fem) {
if (model == null) {
model = new MFreeModel3d();
}
HashMap<FemNode3d, MFreeNode3d> nodeMap = new HashMap<FemNode3d, MFreeNode3d>();
HashMap<MFreeNode3d, FemNode3d> nodeMapInv = new HashMap<MFreeNode3d, FemNode3d>();
ArrayList<MFreeNode3d> nodeList = new ArrayList<MFreeNode3d>();
// duplicate nodes
for (FemNode3d node : fem.getNodes()) {
MFreeNode3d mnode = new MFreeNode3d(node.getRestPosition());
// explicit node masses
mnode.setMassExplicit(true);
mnode.setMass(node.getMass());
MFreeNode3d[] deps = new MFreeNode3d[1];
deps[0] = mnode;
VectorNd coords = new VectorNd(new double[] { 1 });
mnode.setDependentNodes(deps, coords);
nodeMap.put(node, mnode);
nodeMapInv.put(mnode, node);
nodeList.add(mnode);
}
// convert surface mesh
FemMeshComp surfaceFem = fem.getSurfaceMeshComp();
PolygonalMesh mesh = (PolygonalMesh) surfaceFem.getMesh();
// build mesh
PolygonalMesh mesh2 = mesh.copy();
// index vertices
int idx = 0;
for (Vertex3d vtx : mesh.getVertices()) {
vtx.setIndex(idx++);
}
idx = 0;
for (Vertex3d vtx : mesh2.getVertices()) {
vtx.setIndex(idx++);
}
MFreeMeshComp surfaceMFree = new MFreeMeshComp(model, "surface");
surfaceMFree.setMesh(mesh2);
// manually build surface attachments
for (Vertex3d vtx : mesh.getVertices()) {
PointAttachment pa = surfaceFem.getAttachment(vtx.getIndex());
if (pa instanceof PointFem3dAttachment) {
PointFem3dAttachment pfa = (PointFem3dAttachment) pa;
FemNode[] masters = pfa.getNodes();
MFreeNode3d[] deps = new MFreeNode3d[masters.length];
VectorNd coords = new VectorNd(masters.length);
for (int j = 0; j < masters.length; j++) {
// mlist.add (new ContactMaster (masters[j], pfa.getCoordinate(j)));
deps[j] = nodeMap.get(masters[j]);
coords.set(j, pfa.getCoordinate(j));
}
surfaceMFree.setVertexAttachment(vtx.getIndex(), coords.getBuffer(), deps);
} else {
PointParticleAttachment ppa = (PointParticleAttachment) pa;
DynamicComponent[] masters = ppa.getMasters();
MFreeNode3d[] deps = new MFreeNode3d[1];
deps[0] = nodeMap.get(masters[0]);
VectorNd coords = new VectorNd(new double[] { 1 });
surfaceMFree.setVertexAttachment(vtx.getIndex(), coords.getBuffer(), deps);
}
}
// integration regions by copying elements
ArrayList<MFreeElement3d> elemList = new ArrayList<MFreeElement3d>(fem.numElements());
HashMap<FemElement3d, MFreeElement3d> elemMap = new HashMap<FemElement3d, MFreeElement3d>(fem.numElements());
for (FemElement3d elem : fem.getElements()) {
MFreeNode3d[] elemNodes = new MFreeNode3d[elem.numNodes()];
FemNode3d[] fnodes = elem.getNodes();
for (int i = 0; i < elem.numNodes(); i++) {
elemNodes[i] = nodeMap.get(fnodes[i]);
}
MFreeElement3d region = new MFreeElement3d(null, elemNodes);
// region.setAllTermsActive(true);
MFreeIntegrationPoint3d[] mpnts = new MFreeIntegrationPoint3d[elem.numIntegrationPoints()];
IntegrationData3d[] mdata = new IntegrationData3d[elem.numIntegrationPoints()];
IntegrationPoint3d[] ipnts = elem.getIntegrationPoints();
IntegrationData3d[] idata = elem.getIntegrationData();
for (int i = 0; i < ipnts.length; i++) {
Point3d pos = new Point3d();
ipnts[i].computePosition(pos, elem.getNodes());
Vector3d[] gradU = ipnts[i].getGNs();
ArrayList<Vector3d> grads = new ArrayList<Vector3d>();
for (Vector3d g : gradU) {
grads.add(g);
}
MFreeIntegrationPoint3d mpnt = MFreeIntegrationPoint3d.create(elemNodes, ipnts[i].getShapeWeights(), grads, ipnts[i].getWeight());
IntegrationData3d mdat = new IntegrationData3d();
mdat.setRestInverseJacobian(idata[i].getInvJ0(), idata[i].getDetJ0());
mpnts[i] = mpnt;
mdata[i] = mdat;
}
// set warping point
if (region.getWarpingPoint() == null) {
IntegrationPoint3d wpnt = elem.getWarpingPoint();
IntegrationData3d wdat = elem.getWarpingData();
Point3d pos = new Point3d();
wpnt.computePosition(pos, elem.getNodes());
// Vector3d [] gradU = wpnt.updateShapeGradient(wdat.getInvJ0());
Vector3d[] gradU = wpnt.getGNs();
ArrayList<Vector3d> grads = new ArrayList<Vector3d>();
for (Vector3d g : gradU) {
grads.add(g);
}
// MFreeIntegrationPoint3d mpnt =
// MFreeIntegrationPoint3d.create(pos, deps,
// wpnt.getShapeWeights(), grads, wpnt.getWeight()*wdat.getDetJ0());
MFreeIntegrationPoint3d mpnt = MFreeIntegrationPoint3d.create(elemNodes, wpnt.getShapeWeights(), grads, wpnt.getWeight());
region.setWarpingPoint(mpnt);
IntegrationData3d wdata = new IntegrationData3d();
wdata.setRestInverseJacobian(wdat.getInvJ0(), wdat.getDetJ0());
region.setWarpingPoint(mpnt, wdata);
}
region.setIntegrationPoints(mpnts, mdata);
elemList.add(region);
elemMap.put(elem, region);
}
// add everything to model
model.addNodes(nodeList);
model.addElements(elemList);
model.setSurfaceMeshComp(surfaceMFree);
// copy properties
model.setDensity(fem.getDensity());
model.setParticleDamping(fem.getParticleDamping());
model.setStiffnessDamping(fem.getStiffnessDamping());
// copy over all masses
for (FemNode3d node : fem.getNodes()) {
nodeMap.get(node).setMass(node.getMass());
}
for (FemElement3d elem : fem.getElements()) {
elemMap.get(elem).setMass(elem.getMass());
}
model.setMaterial(fem.getMaterial());
return model;
}
use of artisynth.core.femmodels.FemNode in project artisynth_core by artisynth.
the class MFreeMeshComp method buildNodeVertexMap.
protected void buildNodeVertexMap() {
myNodeVertexMap = new HashMap<MFreeNode3d, Vertex3d>();
myNumSingleAttachments = 0;
for (int i = 0; i < myVertexAttachments.size(); i++) {
PointAttachment pa = myVertexAttachments.get(i);
if (pa instanceof PointParticleAttachment) {
MFreeNode3d node = (MFreeNode3d) ((PointParticleAttachment) pa).getParticle();
myNodeVertexMap.put(node, getMesh().getVertex(i));
myNumSingleAttachments++;
} else if (pa instanceof PointFem3dAttachment) {
PointFem3dAttachment pfa = (PointFem3dAttachment) pa;
for (FemNode node : pfa.getNodes()) {
if (myNodeVertexMap.get(node) == null) {
myNodeVertexMap.put((MFreeNode3d) node, NO_SINGLE_VERTEX);
}
}
}
}
}
use of artisynth.core.femmodels.FemNode in project artisynth_core by artisynth.
the class MFreeMeshComp method addVertexNodes.
private void addVertexNodes(HashSet<MFreeNode3d> nodes, Vertex3d vtx) {
PointAttachment pa = getAttachment(vtx.getIndex());
if (pa instanceof PointFem3dAttachment) {
PointFem3dAttachment pfa = (PointFem3dAttachment) pa;
FemNode[] masters = pfa.getNodes();
for (int j = 0; j < masters.length; j++) {
nodes.add((MFreeNode3d) masters[j]);
}
} else {
PointParticleAttachment ppa = (PointParticleAttachment) pa;
nodes.add((MFreeNode3d) ppa.getParticle());
}
}
use of artisynth.core.femmodels.FemNode in project artisynth_core by artisynth.
the class MFreeMeshComp method updateVertexColors.
protected void updateVertexColors() {
if (mySurfaceRendering != SurfaceRender.Stress && mySurfaceRendering != SurfaceRender.Strain) {
return;
}
if (myStressPlotRanging == Ranging.Auto) {
myStressPlotRange.merge(myModel.getNodalPlotRange(mySurfaceRendering));
}
RenderProps rprops = getRenderProps();
float alpha = (float) rprops.getAlpha();
MeshBase mesh = getMesh();
double sval = 0;
for (int i = 0; i < myVertexAttachments.size(); i++) {
PointAttachment attacher = myVertexAttachments.get(i);
sval = 0;
if (attacher instanceof PointFem3dAttachment) {
PointFem3dAttachment pfa = (PointFem3dAttachment) attacher;
FemNode[] nodes = pfa.getNodes();
VectorNd weights = pfa.getCoordinates();
for (int j = 0; j < nodes.length; j++) {
if (nodes[j] instanceof MFreeNode3d) {
// paranoid!
MFreeNode3d node = (MFreeNode3d) nodes[j];
double w = weights.get(j);
if (mySurfaceRendering == SurfaceRender.Strain) {
sval += w * node.getVonMisesStrain();
} else if (mySurfaceRendering == SurfaceRender.Stress) {
sval += w * node.getVonMisesStress();
}
}
}
} else if (attacher instanceof PointParticleAttachment) {
PointParticleAttachment ppa = (PointParticleAttachment) attacher;
MFreeNode3d node = (MFreeNode3d) ppa.getParticle();
if (mySurfaceRendering == SurfaceRender.Strain) {
sval = node.getVonMisesStrain();
} else if (mySurfaceRendering == SurfaceRender.Stress) {
sval = node.getVonMisesStress();
}
}
double smin = myStressPlotRange.getLowerBound();
double srng = myStressPlotRange.getRange();
double c = (sval - smin) / srng;
c = Math.max(0, Math.min(c, 1.0));
myColorMap.getRGB(c, colorArray);
mesh.setColor(i, colorArray[0], colorArray[1], colorArray[2], alpha);
}
}
use of artisynth.core.femmodels.FemNode in project artisynth_core by artisynth.
the class MFreeMeshComp method postscanItem.
protected boolean postscanItem(Deque<ScanToken> tokens, CompositeComponent ancestor) throws IOException {
if (postscanAttributeName(tokens, "fem")) {
myModel = postscanReference(tokens, MFreeModel3d.class, ancestor);
return true;
} else if (postscanAttributeName(tokens, "attachments")) {
for (int i = 0; i < myVertexAttachments.size(); i++) {
PointAttachment va = myVertexAttachments.get(i);
FemNode[] nodes = ScanWriteUtils.postscanReferences(tokens, FemNode.class, ancestor);
if (va instanceof PointParticleAttachment) {
PointParticleAttachment ppa = (PointParticleAttachment) va;
ppa.setParticle(nodes[0]);
} else if (va instanceof PointFem3dAttachment) {
PointFem3dAttachment pfa = (PointFem3dAttachment) va;
double[] coords = (double[]) tokens.poll().value();
pfa.setFromNodes(nodes, coords);
}
}
buildNodeVertexMap();
return true;
}
return super.postscanItem(tokens, ancestor);
}
Aggregations