diff --git a/contrib/arc/Classes/FuncHeaviside.h b/contrib/arc/Classes/FuncHeaviside.h new file mode 100644 index 0000000000000000000000000000000000000000..4cd9895d362bd42f074482ef61660a52de2dfdfc --- /dev/null +++ b/contrib/arc/Classes/FuncHeaviside.h @@ -0,0 +1,39 @@ +// +// Description : Heaviside function based on level set discontinuity description +// +// +// Author: <Boris Sedji>, 01/2010 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef _FUNCHEAVISIDE_H_ +#define _FUNCHEAVISIDE_H_ + +#include "simpleFunction.h" +#include "DILevelset.h" + + +class FuncHeaviside : public simpleFunction<double> { + private : + + gLevelset *_ls; + + public : + FuncHeaviside(gLevelset *ls){ + _ls = ls; + } + virtual double operator () (double x,double y,double z) const { + if (_ls->isInsideDomain (x,y,z)){ + return 1 ; + }else{ + return -1; + } + } + virtual void gradient (double x, double y, double z, + double & dfdx, double & dfdy, double & dfdz) const + { dfdx = dfdy = dfdz = 0.0; } +}; + +#endif diff --git a/contrib/arc/Classes/VectorXFEMFS.cpp b/contrib/arc/Classes/VectorXFEMFS.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0257484186ad2be7567a123cc0b61286019aa56e --- /dev/null +++ b/contrib/arc/Classes/VectorXFEMFS.cpp @@ -0,0 +1,177 @@ +// +// Description : XFEM elasticity solver implementation +// +// +// Author: <Eric Bechet>::<Boris Sedji>, 01/2010 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include "VectorXFEMFS.h" +#include "SPoint3.h" + +void ScalarLagrangeToXfemFS::f(MVertex *ver, std::vector<ValType> &vals) +{ + if (!(*_TagEnrichedVertex)[ver->getNum()]) vals.push_back(1.0); + else + { + double func = (*_funcEnrichment)(ver->x(),ver->y(),ver->z()); + vals.push_back(1.0); + vals.push_back(func); + } +} + +void ScalarLagrangeToXfemFS::f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) +{ + // Enrichment function calcul + SPoint3 p; + ele->pnt(u, v, w, p); + double func; + func = (*_funcEnrichment)(p.x(), p.y(), p.z()); + + // We need parent parameters + if (ele->getParent()) ele = ele->getParent(); + + int ndofs,normaldofs; + ndofs = ele->getNumVertices(); + normaldofs = ndofs; + + for (int i=0 ;i<ele->getNumVertices();i++) + { + if ((*_TagEnrichedVertex)[ele->getVertex(i)->getNum()]) ndofs = ndofs + 1; // enriched dof + } + + int curpos=vals.size(); + vals.resize(curpos+ndofs); + + // normal shape functions + ele->getShapeFunctions(u, v, w, &(vals[curpos])); + + int k=0; + for (int i=0 ;i<ele->getNumVertices();i++) + { + if ((*_TagEnrichedVertex)[ele->getVertex(i)->getNum()]) + { + vals[curpos+normaldofs+k] = vals[curpos+i]*func; // enriched dof + k++; + } + } + +}; + +void ScalarLagrangeToXfemFS::gradf(MElement *ele, double u, double v, double w,std::vector<GradType> &grads) +{ + // Enrichment function calcul + SPoint3 p; + ele->pnt(u, v, w, p); + double func; + func = (*_funcEnrichment)(p.x(), p.y(), p.z()); + + // We need parent parameters + if (ele->getParent()) ele = ele->getParent(); + + int ndofs,normaldofs; + ndofs= ele->getNumVertices(); + normaldofs = ndofs; // normal dofs + + for (int i=0 ;i< (ele->getNumVertices());i++) + { + if ((*_TagEnrichedVertex)[ele->getVertex(i)->getNum()]) ndofs = ndofs + 1; // enriched dof + } + + int curpos = grads.size(); + grads.reserve(curpos+ndofs); + double gradsuvw[256][3]; + ele->getGradShapeFunctions(u, v, w, gradsuvw); + + int k = 0; + for (int i=0 ;i<(ele->getNumVertices());i++) + { + if ((*_TagEnrichedVertex)[ele->getVertex(i)->getNum()]) // enriched dof + { + gradsuvw[curpos+normaldofs+k][0] = gradsuvw[curpos+i][0]*func; + gradsuvw[curpos+normaldofs+k][1] = gradsuvw[curpos+i][1]*func; + gradsuvw[curpos+normaldofs+k][2] = gradsuvw[curpos+i][2]*func; + k++; + } + } + + double jac[3][3]; + double invjac[3][3]; + const double detJ = ele->getJacobian(u, v, w, jac); + // redondant : on fait cet appel a l'exterieur + inv3x3(jac, invjac); + for (int i=0;i<ndofs;++i) + grads.push_back(GradType( + invjac[0][0] * gradsuvw[i][0] + invjac[0][1] * gradsuvw[i][1] + invjac[0][2] * gradsuvw[i][2], + invjac[1][0] * gradsuvw[i][0] + invjac[1][1] * gradsuvw[i][1] + invjac[1][2] * gradsuvw[i][2], + invjac[2][0] * gradsuvw[i][0] + invjac[2][1] * gradsuvw[i][1] + invjac[2][2] * gradsuvw[i][2] + )); + + +}; + +int ScalarLagrangeToXfemFS::getNumKeys(MElement *ele) +{ + // We need parent parameters + if (ele->getParent()) ele = ele->getParent(); + int ndofs; + ndofs = ele->getNumVertices(); + { + for (int i=0 ;i<(ele->getNumVertices());i++) + { + if ((*_TagEnrichedVertex)[ele->getVertex(i)->getNum()]) ndofs = ndofs + 1; + } + } + return ndofs; +} + +int ScalarLagrangeToXfemFS::getNumKeys(MVertex *ver) +{ + if (!(*_TagEnrichedVertex)[ver->getNum()]) return 1 ; + else return 2; // if enriched vertex, there is two dof at this vertex (one dimension) +} + +void ScalarLagrangeToXfemFS::getKeys(MElement *ele, std::vector<Dof> &keys) +{ + if (ele->getParent()) ele = ele->getParent(); + // vector of additionals keys + std::vector<Dof> SupKeys; + // vector of all vertex dof keys + std::vector<Dof> VertexKeys; + + int ndofs,normaldofs; + ndofs = ele->getNumVertices(); + + for (int i=0 ;i<(ele->getNumVertices());i++) + { + if ((*_TagEnrichedVertex)[ele->getVertex(i)->getNum()]) ndofs = ndofs + 1; + } + + keys.reserve(keys.size()+ndofs); + + // the order of dof in one element of three vertex is u1x u2x u3x a1x a2x a3x u1y, etc... + for (int i=0;i< (ele->getNumVertices()) ;++i) + { + getKeys(ele->getVertex(i), VertexKeys); + if (VertexKeys.size()>1) SupKeys.push_back(VertexKeys[1]); + keys.push_back(VertexKeys[0]); + VertexKeys.clear(); + } + + for (int i=0;i< SupKeys.size() ;++i) keys.push_back(SupKeys[i]); + +} + + +void ScalarLagrangeToXfemFS::getKeys(MVertex *ver, std::vector<Dof> &keys) +{ + if ((*_TagEnrichedVertex)[ver->getNum()]) + { + keys.push_back(Dof(ver->getNum(), _iField)); + keys.push_back(Dof(ver->getNum(), _iField+1)); // we tag the additional dof with number field+1 + } + else keys.push_back(Dof(ver->getNum(), _iField)); +}; + diff --git a/contrib/arc/Classes/VectorXFEMFS.h b/contrib/arc/Classes/VectorXFEMFS.h new file mode 100644 index 0000000000000000000000000000000000000000..92132fef335dcef94572e90484aa7284147869aa --- /dev/null +++ b/contrib/arc/Classes/VectorXFEMFS.h @@ -0,0 +1,97 @@ +// +// Description : From Scalar Lagrange Function Space To XFEM on Tagged Vertex +// +// +// Author: <Eric Bechet>::<Boris Sedji>, 01/2010 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include "SVector3.h" +#include "STensor3.h" +#include <vector> +#include <iterator> +#include <iostream> +#include "Numeric.h" +#include "MElement.h" +#include "dofManager.h" + + +#include "functionSpace.h" +#include "simpleFunction.h" + + +class ScalarLagrangeToXfemFS : public ScalarLagrangeFunctionSpace{ + public: + + typedef TensorialTraits<double>::ValType ValType; + typedef TensorialTraits<double>::GradType GradType; + typedef TensorialTraits<double>::HessType HessType; + typedef TensorialTraits<double>::DivType DivType; + typedef TensorialTraits<double>::CurlType CurlType; + + protected: + + std::map<int , bool> *_TagEnrichedVertex; + simpleFunction<double> *_funcEnrichment; + + public: +// + ScalarLagrangeToXfemFS(int i, std::map<int , bool> &TagEnrichedVertex, simpleFunction<double> *funcEnrichment) : ScalarLagrangeFunctionSpace(i) + { + _TagEnrichedVertex = & TagEnrichedVertex; + _funcEnrichment = funcEnrichment; + } + + virtual int getId(void) const {return ScalarLagrangeFunctionSpace::_iField;}; + // Shape function value in element at uvw + virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals); + // Shape function value at vertex + virtual void f(MVertex *ver, std::vector<ValType> &vals) ; + // Grad Shape function value in element at uvw + virtual void gradf(MElement *ele, double u, double v, double w,std::vector<GradType> &grads) ; + // Shape function Number for element (in one dimension (scalar)) + virtual int getNumKeys(MElement *ele); + // Dof keys for the element + virtual void getKeys(MElement *ele, std::vector<Dof> &keys) ; + // Shape function Number associate with the vertex + virtual int getNumKeys(MVertex *ver); + // Get Dof keys for the vertex (in one dimension (scalar)) + virtual void getKeys(MVertex *ver, std::vector<Dof> &keys); +}; + + +class ScalarXFEMToVectorFS : public ScalarToAnyFunctionSpace<SVector3> +{ + protected: + + static const SVector3 BasisVectors[3]; + + public: + enum Along { VECTOR_X=0, VECTOR_Y=1, VECTOR_Z=2 }; + + typedef TensorialTraits<SVector3>::ValType ValType; + typedef TensorialTraits<SVector3>::GradType GradType; + typedef TensorialTraits<SVector3>::HessType HessType; + typedef TensorialTraits<SVector3>::DivType DivType; + typedef TensorialTraits<SVector3>::CurlType CurlType; + + ScalarXFEMToVectorFS(int id , std::map<int , bool> & TagEnrichedVertex , simpleFunction<double> * funcEnrichment) : + ScalarToAnyFunctionSpace<SVector3>::ScalarToAnyFunctionSpace(ScalarLagrangeToXfemFS(id,TagEnrichedVertex,funcEnrichment), + SVector3(1.,0.,0.),VECTOR_X, SVector3(0.,1.,0.),VECTOR_Y,SVector3(0.,0.,1.),VECTOR_Z) {} + + ScalarXFEMToVectorFS(int id,Along comp1, std::map<int , bool> &TagEnrichedVertex , simpleFunction<double> * funcEnrichment) : + ScalarToAnyFunctionSpace<SVector3>::ScalarToAnyFunctionSpace(ScalarLagrangeToXfemFS(id,TagEnrichedVertex,funcEnrichment), + BasisVectors[comp1],comp1) {} + + ScalarXFEMToVectorFS(int id,Along comp1,Along comp2, std::map<int , bool> &TagEnrichedVertex,simpleFunction<double> *funcEnrichment) : + ScalarToAnyFunctionSpace<SVector3>::ScalarToAnyFunctionSpace(ScalarLagrangeToXfemFS(id,TagEnrichedVertex,funcEnrichment), + BasisVectors[comp1],comp1, BasisVectors[comp2],comp2) {} + + ScalarXFEMToVectorFS(int id,Along comp1,Along comp2, Along comp3, std::map<int , bool> &TagEnrichedVertex,simpleFunction<double> *funcEnrichment) : + ScalarToAnyFunctionSpace<SVector3>::ScalarToAnyFunctionSpace(ScalarLagrangeToXfemFS(id,TagEnrichedVertex,funcEnrichment), + BasisVectors[comp1],comp1, BasisVectors[comp2],comp2, BasisVectors[comp3],comp3) {} +}; + +const SVector3 ScalarXFEMToVectorFS::BasisVectors[3]={SVector3(1,0,0),SVector3(0,1,0),SVector3(0,0,1)}; diff --git a/contrib/arc/Classes/XFEMelasticitySolver.cpp b/contrib/arc/Classes/XFEMelasticitySolver.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e2624c411080387438bfddcd091a0a5252633060 --- /dev/null +++ b/contrib/arc/Classes/XFEMelasticitySolver.cpp @@ -0,0 +1,183 @@ +// +// Description : XFEM elasticity solver, element space function enriched on tagged vertex +// +// +// Author: <Eric Bechet>::<Boris Sedji>, 01/2010 +// +// Copyright: See COPYING file that comes with this distribution +// +// + + + +#include <string.h> +#include "GmshConfig.h" +#include "elasticitySolver.h" +#include "linearSystemCSR.h" +#include "linearSystemPETSc.h" +#include "linearSystemGMM.h" +#include "Numeric.h" +#include "GModel.h" +#include "functionSpace.h" +#include "terms.h" +#include "solverAlgorithms.h" +#include "quadratureRules.h" +#include "solverField.h" +#if defined(HAVE_POST) +#include "PView.h" +#include "PViewData.h" +#endif + + +#include "DILevelset.h" +#include "VectorXFEMFS.cpp" +#include "XFEMelasticitySolver.h" +#include "FuncHeaviside.h" + + +XFEMelasticitySolver::~XFEMelasticitySolver() +{ + delete _funcEnrichment; +} + + +void XFEMelasticitySolver::setMesh(const std::string &meshFileName) +{ + pModel = new GModel(); + pModel->readMSH(meshFileName.c_str()); + _dim = pModel->getNumRegions() ? 3 : 2; +} + +void XFEMelasticitySolver::solve(){ + +#if defined(HAVE_TAUCS) + linearSystemCSRTaucs<double> *lsys = new linearSystemCSRTaucs<double>; +#elif defined(HAVE_PETSC) + linearSystemPETSc<double> *lsys = new linearSystemPETSc<double>; +#else + linearSystemGmm<double> *lsys = new linearSystemGmm<double>; + lsys->setNoisy(2); +#endif + if (pAssembler) delete pAssembler; + pAssembler = new dofManager<double>(lsys); + + // determine all enriched nodes and save in map member _TagEnrichedVertex + + for (int i = 0; i < elasticFields.size(); ++i){ + groupOfElements::elementContainer::const_iterator it = elasticFields[i].g->begin(); + for ( ; it != elasticFields[i].g->end(); ++it) + { + MElement *e = *it; + if (e->getParent()) // if element got parents + { + for (int k = 0; k < e->getParent()->getNumVertices(); ++k) + { // for all vertices in the element parent + _TagEnrichedVertex[e->getParent()->getVertex(k)->getNum()] = true; + } + } + else + { + for (int k = 0; k < e->getNumVertices(); ++k) + { + _TagEnrichedVertex[e->getVertex(k)->getNum()] = false; + } + } + } + } + + // level set definition (in .dat ??) + double a(0.), b(1.), c(0.), d(-4.7); + int n(1); // pour level set + gLevelset *ls = new gLevelsetPlane(a, b, c, d, n); + _funcEnrichment = new FuncHeaviside(ls); + + // space function definition + if (LagSpace) delete LagSpace; + if (_dim==3) LagSpace=new ScalarXFEMToVectorFS(_tag,_TagEnrichedVertex,_funcEnrichment); + if (_dim==2) LagSpace=new ScalarXFEMToVectorFS(_tag,ScalarXFEMToVectorFS::VECTOR_X,ScalarXFEMToVectorFS::VECTOR_Y,_TagEnrichedVertex,_funcEnrichment); + + // we first do all fixations. the behavior of the dofManager is to + // give priority to fixations : when a dof is fixed, it cannot be + // numbered afterwards + + for (unsigned int i = 0; i < allDirichlet.size(); i++) + { + FilterDofComponent filter(allDirichlet[i]._comp); + if (allDirichlet[i].onWhat==BoundaryCondition::ON_VERTEX) + FixNodalDofs(*LagSpace,allDirichlet[i].g->vbegin(),allDirichlet[i].g->vend(),*pAssembler,allDirichlet[i]._f,filter); + else + FixNodalDofs(*LagSpace,allDirichlet[i].g->begin(),allDirichlet[i].g->end(),*pAssembler,allDirichlet[i]._f,filter); + } + + // we number the dofs : when a dof is numbered, it cannot be numbered + // again with another number. + for (unsigned int i = 0; i < elasticFields.size(); ++i) + { + NumberDofs(*LagSpace, elasticFields[i].g->begin(), elasticFields[i].g->end(),*pAssembler); + } + + // Now we start the assembly process + // First build the force vector + + GaussQuadrature Integ_Boundary(GaussQuadrature::Val); + + for (unsigned int i = 0; i < allNeumann.size(); i++) + { + LoadTerm<SVector3> Lterm(*LagSpace,allNeumann[i]._f); + if (allNeumann[i].onWhat==BoundaryCondition::ON_VERTEX) + Assemble(Lterm,*LagSpace,allNeumann[i].g->vbegin(),allNeumann[i].g->vend(),*pAssembler); + else + Assemble(Lterm,*LagSpace,allNeumann[i].g->begin(),allNeumann[i].g->end(),Integ_Boundary,*pAssembler); + } + + // bulk material law + + GaussQuadrature Integ_Bulk(GaussQuadrature::GradGrad); + for (unsigned int i = 0; i < elasticFields.size(); i++) + { + IsotropicElasticTerm Eterm(*LagSpace,elasticFields[i]._E,elasticFields[i]._nu); + Assemble(Eterm,*LagSpace,elasticFields[i].g->begin(),elasticFields[i].g->end(),Integ_Bulk,*pAssembler); + } + + printf("-- done assembling!\n"); + std::cout<<"Dof Number : " << pAssembler->sizeOfR() <<"\n"; + lsys->systemSolve(); + printf("-- done solving!\n"); + + double energ=0; + for (unsigned int i = 0; i < elasticFields.size(); i++) + { + SolverField<SVector3> Field(pAssembler, LagSpace); + IsotropicElasticTerm Eterm(Field,elasticFields[i]._E,elasticFields[i]._nu); + BilinearTermToScalarTerm<SVector3,SVector3> Elastic_Energy_Term(Eterm); + Assemble(Elastic_Energy_Term,elasticFields[i].g->begin(),elasticFields[i].g->end(),Integ_Bulk,energ); + } + printf("elastic energy=%f\n",energ); +} + + + +PView* XFEMelasticitySolver::buildDisplacementView (const std::string &postFileName) +{ + std::set<MVertex*> v; + for (unsigned int i = 0; i < elasticFields.size(); ++i) + { + for (groupOfElements::elementContainer::const_iterator it = elasticFields[i].g->begin(); it != elasticFields[i].g->end(); ++it) + { + MElement *e=*it; + if (e->getParent()) e=e->getParent(); + for (int j = 0; j < e->getNumVertices(); ++j) v.insert(e->getVertex(j)); + } + } + std::map<int, std::vector<double> > data; + SolverField<SVector3> Field(pAssembler, LagSpace); + for ( std::set<MVertex*>::iterator it = v.begin(); it != v.end(); ++it) + { + SVector3 val; + Field.f(*it,val); + std::vector<double> vec(3);vec[0]=val(0);vec[1]=val(1);vec[2]=0; + data[(*it)->getNum()]=vec; + } + PView *pv = new PView (postFileName, "NodeData", pModel, data, 0.0); + return pv; +} diff --git a/contrib/arc/Classes/XFEMelasticitySolver.h b/contrib/arc/Classes/XFEMelasticitySolver.h new file mode 100644 index 0000000000000000000000000000000000000000..2c587069c60f619cb09f3369c55e788f18afb6b9 --- /dev/null +++ b/contrib/arc/Classes/XFEMelasticitySolver.h @@ -0,0 +1,36 @@ +// +// Description : XFEM elasticity solver, element space function enriched on tagged vertex +// +// +// Author: <Eric Bechet>::<Boris Sedji>, 01/2010 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef _XFEMELASTICITY_SOLVER_H_ +#define _XFEMELASTICITY_SOLVER_H_ + +#include "elasticitySolver.h" +#include "simpleFunction.h" + +class XFEMelasticitySolver : public elasticitySolver +{ + protected : + // map containing the tag of vertex and enriched status + std::map<int , bool> _TagEnrichedVertex; + // simple multiplying function enrichment to enrich the space function + simpleFunction <double> *_funcEnrichment; + + public : + + XFEMelasticitySolver(int tag) : elasticitySolver(tag) {} + ~XFEMelasticitySolver(); + // create a GModel and determine de dimension of mesh in meshFileName + virtual void setMesh(const std::string &meshFileName); + // system solve, read the .dat file, fill tagEnrichedVertex, fill funcEnrichment, solve + virtual void solve(); + virtual PView *buildDisplacementView(const std::string &postFileName); +}; + +#endif diff --git a/contrib/arc/ImportLS2dImage.cpp b/contrib/arc/ImportLS2dImage.cpp new file mode 100755 index 0000000000000000000000000000000000000000..34cc9e82f6daaf25c108e7af5687672471ed545d --- /dev/null +++ b/contrib/arc/ImportLS2dImage.cpp @@ -0,0 +1,84 @@ +// +// Description : Import Float Level Set Image in Gmsh QuadTree Mesh +// +// +// Author: <Boris Sedji>, 12/2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// + + + +#include "itkImage.h" +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include <stdio.h> +#include "GModel.h" +#include "Classes/QuadtreeLSImage.cpp" + + + +int main( int argc, char *argv[] ) +{ + if( argc < 4 ) + { + std::cerr << "Missing Parameters " << std::endl; + std::cerr << "Usage: " << argv[0]; + std::cerr << " inputLevelSet2dImage MeshSizeMax MeshSizeMin"<< std::endl; + return 1; + } + + typedef float PixelTypeFloat; + const unsigned int Dimension = 2; + typedef itk::Image< PixelTypeFloat, Dimension > ImageTypeFloat; + typedef itk::ImageFileReader< ImageTypeFloat > ImageReaderTypeFloat; + ImageReaderTypeFloat::Pointer reader = ImageReaderTypeFloat::New(); + + + reader->SetFileName(argv[1]); + + ImageTypeFloat::Pointer image = reader->GetOutput(); + image->Update(); + + ImageTypeFloat::RegionType region; + region = image->GetLargestPossibleRegion (); + + std::cout<<"\nImage dimensions : " << region.GetSize(0) << " x " << region.GetSize(1); + + QuadtreeLSImage quadtree(image); + + int sizemax = atoi(argv[2]); + int sizemin = atoi(argv[3]); + + // Mesh with conditions on mesh size + quadtree.Mesh(sizemax,sizemin); + + // Smoothing mesh to avoid too much generation between adjacent elements + bool statut=false; + int k = 0; + std::cout<<"\nLeaf Number : "<< (quadtree.GetLeafNumber())<<"\n"; + while((!statut) & (k < 20)){ + statut = quadtree.Smooth(); + std::cout<<"\nk : "<< k; + std::cout<<"\nsmoothed : " << (int)statut; + std::cout<<"\nLeaf Number : "<< (quadtree.GetLeafNumber())<<"\n"; + k++; + } + + // Create GModel with the octree mesh + GModel *m = quadtree.CreateGModel(); + + // Write a .msh file with the mesh + std::string ModelName = "QuadtreeMesh.msh" ; + m->writeMSH(ModelName,2.1,false,false); + + // Write a .msh file with the level set values as postview data + PView *pv = quadtree.CreateLSPView(m); + bool useadapt = true; + pv->getData(useadapt)->writeMSH("LSPView.msh", false); + + std::cout<<"\n"; + + return 0; +} diff --git a/contrib/arc/XFEMElasticity.cpp b/contrib/arc/XFEMElasticity.cpp new file mode 100644 index 0000000000000000000000000000000000000000..17b5246974172e11225c7f3adf8f16ac56f2cf88 --- /dev/null +++ b/contrib/arc/XFEMElasticity.cpp @@ -0,0 +1,55 @@ +// +// Description : XFEM elasticity solver main +// +// +// Author: <Eric Bechet>::<Boris Sedji>, 01/2010 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include "Gmsh.h" +#include "elasticitySolver.h" +#include "PView.h" +#include "PViewData.h" +#include "highlevel.h" +#include "groupOfElements.h" +#include <iterator> + +#include "Classes/XFEMelasticitySolver.cpp" + + + +int main (int argc, char* argv[]) +{ + + if (argc < 2) + { + printf("usage : elasticity input_file_name yeahhh \n"); + return -1; + } + + GmshInitialize(argc, argv); + // globals are still present in Gmsh + + // instanciate a solver + XFEMelasticitySolver mySolver (1000); + + // read some input file + mySolver.readInputFile(argv[1]); + + // solve the problem + mySolver.solve(); + + PView *pv = mySolver.buildDisplacementView("displacement"); + pv->getData()->writeMSH("disp.msh", false); + delete pv; + pv = mySolver.buildElasticEnergyView("elastic energy"); + pv->getData()->writeMSH("energ.msh", false); + delete pv; + + // stop gmsh + GmshFinalize(); + +} +