| 89 | } |
| 90 | |
| 91 | OrthotropicMaterial::OrthotropicMaterial( |
| 92 | int tag, |
| 93 | NDMaterial &theIsoMat, |
| 94 | double Ex, double Ey, double Ez, double Gxy, double Gyz, double Gzx, |
| 95 | double vxy, double vyz, double vzx, |
| 96 | double Asigmaxx, double Asigmayy, double Asigmazz, double Asigmaxyxy, double Asigmayzyz, double Asigmaxzxz) |
| 97 | : NDMaterial(tag, ND_TAG_OrthotropicMaterial) |
| 98 | { |
| 99 | // copy the isotropic material |
| 100 | theIsotropicMaterial = theIsoMat.getCopy("ThreeDimensional"); |
| 101 | if (theIsotropicMaterial == 0) { |
| 102 | opserr << "nDMaterial Orthotropic Error: failed to get a (3D) copy of the isotropic material\n"; |
| 103 | exit(-1); |
| 104 | } |
| 105 | |
| 106 | // compute the initial orthotropic constitutive tensor |
| 107 | static Matrix C0(6, 6); |
| 108 | C0.Zero(); |
| 109 | double vyx = vxy * Ey / Ex; |
| 110 | double vzy = vyz * Ez / Ey; |
| 111 | double vxz = vzx * Ex / Ez; |
| 112 | double d = (1.0 - vxy * vyx - vyz * vzy - vzx * vxz - 2.0*vxy*vyz*vzx) / (Ex*Ey*Ez); |
| 113 | C0(0, 0) = (1.0 - vyz * vzy) / (Ey*Ez*d); |
| 114 | C0(1, 1) = (1.0 - vzx * vxz) / (Ez*Ex*d); |
| 115 | C0(2, 2) = (1.0 - vxy * vyx) / (Ex*Ey*d); |
| 116 | C0(1, 0) = (vxy + vxz * vzy) / (Ez*Ex*d); |
| 117 | C0(0, 1) = C0(1, 0); |
| 118 | C0(2, 0) = (vxz + vxy * vyz) / (Ex*Ey*d); |
| 119 | C0(0, 2) = C0(2, 0); |
| 120 | C0(2, 1) = (vyz + vxz * vyx) / (Ex*Ey*d); |
| 121 | C0(1, 2) = C0(2, 1); |
| 122 | C0(3, 3) = Gxy; |
| 123 | C0(4, 4) = Gyz; |
| 124 | C0(5, 5) = Gzx; |
| 125 | |
| 126 | // compute the Asigma and its inverse |
| 127 | if (Asigmaxx <= 0 || Asigmayy <= 0 || Asigmazz <= 0 || Asigmaxyxy <= 0 || Asigmayzyz <= 0 || Asigmaxzxz <= 0) { |
| 128 | opserr << "nDMaterial Orthotropic Error: Asigma11, Asigma22, Asigma33, Asigma12, Asigma23, Asigma13 must be greater than 0.\n"; |
| 129 | exit(-1); |
| 130 | } |
| 131 | static Matrix Asigma(6, 6); |
| 132 | Asigma.Zero(); |
| 133 | Asigma(0, 0) = Asigmaxx; |
| 134 | Asigma(1, 1) = Asigmayy; |
| 135 | Asigma(2, 2) = Asigmazz; |
| 136 | Asigma(3, 3) = Asigmaxyxy; |
| 137 | Asigma(4, 4) = Asigmayzyz; |
| 138 | Asigma(5, 5) = Asigmaxzxz; |
| 139 | for (int i = 0; i < 6; ++i) |
| 140 | Asigma_inv(i) = 1.0 / Asigma(i, i); |
| 141 | |
| 142 | // coompute the initial isotropic constitutive tensor and its inverse |
| 143 | static Matrix C0iso(6, 6); |
| 144 | static Matrix C0iso_inv(6, 6); |
| 145 | C0iso = theIsotropicMaterial->getInitialTangent(); |
| 146 | int res = C0iso.Invert(C0iso_inv); |
| 147 | if (res < 0) { |
| 148 | opserr << "nDMaterial Orthotropic Error: the isotropic material gave a singular initial tangent.\n"; |
nothing calls this directly
no test coverage detected