73 mExportReactionForces(false),
74 mExportBoundaryConditions(false),
75 mExportBoundaryConditionsExtra(false),
78 mExportCrackLength(false),
79 mExportInterfaceEl(false),
80 mMonitorNodeIndex(-1),
122 for(
int i = 1; i <= numBC; i++) {
125 if(presGradBC != NULL) {
131 if(presGradBCNeumann != NULL) {
136 if(presGradBCWeak != NULL) {
151 std::vector< std::vector<FloatArray> > points;
153 for(
int i = 1; i <= numEI; i++) {
159 std::vector<FloatArray> eiPoints;
161 points.push_back(eiPoints);
185 ExportModule :: initialize();
202 OOFEM_ERROR(
"failed to cast to StructuralEngngModel.");
206 IntArray dofManMap, dofidMap, eqnMap;
222 int maxIndPresDof = 0;
223 for (
int i = 1; i <= dofManMap.
giveSize(); i++ ) {
224 maxIndPresDof = std::max(maxIndPresDof, dofidMap.
at(i));
230 std::vector<FloatArray> emptyArray;
236 while (
mDispHist.size() <
size_t(numBC) ) {
237 std::vector<double> emptyArray;
241 for(
int bcInd = 0; bcInd < numBC; bcInd++) {
246 for (
int i = 1; i <= dofManMap.
giveSize(); i++ ) {
251 fR.at( dofidMap.
at(i) ) += reactions.
at( eqnMap.
at(i) );
270 sprintf(fileNameX,
"ReactionForceGnuplotBC%dX.dat", bcInd+1);
271 pFileX = fopen ( fileNameX ,
"wb" );
273 fprintf(pFileX,
"#u Fx\n");
274 for (
size_t j = 0; j <
mDispHist[bcInd].size(); j++ ) {
283 sprintf(fileNameY,
"ReactionForceGnuplotBC%dY.dat", bcInd+1);
284 pFileY = fopen ( fileNameY ,
"wb" );
286 fprintf(pFileY,
"#u Fx\n");
287 for (
size_t j = 0; j <
mDispHist[bcInd].size(); j++ ) {
307 std::vector<double> arcLengthPositions, normalJumps, tangJumps, normalTractions, tangTractions;
342 size_t num_cz_gp = czGaussPoints.size();
345 for(
size_t gp_ind = 0; gp_ind < num_cz_gp; gp_ind++) {
352 if(matStat != NULL) {
356 double tangDist = 0.0, arcPos = 0.0;
359 arcLengthPositions.push_back(arcPos);
365 double normalJump = jumpLoc.
at(3);
366 normalJumps.push_back(normalJump);
369 tangJumps.push_back( jumpLoc.
at(2) );
373 normalTractions.push_back(trac.
at(3));
375 tangTractions.push_back(trac.
at(2));
384 double tangDist = 0.0, arcPos = 0.0;
387 arcLengthPositions.push_back(arcPos);
396 sig_m(0,0) = sig_v(0);
397 sig_m(1,1) = sig_v(1);
398 sig_m(0,1) = sig_m(1,0) = sig_v( sig_v.
giveSize()-1 );
401 trac(0) = sig_m(0,0)*n(0) + sig_m(0,1)*n(1);
402 trac(1) = sig_m(1,0)*n(0) + sig_m(1,1)*n(1);
403 double trac_n = trac(0)*n(0) + trac(1)*n(1);
404 normalTractions.push_back(trac_n);
407 double trac_t = trac(0)*t(0) + trac(1)*t(1);
408 tangTractions.push_back(trac_t);
422 if ( xMan != NULL ) {
432 std :: stringstream strNormalJump;
433 strNormalJump <<
"NormalJumpGnuplotEI" << eiIndex <<
"Time" << time <<
".dat";
434 std :: string nameNormalJump = strNormalJump.str();
437 std :: stringstream strTangJump;
438 strTangJump <<
"TangJumpGnuplotEI" << eiIndex <<
"Time" << time <<
".dat";
439 std :: string nameTangJump = strTangJump.str();
442 std :: stringstream strNormalTrac;
443 strNormalTrac <<
"NormalTracGnuplotEI" << eiIndex <<
"Time" << time <<
".dat";
444 std :: string nameNormalTrac = strNormalTrac.str();
447 std :: stringstream strTangTrac;
448 strTangTrac <<
"TangTracGnuplotEI" << eiIndex <<
"Time" << time <<
".dat";
449 std :: string nameTangTrac = strTangTrac.str();
453 std::vector<FloatArray> matForcesStart, matForcesEnd;
454 std::vector<double> radii;
459 radii.push_back(matForceRadius);
465 mpMatForceEvaluator->computeMaterialForce(matForceStart, *domain, tipInfoStart, tStep, matForceRadius);
468 matForcesStart.push_back(matForceStart);
471 matForcesStart.push_back(
Vec2(0.0,0.0));
479 mpMatForceEvaluator->computeMaterialForce(matForceEnd, *domain, tipInfoEnd, tStep, matForceRadius);
482 matForcesEnd.push_back(matForceEnd);
485 matForcesEnd.push_back(
Vec2(0.0,0.0));
490 std::vector< std::vector<FloatArray> > matForcesStartArray, matForcesEndArray;
491 matForcesStartArray.push_back(matForcesStart);
492 matForcesEndArray.push_back(matForcesEnd);
495 std :: stringstream strRadii;
496 strRadii <<
"MatForceRadiiGnuplotTime" << time <<
"Crack" << iCrack.
giveNumber() <<
".dat";
500 std :: stringstream strMatForcesStart;
501 strMatForcesStart <<
"MatForcesStartGnuplotTime" << time <<
"Crack" << iCrack.
giveNumber() <<
".dat";
505 std :: stringstream strMatForcesEnd;
506 strMatForcesEnd <<
"MatForcesEndGnuplotTime" << time <<
"Crack" << iCrack.
giveNumber() <<
".dat";
512 std :: stringstream strCrackLength;
513 strCrackLength <<
"CrackLengthGnuplotEI" << eiIndex <<
"Time" << time <<
".dat";
527 std :: stringstream strCracks;
528 strCracks <<
"CracksTime" << time <<
".dat";
529 std :: string nameCracks = strCracks.str();
537 printf(
"Mean stress computed in Gnuplot export module: "); stress.
printYourself();
549 std :: stringstream strMeanStress;
550 strMeanStress <<
"PrescribedGradientGnuplotMeanStress" << bcIndex <<
"Time" << time <<
".dat";
551 std :: string nameMeanStress = strMeanStress.str();
552 std::vector<double> componentArray, stressArray;
554 for(
int i = 1; i <= stress.
giveSize(); i++) {
555 componentArray.push_back(i);
556 stressArray.push_back(stress.
at(i));
571 printf(
"Mean stress computed in Gnuplot export module: "); stress.
printYourself();
582 std :: stringstream strMeanStress;
583 strMeanStress <<
"PrescribedGradientGnuplotMeanStress" << bcIndex <<
"Time" << time <<
".dat";
584 std :: string nameMeanStress = strMeanStress.str();
585 std::vector<double> componentArray, stressArray;
587 for(
int i = 1; i <= stress.
giveSize(); i++) {
588 componentArray.push_back(i);
589 stressArray.push_back(stress.
at(i));
606 printf(
"Mean stress computed in Gnuplot export module: "); stress.
printYourself();
607 printf(
"sigXX: %.12e\n", stress(0) );
618 std :: stringstream strMeanStress;
619 strMeanStress <<
"PrescribedGradientGnuplotMeanStress" << bcIndex <<
"Time" << time <<
".dat";
620 std :: string nameMeanStress = strMeanStress.str();
621 std::vector<double> componentArray, stressArray;
623 for(
int i = 1; i <= stress.
giveSize(); i++) {
624 componentArray.push_back(i);
625 stressArray.push_back(stress.
at(i));
640 printf(
"timeFactor: %e\n", timeFactor );
641 grad.
times(timeFactor);
642 printf(
"Mean grad computed in Gnuplot export module: "); grad.
printYourself();
644 std :: stringstream strMeanGrad;
645 strMeanGrad <<
"PrescribedGradientGnuplotMeanGrad" << bcIndex <<
"Time" << time <<
".dat";
646 std :: string nameMeanGrad = strMeanGrad.str();
647 std::vector<double> componentArrayGrad, gradArray;
649 for(
int i = 1; i <= grad.
giveSize(); i++) {
650 componentArrayGrad.push_back(i);
651 gradArray.push_back(grad.
at(i));
660 std::vector< std::vector<FloatArray> > nodePointArray;
662 for(
size_t i = 0; i < numTracEl; i++) {
664 std::vector<FloatArray> points;
667 points.push_back(xS);
668 points.push_back(xE);
670 nodePointArray.push_back(points);
673 std :: stringstream strTractionNodes;
674 strTractionNodes <<
"TractionNodesGnuplotTime" << time <<
".dat";
675 std :: string nameTractionNodes = strTractionNodes.str();
682 std::vector< std::vector<FloatArray> > nodeNormalArray;
683 for(
size_t i = 0; i < numTracEl; i++) {
685 std::vector<FloatArray> points;
691 nodeNormalArray.push_back(points);
694 std :: stringstream strTractionNodeNormals;
695 strTractionNodeNormals <<
"TractionNodeNormalsGnuplotTime" << time <<
".dat";
696 std :: string nameTractionNodeNormals = strTractionNodeNormals.str();
703 std::vector< std::vector<FloatArray> > nodeTractionArray;
704 for(
size_t i = 0; i < numTracEl; i++) {
706 std::vector<FloatArray> tractions;
711 tractions.push_back(tS);
712 tractions.push_back(tE);
713 nodeTractionArray.push_back(tractions);
716 std :: stringstream strTractions;
717 strTractions <<
"TractionsGnuplotTime" << time <<
".dat";
718 std :: string nameTractions = strTractions.str();
725 std::vector< std::vector<FloatArray> > arcPosArray;
726 for(
size_t i = 0; i < numTracEl; i++) {
727 std::vector<FloatArray> arcPos;
728 double xiS = 0.0, xiE = 0.0;
730 arcPos.push_back(
Vec1(xiS) );
731 arcPos.push_back(
Vec1(xiE) );
733 arcPosArray.push_back(arcPos);
736 std :: stringstream strArcPos;
737 strArcPos <<
"ArcPosGnuplotTime" << time <<
".dat";
738 std :: string nameArcPos = strArcPos.str();
744 std::vector< std::vector<FloatArray> > nodeTractionNTArray;
745 for(
size_t i = 0; i < numTracEl; i++) {
747 std::vector<FloatArray> tractions;
757 tractions.push_back(
Vec2(tSn ,tSt));
761 tractions.push_back(
Vec2(tEn, tEt));
762 nodeTractionNTArray.push_back(tractions);
765 std :: stringstream strTractionsNT;
766 strTractionsNT <<
"TractionsNormalTangentGnuplotTime" << time <<
".dat";
767 std :: string nameTractionsNT = strTractionsNT.str();
777 std::vector< std::vector<FloatArray> > bndNodes;
779 for (
int pos = 1; pos <= boundaries.
giveSize() / 2; ++pos ) {
782 int boundary = boundaries.
at(pos * 2);
786 std::vector<FloatArray> bndSegNodes;
809 bndNodes.push_back(bndSegNodes);
812 std :: stringstream strBndNodes;
813 strBndNodes <<
"BndNodesGnuplotTime" << time <<
".dat";
814 std :: string nameBndNodes = strBndNodes.str();
825 printf(
"timeFactor: %e\n", timeFactor );
826 grad.
times(timeFactor);
827 printf(
"Mean grad computed in Gnuplot export module: "); grad.
printYourself();
832 std :: stringstream strMeanGrad;
833 strMeanGrad <<
"PrescribedGradientGnuplotMeanGrad" << bc <<
"Time" << time <<
".dat";
834 std :: string nameMeanGrad = strMeanGrad.str();
835 std::vector<double> componentArrayGrad, gradArray;
837 for(
int i = 1; i <= grad.
giveSize(); i++) {
838 componentArrayGrad.push_back(i);
839 gradArray.push_back(grad.
at(i));
847 std::vector< std::vector<FloatArray> > pointArray;
852 int numEdges = el->giveNumberOfNodes();
855 for (
int edgeIndex = 1; edgeIndex <= numEdges; edgeIndex++ ) {
856 std::vector<FloatArray> points;
858 const auto &bNodes = el->giveInterpolation()->boundaryGiveNodes(edgeIndex, el->giveGeometryType());
860 int niLoc = bNodes.at(1);
861 const auto &xS = el->giveNode(niLoc)->giveCoordinates();
862 points.push_back(xS);
864 int njLoc = bNodes.at( bNodes.giveSize() );
865 const auto &xE = el->giveNode(njLoc)->giveCoordinates();
866 points.push_back(xE);
868 pointArray.push_back(points);
881 std :: stringstream strMesh;
882 strMesh <<
"MeshGnuplotTime" << time <<
".dat";
883 std :: string nameMesh = strMesh.str();
899 std::vector< std::vector<FloatArray> > nodeDispHist;
902 std :: string name =
"MonitorNodeSolGnuplot.dat";
909 std::vector<FloatArray> points, tractions, tractionsProj;
912 for(
int i = 1; i <= numEl; i++) {
918 printf(
"Found StructuralInterfaceElement.\n");
925 for(
int gpInd = 0; gpInd < numGP; gpInd++ ) {
936 tractions.push_back(traction);
940 tractionsProj.push_back(tractionProj);
957 std :: stringstream strFileNameX;
958 strFileNameX <<
"NormalTractionVsXTime" << time <<
".dat";
959 std :: string nameStringX = strFileNameX.str();
961 pFileX = fopen ( nameStringX.c_str() ,
"wb" );
963 fprintf(pFileX,
"#x tn\n");
964 for (
size_t j = 0; j < points.size(); j++ ) {
965 fprintf(pFileX,
"%e %e\n", points[j][0], tractions[j].at(3) );
990 std :: stringstream strFileNameXshear;
991 strFileNameXshear <<
"ShearTractionVsXTime" << time <<
".dat";
992 std :: string nameStringXshear = strFileNameXshear.str();
994 pFileXshear = fopen ( nameStringXshear.c_str() ,
"wb" );
996 fprintf(pFileXshear,
"#x tn\n");
997 for (
size_t j = 0; j < points.size(); j++ ) {
998 fprintf(pFileXshear,
"%e %e\n", points[j][0], tractions[j].at(1) );
1001 fclose(pFileXshear);
1008 std :: stringstream strFileNameY;
1009 strFileNameY <<
"NormalTractionVsYTime" << time <<
".dat";
1010 std :: string nameStringY = strFileNameY.str();
1012 pFileY = fopen ( nameStringY.c_str() ,
"wb" );
1014 fprintf(pFileY,
"#y tn\n");
1015 for (
size_t j = 0; j < points.size(); j++ ) {
1016 fprintf(pFileY,
"%e %e\n", points[j][1], tractions[j].at(3) );
1026 std :: stringstream strFileNameYshear;
1027 strFileNameYshear <<
"ShearTractionVsYTime" << time <<
".dat";
1028 std :: string nameStringYshear = strFileNameYshear.str();
1030 pFileYshear = fopen ( nameStringYshear.c_str() ,
"wb" );
1032 fprintf(pFileYshear,
"#y tn\n");
1033 for (
size_t j = 0; j < points.size(); j++ ) {
1034 fprintf(pFileYshear,
"%e %e\n", points[j][1], tractions[j].at(1) );
1037 fclose(pFileYshear);
1042void GnuplotExportModule :: WritePointsToGnuplot(
const std :: string &iName,
const std :: vector< std::vector<FloatArray> > &iPoints)
1044 std :: ofstream file;
1045 file.open( iName.data() );
1048 file << std :: scientific;
1052 for(
auto posVec: iPoints) {
1053 for(
auto pos: posVec) {
1055 for(
int i = 0; i < pos.giveSize(); i++) {
1056 file << pos[i] <<
" ";
#define REGISTER_ExportModule(class)
virtual void computeTangentialSignDist(double &oDist, const FloatArray &iPoint, double &oMinDistArcPos) const =0
virtual double give(Dof *dof, ValueModeType mode, TimeStep *tStep)
const std ::vector< GaussPoint * > & giveCohesiveZoneGaussPoints() const
const std ::vector< double > & giveCohesiveZoneArcPositions() const
const FloatArray & giveCoordinates() const
Dof * giveDofWithID(int dofID) const
void giveCompleteUnknownVector(FloatArray &answer, ValueModeType mode, TimeStep *tStep)
virtual double giveUnknown(ValueModeType mode, TimeStep *tStep)=0
int giveNumberOfBoundaryConditions() const
Returns number of boundary conditions in domain.
int giveNumberOfElements() const
Returns number of elements in domain.
DofManager * giveDofManager(int n)
Element * giveElement(int n)
int giveNumberOfSpatialDimensions()
Returns number of spatial dimensions.
GeneralBoundaryCondition * giveBc(int n)
std ::vector< std ::unique_ptr< Element > > & giveElements()
XfemManager * giveXfemManager()
virtual FEInterpolation * giveInterpolation() const
DofManager * giveDofManager(int i) const
virtual IntegrationRule * giveDefaultIntegrationRulePtr()
virtual Element_Geometry_Type giveGeometryType() const =0
const TipInfo & giveTipInfo() const
EnrichmentFront * giveEnrichmentFrontStart()
virtual void callGnuplotExportModule(GnuplotExportModule &iExpMod, TimeStep *tStep)
EnrichmentFront * giveEnrichmentFrontEnd()
virtual void initializeFrom(InputRecord &ir)
Initializes receiver according to object description stored in input record.
EngngModel * emodel
Problem pointer.
bool testTimeStepOutput(TimeStep *tStep)
virtual IntArray boundaryGiveNodes(int boundary, const Element_Geometry_Type) const =0
Domain * giveDomain() const
double dotProduct(const FloatArray &x) const
Index giveSize() const
Returns the size of receiver.
virtual void printYourself() const
static FloatArray fromConcatenated(std::initializer_list< FloatArray > ini)
virtual double evaluateAtTime(double t)
virtual double evaluate(TimeStep *tStep, ValueModeType mode)
const FloatArray & giveGlobalCoordinates()
IntegrationPointStatus * giveMaterialStatus(IntegrationPointStatusIDType key=IPSID_Default)
Function * giveTimeFunction()
void giveSubPolygon(std ::vector< FloatArray > &oPoints, const double &iXiStart, const double &iXiEnd) const
BasicGeometry * giveGeometry()
void outputNodeDisp(DofManager &iDMan, TimeStep *tStep)
bool mExportReactionForces
std::unordered_map< int, std::vector< double > > mCrackLengthHist
std::vector< FloatArray > mMonitorNodeDispHist
virtual ~GnuplotExportModule()
void initialize() override
GnuplotExportModule(int n, EngngModel *e)
void outputGradient(int bc, Domain &d, FloatArray &grad, TimeStep *tStep)
void outputXFEM(EnrichmentItem &iEI, TimeStep *tStep)
FloatArray mMatForceRadii
void terminate() override
static void WritePointsToGnuplot(const std ::string &iName, const std ::vector< std::vector< FloatArray > > &iPoints)
void outputMesh(Domain &iDomain)
void outputInterfaceEl(Domain &d, TimeStep *tStep)
std::vector< std::vector< double > > mDispHist
std::vector< double > mTimeHist
std::vector< std::vector< FloatArray > > mReactionForceHistory
void outputReactionForces(TimeStep *tStep)
void doOutput(TimeStep *tStep, bool forcedOutput=false) override
bool mExportBoundaryConditionsExtra
void initializeFrom(InputRecord &ir) override
Initializes receiver according to object description stored in input record.
void outputBoundaryCondition(PrescribedGradient &iBC, TimeStep *tStep)
std ::unique_ptr< MaterialForceEvaluator > mpMatForceEvaluator
bool mExportBoundaryConditions
void outputXFEMGeometry(const std::vector< std::vector< FloatArray > > &iEnrItemPoints)
int giveNumberOfIntegrationPoints() const
GaussPoint * getIntegrationPoint(int n)
void computeField(FloatArray &sigma, TimeStep *tStep) override
size_t giveNumberOfTractionElements() const
void giveTractionElArcPos(size_t iElInd, double &oXiStart, double &oXiEnd) const
void giveBoundaries(IntArray &oBoundaries)
void giveTractionElCoord(size_t iElInd, FloatArray &oStartCoord, FloatArray &oEndCoord) const
void computeField(FloatArray &sigma, TimeStep *tStep) override
void giveTractionElNormal(size_t iElInd, FloatArray &oNormal, FloatArray &oTangent) const
void giveTraction(size_t iElInd, FloatArray &oStartTraction, FloatArray &oEndTraction, ValueModeType mode, TimeStep *tStep)
void giveGradientVoigt(FloatArray &oGradient) const
void computeField(FloatArray &sigma, TimeStep *tStep) override
void buildReactionTable(IntArray &restrDofMans, IntArray &restrDofs, IntArray &eqn, TimeStep *tStep, int di)
void computeReaction(FloatArray &answer, TimeStep *tStep, int di)
const FloatArray & giveNormal() const
const FloatArrayF< 3 > & giveJump() const
Returns the const pointer to receiver's jump.
const FloatArrayF< 3 > & giveFirstPKTraction() const
Returns the const pointer to receiver's first Piola-Kirchhoff traction vector.
const FloatArrayF< 2 > & giveProjectedTraction() const
Returns the projected traction.
const FloatArrayF< 3 > & giveTraction() const
Returns the const pointer to receiver's traction vector.
const FloatArray & giveStressVector() const
Returns the const pointer to receiver's stress vector.
double giveTargetTime()
Returns target time.
EnrichmentItem * giveEnrichmentItem(int n)
int giveNumberOfEnrichmentItems() const
#define _IFT_GnuplotExportModule_cracklength
#define _IFT_GnuplotExportModule_BoundaryConditionsExtra
#define _IFT_GnuplotExportModule_mesh
#define _IFT_GnuplotExportModule_xfem
#define _IFT_GnuplotExportModule_BoundaryConditions
#define _IFT_GnuplotExportModule_ReactionForces
#define _IFT_GnuplotExportModule_materialforceradii
#define _IFT_GnuplotExportModule_interface_el
#define _IFT_GnuplotExportModule_monitornode
static FloatArray Vec2(const double &a, const double &b)
static FloatArray Vec1(const double &a)