1 /* $Header: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/mbdyn/aero/aeroext.h,v 1.28 2017/01/12 14:45:58 masarati Exp $ */ 2 /* 3 * MBDyn (C) is a multibody analysis code. 4 * http://www.mbdyn.org 5 * 6 * Copyright (C) 1996-2017 7 * 8 * Pierangelo Masarati <masarati@aero.polimi.it> 9 * Paolo Mantegazza <mantegazza@aero.polimi.it> 10 * 11 * Dipartimento di Ingegneria Aerospaziale - Politecnico di Milano 12 * via La Masa, 34 - 20156 Milano, Italy 13 * http://www.aero.polimi.it 14 * 15 * Changing this copyright notice is forbidden. 16 * 17 * This program is free software; you can redistribute it and/or modify 18 * it under the terms of the GNU General Public License as published by 19 * the Free Software Foundation (version 2 of the License). 20 * 21 * 22 * This program is distributed in the hope that it will be useful, 23 * but WITHOUT ANY WARRANTY; without even the implied warranty of 24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 25 * GNU General Public License for more details. 26 * 27 * You should have received a copy of the GNU General Public License 28 * along with this program; if not, write to the Free Software 29 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 30 */ 31 32 /* Aerodynmic External Element by Giuseppe Quaranta(C) - December 2002 33 * <quaranta@aero.polimi.it> 34 */ 35 36 #ifndef AEROEXT_H 37 #define AEROEXT_H 38 39 #ifdef USE_EXTERNAL 40 #include "aerodyn.h" 41 #include "ac/mpi.h" 42 43 #include "myassert.h" 44 #include "except.h" 45 46 #include "modal.h" 47 /* AerodynamicExternal */ 48 49 50 class AerodynamicExternal : 51 virtual public Elem, 52 public AerodynamicElem, 53 public DriveOwner 54 { 55 private: 56 MyVectorHandler* pdBuffer; /* buffer per lo scambio dei dati riguardanti 57 le posizioni e le forze */ 58 MyVectorHandler* pdBufferVel; /* buffer per lo scambio dei dati riguardanti le velocita' */ 59 integer NodeN; 60 const StructNode** ppNode; /* vettore di puntatori a i nodi che compongono il blocco */ 61 const doublereal* pRefLength; /* lunghezza di riferimento per scalare i punti definiti nella matrice offset 62 associati a ciascun nodo*/ 63 64 int OffN; /* numero di punto rigidamente collegati con coascun nodo */ 65 Mat3xN* pOffsetVectors; /* posizioni dei punto collegati con ciascun nodo */ 66 MPI::Intercomm* pInterfComm; /* Intercomunicatore con il codice di interfacia */ 67 MPI::Request* pRecReq; 68 bool VelFlag; 69 bool MomFlag; 70 bool SentFlag; 71 Mat3xN* pForce; /* output forze */ 72 Mat3xN* pMoms; /* output momenti */ 73 unsigned int* pLabList; /* lista label nodi */ 74 75 public: 76 77 AerodynamicExternal(unsigned int uLabel, 78 const DofOwner *pDO, 79 const DriveCaller* pDC, 80 int NN, 81 const StructNode** ppN, 82 const doublereal* RefL, 83 MPI::Intercomm* IC, 84 flag fOut, 85 bool VF, 86 bool MF); 87 88 AerodynamicExternal(unsigned int uLabel, 89 const DofOwner *pDO, 90 const DriveCaller* pDC, 91 int NN, 92 const StructNode** ppN, 93 const doublereal* RefL, 94 MPI::Intercomm* IC, 95 int ON, 96 Mat3xN* OV, 97 flag fOut, 98 bool VF, 99 bool MF); 100 101 virtual ~AerodynamicExternal(void); 102 NeedsAirProperties(void)103 bool NeedsAirProperties(void) const 104 { return true; }; 105 106 /* Tipo dell'elemento (usato per debug ecc.) */ GetElemType(void)107 Elem::Type GetElemType(void) const 108 { return Elem::AERODYNAMIC;}; 109 110 /* Contributo al file di restart */ Restart(std::ostream & out)111 virtual std::ostream& Restart(std::ostream& out) const 112 { return out << std::endl; }; 113 BeforePredict(VectorHandler &,VectorHandler &,VectorHandler &,VectorHandler &)114 virtual void BeforePredict(VectorHandler& /* X */ , 115 VectorHandler& /* XP */ , 116 VectorHandler& /* XPrev */ , 117 VectorHandler& /* XPPrev */ ) const { NO_OP; }; 118 119 120 virtual void AfterPredict(VectorHandler& X , 121 VectorHandler& XP ); 122 123 virtual void WorkSpaceDim(integer * piNumRows,integer * piNumCols)124 WorkSpaceDim(integer* piNumRows, integer* piNumCols) const { 125 *piNumRows = 0; 126 *piNumCols = 0; 127 }; 128 129 /* assemblaggio jacobiano */ 130 virtual VariableSubMatrixHandler& AssJac(VariableSubMatrixHandler & WorkMat,doublereal,const VectorHandler &,const VectorHandler &)131 AssJac(VariableSubMatrixHandler& WorkMat, 132 doublereal /* dCoef */ , 133 const VectorHandler& /* XCurr */ , 134 const VectorHandler& /* XPrimeCurr */ ) { 135 DEBUGCOUTFNAME("AerodynamicExternal::AssJac"); 136 WorkMat.SetNullMatrix(); 137 return WorkMat; 138 }; 139 140 /* assemblaggio residuo */ 141 virtual SubVectorHandler& 142 AssRes(SubVectorHandler& WorkVec, 143 doublereal dCoef, 144 const VectorHandler& XCurr, 145 const VectorHandler& XPrimeCurr); 146 147 virtual void Update(const VectorHandler& XCurr , 148 const VectorHandler& XPrimeCurr ); 149 150 /* 151 * Elaborazione stato interno dopo la convergenza 152 */ AfterConvergence(const VectorHandler & X,const VectorHandler & XP)153 virtual void AfterConvergence(const VectorHandler& X, 154 const VectorHandler& XP) { NO_OP; }; 155 156 /* 157 * output; si assume che ogni tipo di elemento sappia, attraverso 158 * l'OutputHandler, dove scrivere il proprio output 159 */ 160 virtual void Output(OutputHandler& OH) const; 161 162 /* Tipo di elemento aerodinamico */ GetAerodynamicElemType(void)163 virtual AerodynamicElem::Type GetAerodynamicElemType(void) const { 164 return AerodynamicElem::AERODYNAMICEXTERNAL; 165 }; 166 167 /* *******PER IL SOLUTORE PARALLELO******** */ 168 /* 169 * Fornisce il tipo e la label dei nodi che sono connessi all'elemento 170 * utile per l'assemblaggio della matrice di connessione fra i dofs 171 */ GetNumConnectedNodes(void)172 virtual int GetNumConnectedNodes(void) const { 173 return NodeN; 174 }; 175 176 177 virtual void GetConnectedNodes(std::vector<const Node * > & connectedNodes)178 GetConnectedNodes(std::vector<const Node *>& connectedNodes) const { 179 connectedNodes.resize(NodeN); 180 for (int i = 0; i < NodeN; i++) { 181 connectedNodes[i] = ppNode[i]; 182 } 183 }; 184 185 private: 186 void ConstructAndInitialize(void); 187 188 void Send(const VectorHandler& X , 189 const VectorHandler& XP ); 190 191 }; 192 193 194 195 196 /* AerodynamicExternalModal */ 197 class AerodynamicExternalModal : 198 virtual public Elem, 199 public AerodynamicElem, 200 public DriveOwner 201 { 202 protected: 203 204 MyVectorHandler* pdBuffer; /* buffer per lo scambio dei dati riguardanti 205 le posizioni e le forze */ 206 MyVectorHandler* pdBufferVel; /* buffer per lo scambio dei dati riguardanti le velocita' */ 207 208 Modal* pModal; 209 int ModalNodes; 210 MPI::Intercomm* pInterfComm; /* Intercomunicatore con il codice di interfaccia */ 211 MPI::Prequest* pSenReq; 212 MPI::Prequest* pRecReq; 213 bool VelFlag; 214 bool MomFlag; 215 bool SentFlag; 216 MyVectorHandler* pForce; /* buffer per l'output delle forze */ 217 218 public: 219 220 AerodynamicExternalModal(unsigned int uLabel, 221 const DofOwner* pDO, 222 const DriveCaller* pDC, 223 Modal* pM, 224 MPI::Intercomm* IC, 225 flag fOut, 226 bool VelFlag, 227 bool MomFlag); 228 229 virtual ~AerodynamicExternalModal(void); 230 NeedsAirProperties(void)231 bool NeedsAirProperties(void) const 232 { return false; }; 233 234 /* Tipo dell'elemento (usato per debug ecc.) */ GetElemType(void)235 Elem::Type GetElemType(void) const 236 { return Elem::AERODYNAMIC;}; 237 238 virtual void WorkSpaceDim(integer * piNumRows,integer * piNumCols)239 WorkSpaceDim(integer* piNumRows, integer* piNumCols) const { 240 *piNumRows = 0; 241 *piNumCols = 0; 242 }; 243 244 /* Contributo al file di restart */ Restart(std::ostream & out)245 virtual std::ostream& Restart(std::ostream& out) const 246 { return out << std::endl; }; 247 BeforePredict(VectorHandler &,VectorHandler &,VectorHandler &,VectorHandler &)248 virtual void BeforePredict(VectorHandler& /* X */ , 249 VectorHandler& /* XP */ , 250 VectorHandler& /* XPrev */ , 251 VectorHandler& /* XPPrev */ ) const { NO_OP; }; 252 253 254 virtual void AfterPredict(VectorHandler& X , 255 VectorHandler& XP ); 256 257 258 /* assemblaggio jacobiano */ 259 virtual VariableSubMatrixHandler& AssJac(VariableSubMatrixHandler & WorkMat,doublereal,const VectorHandler &,const VectorHandler &)260 AssJac(VariableSubMatrixHandler& WorkMat, 261 doublereal /* dCoef */ , 262 const VectorHandler& /* XCurr */ , 263 const VectorHandler& /* XPrimeCurr */ ) { 264 DEBUGCOUTFNAME("AerodynamicExternalModal::AssJac"); 265 WorkMat.SetNullMatrix(); 266 return WorkMat; 267 }; 268 269 /* assemblaggio residuo */ 270 virtual SubVectorHandler& 271 AssRes(SubVectorHandler& WorkVec, 272 doublereal dCoef, 273 const VectorHandler& XCurr, 274 const VectorHandler& XPrimeCurr); 275 276 virtual void Update(const VectorHandler& XCurr , 277 const VectorHandler& XPrimeCurr ); 278 /* 279 * Elaborazione stato interno dopo la convergenza 280 */ AfterConvergence(const VectorHandler & X,const VectorHandler & XP)281 virtual void AfterConvergence(const VectorHandler& X, 282 const VectorHandler& XP) 283 { NO_OP; }; 284 285 /* 286 * output; si assume che ogni tipo di elemento sappia, attraverso 287 * l'OutputHandler, dove scrivere il proprio output 288 */ 289 virtual void Output(OutputHandler& OH) const; 290 291 /* Tipo di elemento aerodinamico */ GetAerodynamicElemType(void)292 virtual AerodynamicElem::Type GetAerodynamicElemType(void) const { 293 return AerodynamicElem::AERODYNAMICEXTERNAL; 294 }; 295 296 /* *******PER IL SOLUTORE PARALLELO******** */ 297 /* 298 * Fornisce il tipo e la label dei nodi che sono connessi all'elemento 299 * utile per l'assemblaggio della matrice di connessione fra i dofs 300 */ GetNumConnectedNodes(void)301 virtual int GetNumConnectedNodes(void) const { 302 return 1; 303 }; 304 305 306 virtual void GetConnectedNodes(std::vector<const Node * > & connectedNodes)307 GetConnectedNodes(std::vector<const Node *>& connectedNodes) const { 308 connectedNodes.resize(1); 309 connectedNodes[0] = pModal->pGetModalNode(); 310 }; 311 312 private: 313 void Send(const VectorHandler& X, const VectorHandler& XP); 314 }; 315 316 class DataManager; 317 class MBDynParser; 318 319 extern Elem * 320 ReadAerodynamicExternal(DataManager* pDM, MBDynParser& HP, 321 const DofOwner *pDO, unsigned int uLabel); 322 323 extern Elem * 324 ReadAerodynamicExternalModal(DataManager* pDM, MBDynParser& HP, 325 const DofOwner *pDO, unsigned int uLabel); 326 327 #endif /* USE_EXTERNAL */ 328 #endif /* AEROEXT_H */ 329