public static double[] bar3gfBarnes(double[][] ec,double[] ep, double[] ed, double ten) { // Compute the internal force vector for a cable element according to: // FORM-FINDING AND ANALYSIS OF PRESTRESSED NETS AND MEMBRANES // by M. R. BARNES (1988) //ed = [a_1 a_2 ... a_6]; Element nodal displacements //ep = [E A]; element properties //ten = [ten]; Specified initial element tension //OUTPUT: //ef = F_int = [f_1 f_2 ... f_6]'; //ec format: [x,y,z][node1,node2...] //ed format: [node1x, node1y, node1z, node2x...] double l0 = getElementLength(ec); double[][] ecUpdated = updateEcWithDisp(ec, ed); double l = getElementLength(ecUpdated); //Current length //Current element force double tm = ten + (ep[0] * ep[1] / l0) * (l - l0); //Direction vector Vector v = new DenseVector(3); for (int i = 0; i < 3; i++) { v[i] = ecUpdated[i][0] - ecUpdated[i][1]; } double vl = v.Norm(2); Vector x = new DenseVector(6); for (int i = 0; i < 3; i++) { x[i] = v[i] / vl; } //Reverse direction vector for (int i = 0; i < 3; i++) { x[i+3] = -v[i] / vl; } return x.Multiply(tm).ToArray(); }
public virtual double Norm(double[] a, double p) { Double.DenseVector vector_a = new Double.DenseVector(a); return(vector_a.Norm(p)); }