00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <G3Globals.h>
00034 #include <stdlib.h>
00035 #include <Domain.h>
00036 #include <Node.h>
00037 #include <MP_Constraint.h>
00038 #include <Matrix.h>
00039 #include <ID.h>
00040 #include <RigidDiaphragm.h>
00041
00042
00043 RigidDiaphragm::RigidDiaphragm(Domain &theDomain, int nR, ID &nC,
00044 int perpPlaneConstrained, int startMPtag) {
00045
00046
00047 if (perpPlaneConstrained < 0 || perpPlaneConstrained > 2) {
00048 g3ErrorHandler->warning("RigidDiaphragm::RigidDiaphragm - %s %d %s\n",
00049 "the dirn of perpendicular to constrained plane",
00050 perpPlaneConstrained, "not valid");
00051 return;
00052 }
00053
00054
00055 if (nC.getLocation(nR) >= 0) {
00056 g3ErrorHandler->warning("RigidDiaphragm::RigidDiaphragm - %s %d %s\n",
00057 "retained node",
00058 nR,
00059 "is in constrained node list");
00060 return;
00061 }
00062
00063
00064 Node *nodeR = theDomain.getNode(nR);
00065 if (nodeR == 0) {
00066 g3ErrorHandler->warning("RigidDiaphragm::RigidDiaphragm - %s %d %s\n",
00067 "retained Node", nR, "not in domain",nR);
00068 return;
00069 }
00070
00071 const Vector &crdR = nodeR->getCrds();
00072 if ((nodeR->getNumberDOF() != 6) || (crdR.Size() != 3)){
00073 g3ErrorHandler->warning("RigidDiaphragm::RigidDiaphragm - %s %d %s\n",
00074 "retained Node",
00075 nR,
00076 "not in 3d space with 6 dof");
00077 return;
00078 }
00079
00080
00081
00082
00083
00084
00085
00086 ID id(3);
00087
00088
00089 Matrix mat(3,3);
00090 mat.Zero();
00091 mat(0,0) = 1.0; mat(1,1) = 1.0; mat(2,2) = 1.0;
00092
00093
00094
00095
00096
00097
00098
00099 for (int i=0; i<nC.Size(); i++) {
00100
00101
00102 int ndC = nC(i);
00103 Node *nodeC = theDomain.getNode(ndC);
00104
00105
00106 if (nodeC != 0) {
00107
00108
00109 const Vector &crdC = nodeC->getCrds();
00110
00111
00112 if ((nodeR->getNumberDOF() == 6) && (crdR.Size() == 3)){
00113
00114
00115 double deltaX = crdC(0) - crdR(0);
00116 double deltaY = crdC(1) - crdR(1);
00117 double deltaZ = crdC(2) - crdR(2);
00118
00119
00120 if (perpPlaneConstrained == 2) {
00121
00122
00123 if (deltaZ == 0.0) {
00124
00125
00126 id(0) = 0; id(1) = 1; id(2) = 5;
00127
00128
00129 mat(0,2) = - deltaY;
00130 mat(1,2) = deltaX;
00131
00132 } else
00133 g3ErrorHandler->warning("RigidDiaphragm::RigidDiaphragm - ignoring constrained Node %d, not in xy plane\n",ndC);
00134
00135
00136 } else if (perpPlaneConstrained == 1) {
00137
00138
00139 if (deltaY == 0.0) {
00140
00141
00142 id(0) = 0; id(1) = 2; id(2) = 4;
00143
00144
00145 mat(0,2) = deltaZ;
00146 mat(1,2) = -deltaX;
00147
00148 } else
00149 g3ErrorHandler->warning("RigidDiaphragm::RigidDiaphragm - ignoring constrained Node %d, not in xz plane\n",ndC);
00150
00151
00152 } else {
00153
00154
00155 if (deltaX == 0.0) {
00156
00157
00158 id(0) = 1; id(1) = 2; id(2) = 3;
00159
00160
00161 mat(0,2) = -deltaZ;
00162 mat(1,2) = deltaY;
00163
00164 } else
00165 g3ErrorHandler->warning("RigidDiaphragm::RigidDiaphragm - ignoring constrained Node %d, not in xz plane\n",ndC);
00166 }
00167
00168
00169 MP_Constraint *newC = new MP_Constraint(startMPtag+i, nR, ndC,
00170 mat, id, id);
00171 if (newC == 0) {
00172 g3ErrorHandler->warning("RigidDiaphragm::RigidDiaphragm - ignoring constrained Node %d, out of memory\n",ndC);
00173 } else {
00174
00175 if (theDomain.addMP_Constraint(newC) == false) {
00176 g3ErrorHandler->warning("RigidDiaphragm::RigidDiaphragm - ignoring constrained Node %d, failed to add\n",ndC);
00177 delete newC;
00178 }
00179 }
00180
00181 } else
00182 g3ErrorHandler->warning("RigidDiaphragm::RigidDiaphragm - ignoring constrained Node %d, not 3d node\n",ndC);
00183
00184 } else
00185 g3ErrorHandler->warning("RigidDiaphragm::RigidDiaphragm - ignoring constrained Node %d as no node in domain\n",ndC);
00186
00187 }
00188 }
00189
00190
00191
00192
00193
00194
00195 RigidDiaphragm::~RigidDiaphragm()
00196 {
00197
00198 }
00199
00200
00201