From 9b153ad9664d69dacf132768ab736b409b360022 Mon Sep 17 00:00:00 2001 From: Vinayak Gholap <vinayak.gholap@fau.de> Date: Mon, 1 Jun 2020 16:45:22 +0200 Subject: [PATCH] Structure for dG3DStiffnessBulk::get for coupling with curl field --- dG3D/src/dG3DTerms.cpp | 217 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 210 insertions(+), 7 deletions(-) diff --git a/dG3D/src/dG3DTerms.cpp b/dG3D/src/dG3DTerms.cpp index 870fa8ac1..c24253e01 100644 --- a/dG3D/src/dG3DTerms.cpp +++ b/dG3D/src/dG3DTerms.cpp @@ -796,6 +796,7 @@ void dG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> // Initialization of some data int nbdof = g3DBilinearTerm<double,double>::space1.getNumKeys(ele); int nbFF = ele->getNumShapeFunctions(); + int numEdgeShapeFunc = 1*ele->getNumEdges(); const dG3DMaterialLaw *mlawbulk; if(_mlaw->getType() == materialLaw::fracture) mlawbulk = static_cast<const dG3DMaterialLaw* >((static_cast<const FractureByCohesive3DLaw* > (_mlaw) )->getBulkLaw()); @@ -1047,6 +1048,36 @@ void dG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> } } } + + // MECA-CURL DATA + if (getNumConstitutiveCurlVariable() > 0) + { + if( ipv->getNumConstitutiveCurlVariable() > getNumConstitutiveCurlVariable() ) + Msg::Error("Your material law uses more constitutive curl data variables than your domain dG3DStiffnessBulk::get"); + + // Basis functions for vector field at edges + const std::vector<SVector3> &curlVals = ipv->fcurl(&space1,ele,GP[i],"HcurlLegendre"); + // Basis functions for Curl of vector field at edges + const std::vector<SVector3> &CurlcurlVals = ipv->Curlfcurl(&space1,ele,GP[i],"CurlHcurlLegendre"); + + for (unsigned int curlField = 0; curlField < ipv->getNumConstitutiveCurlVariable(); ++curlField) + { + // dPdB + const STensor33 & dPdVectorCurl = ipv->getConstRefTodPdVectorCurl()[curlField]; + for (unsigned int j = 0; j < nbFF; ++j) + { + for (unsigned int k = 0; k < numEdgeShapeFunc; ++k) + { + const unsigned int indexCurl = 3+getNumNonLocalVariable()+getNumConstitutiveExtraDofDiffusionVariable()+curlField; + for (unsigned int kk = 0; kk < 3; ++kk) + for (unsigned int m = 0; m < 3; ++m) + { + //mStiff(j+kk*nbFF,k+indexCurl*numEdgeShapeFunc) += ratio * 0.0; + } + } + } + } + } } // @@ -1200,6 +1231,31 @@ void dG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> } } } + + // NON-LOCAL - CURL FIELD + if (getNumConstitutiveCurlVariable() > 0) + { + if( ipv->getNumConstitutiveCurlVariable() > getNumConstitutiveCurlVariable() ) + Msg::Error("Your material law uses more constitutive curl data variables than your domain dG3DStiffnessBulk::get"); + + // Basis functions for vector field at edges + const std::vector<SVector3> &curlVals = ipv->fcurl(&space1,ele,GP[i],"HcurlLegendre"); + // Basis functions for Curl of vector field at edges + const std::vector<SVector3> &CurlcurlVals = ipv->Curlfcurl(&space1,ele,GP[i],"CurlHcurlLegendre"); + + for (unsigned int curlField = 0; curlField < ipv->getNumConstitutiveCurlVariable(); ++curlField) + { + const SVector3 & dLocalVariabledVectorCurl = ipv->getConstRefTodLocalVariabledVectorCurl()[curlField]; + for (unsigned int j = 0; j < nbFF; ++j) + { + for (unsigned int k = 0; k < numEdgeShapeFunc; ++k) + { + const unsigned int IndexCurl = 3+getNumNonLocalVariable()+getNumConstitutiveExtraDofDiffusionVariable()+curlField; + //mStiff() += ratio * 0.0; + } + } + } + } } } } @@ -1452,6 +1508,45 @@ void dG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> } } } + + // EXTRA-DOF - CURL FIELD + if (getNumConstitutiveCurlVariable() > 0) + { + if( ipv->getNumConstitutiveCurlVariable() > getNumConstitutiveCurlVariable() ) + Msg::Error("Your material law uses more constitutive curl data variables than your domain dG3DStiffnessBulk::get"); + + // Basis functions for vector field at edges + const std::vector<SVector3> &curlVals = ipv->fcurl(&space1,ele,GP[i],"HcurlLegendre"); + // Basis functions for Curl of vector field at edges + const std::vector<SVector3> &CurlcurlVals = ipv->Curlfcurl(&space1,ele,GP[i],"CurlHcurlLegendre"); + + for (unsigned int extraDOFField = 0; extraDOFField < ipv->getNumConstitutiveExtraDofDiffusionVariable(); ++extraDOFField) + for (unsigned int curlField = 0; curlField < ipv->getNumConstitutiveCurlVariable(); ++curlField) + { + const STensor3 &dFluxdVectorCurl = ipv->getConstRefTodFluxdVectorCurl()[extraDOFField][curlField]; + SVector3 dFieldSourcedVectorCurl(0.0); + SVector3 dMechSourcedVectorCurl(0.0); + + if (getConstitutiveExtraDofDiffusionAccountFieldSource()) + { + dFieldSourcedVectorCurl += ipv->getConstRefTodFieldSourcedVectorCurl()[extraDOFField][curlField]; + } + + if (getConstitutiveExtraDofDiffusionAccountMecaSource()) + { + dMechSourcedVectorCurl += ipv->getConstRefTodMechanicalSourcedVectorCurl()[extraDOFField][curlField]; + } + + for (unsigned int j = 0; j < nbFF; ++j) + for (unsigned int k = 0; k < numEdgeShapeFunc; ++k) + { + const unsigned int IndexField = 3+getNumNonLocalVariable()+extraDOFField; + const unsigned int IndexCurl = 3+getNumNonLocalVariable()+getNumConstitutiveExtraDofDiffusionVariable()+curlField; + + //mStiff; + } + } + } } } @@ -1461,14 +1556,122 @@ void dG3DStiffnessBulk::get(MElement *ele,int npts,IntPt *GP,fullMatrix<double> * */ if (getNumConstitutiveCurlVariable() >0) { - // make curl-curl term - - // make curl-disp term - - // make curl-nonlocal term - + for (int i = 0; i < npts; i++) + { + const IPStateBase *ips = (*vips)[i]; + const dG3DIPVariableBase *ipv = static_cast<const dG3DIPVariableBase*>(ips->getState(IPStateBase::current)); + + if( ipv->getNumConstitutiveCurlVariable() > getNumConstitutiveCurlVariable() ) + Msg::Error("Your material law uses more constitutive curl data variables than your domain dG3DStiffnessBulk::get"); + + const double weight = GP[i].weight; + const double detJ = ipv->getJacobianDeterminant(ele,GP[i]); + const double ratio = detJ*weight; - // make curl- extraDof term + // Basis functions for vector field at edges + const std::vector<SVector3> &curlVals = ipv->fcurl(&space1,ele,GP[i],"HcurlLegendre"); + // Basis functions for Curl of vector field at edges + const std::vector<SVector3> &CurlcurlVals = ipv->Curlfcurl(&space1,ele,GP[i],"CurlHcurlLegendre"); + + for (unsigned int curlField = 0; curlField < ipv->getNumConstitutiveCurlVariable(); ++curlField) + { + // make curl-curl term + for (unsigned int curlField2 = 0; curlField2 < ipv->getNumConstitutiveCurlVariable(); ++curlField2) + { + const STensor3 & dHdB = ipv->getConstRefTodVectorFielddVectorCurl()[curlField][curlField2]; + + STensor3 dSourceVectorFielddB(0.0); + STensor3 dMechFieldSourcedB(0.0); + + if (getConstitutiveCurlAccountFieldSource()) + { + dSourceVectorFielddB += ipv->getConstRefTodSourceVectorFielddVectorCurl()[curlField][curlField2]; + } + if (getConstitutiveCurlAccountMecaSource()) + { + dMechFieldSourcedB += ipv->getConstRefTodMechanicalFieldSourcedVectorCurl()[curlField][curlField2]; + } + + for (unsigned int j = 0; j < numEdgeShapeFunc; ++j) + for (unsigned int k = 0; k < numEdgeShapeFunc; ++k) + { + const unsigned int IndexCurl = 3+getNumNonLocalVariable()+getNumConstitutiveExtraDofDiffusionVariable()+curlField; + const unsigned int IndexCurl2 = 3+getNumNonLocalVariable()+getNumConstitutiveExtraDofDiffusionVariable()+curlField2; + + //mStiff; + } + } + + // make curl-disp term + + // make curl-nonlocal term + if (getNumNonLocalVariable() > 0) + { + if( ipv->getNumberNonLocalVariable() > getNumNonLocalVariable() ) + Msg::Error("Your material law uses more non local variables than your domain dG3DStiffnessBulk::get"); + + for (unsigned int nlk = 0; nlk < ipv->getNumberNonLocalVariable(); ++nlk) + { + const SVector3 & dVectorFielddNonLocalVar = ipv->getConstRefTodVectorFielddNonLocalVariable()[curlField][nlk]; + + SVector3 dSourceVectorFielddNonLocalVar(0.0); + SVector3 dMechFieldSourcedNonLocalVar(0.0); + + if (getConstitutiveCurlAccountFieldSource()) + { + dSourceVectorFielddNonLocalVar += ipv->getConstRefTodSourceVectorFielddNonLocalVariable()[curlField][nlk]; + } + if (getConstitutiveCurlAccountMecaSource()) + { + dMechFieldSourcedNonLocalVar += ipv->getConstRefTodMechanicalFieldSourcedNonLocalVariable()[curlField][nlk]; + } + + for (unsigned int j = 0; j < numEdgeShapeFunc; ++j) + for (unsigned int k = 0; k < nbFF; ++k) + { + const unsigned int IndexCurl = 3+getNumNonLocalVariable()+getNumConstitutiveExtraDofDiffusionVariable()+curlField; + const unsigned int IndexNlk = 3+nlk; + + //mStiff; + } + } + } + + // make curl- extraDof term + if (getNumConstitutiveExtraDofDiffusionVariable() > 0) + { + if (ipv->getNumConstitutiveExtraDofDiffusionVariable() > getNumConstitutiveExtraDofDiffusionVariable()) + Msg::Error("Your material law uses more constitutive extra dof variables than your domain dG3DStiffnessBulk::get"); + + for (unsigned int extraDOFField = 0; extraDOFField < ipv->getNumConstitutiveExtraDofDiffusionVariable(); ++extraDOFField) + { + const SVector3 & dVectorFielddExtraDofField = ipv->getConstRefTodVectorFielddExtraDofField()[curlField][extraDOFField]; + const STensor3 & dVectorFielddGradExtraDofField = ipv->getConstRefTodVectorFielddGradExtraDofField()[curlField][extraDOFField]; + + SVector3 dSourceVectorFielddExtraDofField(0.0); + SVector3 dMechFieldSourcedExtraDofField(0.0); + + if (getConstitutiveCurlAccountFieldSource()) + { + dSourceVectorFielddExtraDofField += ipv->getConstRefTodSourceVectorFielddExtraDofField()[curlField][extraDOFField]; + } + if (getConstitutiveCurlAccountMecaSource()) + { + dMechFieldSourcedExtraDofField += ipv->getConstRefTodMechanicalFieldSourcedExtraDofField()[curlField][extraDOFField]; + } + + for (unsigned int j = 0; j < numEdgeShapeFunc; ++j) + for (unsigned int k = 0; k < nbFF; ++k) + { + const unsigned int IndexCurl = 3+getNumNonLocalVariable()+getNumConstitutiveExtraDofDiffusionVariable()+curlField; + const unsigned int IndexField = 3+getNumNonLocalVariable()+extraDOFField; + + //mStiff; + } + } + } + } + } } //mStiff.print("bulk"); } // end if sym -- GitLab