IRResultType Delamination :: initializeFrom(InputRecord *ir) { EnrichmentItem :: initializeFrom(ir); IRResultType result; // Required by IR_GIVE_FIELD macro // Compute the delamination xi-coord IR_GIVE_FIELD(ir, this->interfaceNum, _IFT_Delamination_interfacenum); // interface number from the bottom IR_GIVE_FIELD(ir, this->crossSectionNum, _IFT_Delamination_csnum); LayeredCrossSection *layeredCS = dynamic_cast< LayeredCrossSection * >( this->giveDomain()->giveCrossSection(this->crossSectionNum) ); if ( layeredCS == NULL ) { OOFEM_ERROR("requires a layered cross section reference as input"); } this->delamXiCoord = -1.0; double totalThickness = layeredCS->give(CS_Thickness, NULL, NULL, false); // no position available for ( int i = 1; i <= this->interfaceNum; i++ ) { this->delamXiCoord += layeredCS->giveLayerThickness(i) / totalThickness * 2.0; } IR_GIVE_OPTIONAL_FIELD(ir, this->matNum, _IFT_Delamination_CohesiveZoneMaterial); if ( this->matNum > 0 ) { this->mat = this->giveDomain()->giveMaterial(this->matNum); } return IRRT_OK; }
void Tr2Shell7 :: computeGaussPoints() { if ( integrationRulesArray.size() == 0 ) { int nPointsTri = 6; // points in the plane // Layered cross section for bulk integration //@todo - must use a cast here since check consistency has not been called yet LayeredCrossSection *layeredCS = dynamic_cast< LayeredCrossSection * >( Tr2Shell7 :: giveCrossSection() ); if ( layeredCS == NULL ) { OOFEM_ERROR("Tr2Shell7 only supports layered cross section"); } this->numberOfGaussPoints = layeredCS->giveNumberOfLayers() * nPointsTri * layeredCS->giveNumIntegrationPointsInLayer(); layeredCS->setupLayeredIntegrationRule(integrationRulesArray, this, nPointsTri); } }
IRResultType Delamination :: initializeFrom(InputRecord *ir) { IRResultType result; // Required by IR_GIVE_FIELD macro result = EnrichmentItem :: initializeFrom(ir); if ( result != IRRT_OK ) return result; // Compute the delamination xi-coord IR_GIVE_FIELD(ir, this->interfaceNum, _IFT_Delamination_interfacenum); // interface number from the bottom IR_GIVE_FIELD(ir, this->crossSectionNum, _IFT_Delamination_csnum); LayeredCrossSection *layeredCS = dynamic_cast< LayeredCrossSection * >( this->giveDomain()->giveCrossSection(this->crossSectionNum) ); if ( layeredCS == NULL ) { OOFEM_WARNING("Delamination EI requires a valid layered cross section number input: see record '%s'.", _IFT_Delamination_csnum); return IRRT_BAD_FORMAT; } else if ( this->interfaceNum.giveSize() < 1 || this->interfaceNum.giveSize() > 2 ) { OOFEM_WARNING("Size of record 'interfacenum' must be 1 or 2"); return IRRT_BAD_FORMAT; } // check that interface numbers are valid interfaceNum.printYourself("interface num"); for ( int i = 1; i <= this->interfaceNum.giveSize(); i++ ) { if ( this->interfaceNum.at(i) < 1 || this->interfaceNum.at(i) >= layeredCS->giveNumberOfLayers() ) { OOFEM_WARNING( "Cross section does not contain the interface number (%d) specified in the record '%s' since number of layers is %d.", this->interfaceNum.at(i), _IFT_Delamination_interfacenum, layeredCS->giveNumberOfLayers() ); return IRRT_BAD_FORMAT; } } // compute xi-coord of the delamination this->delamXiCoord = -1.0; double totalThickness = layeredCS->give(CS_Thickness, FloatArray(), NULL, false); // no position available for ( int i = 1; i <= this->interfaceNum.at(1); i++ ) { this->delamXiCoord += layeredCS->giveLayerThickness(i) / totalThickness * 2.0; this->xiBottom += layeredCS->giveLayerThickness(i) / totalThickness * 2.0; } if ( this->interfaceNum.giveSize() == 2 ) { if ( this->interfaceNum.at(1) >= this->interfaceNum.at(2) ) { OOFEM_WARNING("second intercfacenum must be greater than the first one"); return IRRT_BAD_FORMAT; } for ( int i = 1; i <= this->interfaceNum.at(2); i++ ) { this->xiTop += layeredCS->giveLayerThickness(i) / totalThickness * 2.0; } } else { this->xiTop = 1.0; // default is the top surface } IR_GIVE_OPTIONAL_FIELD(ir, this->matNum, _IFT_Delamination_CohesiveZoneMaterial); if ( this->matNum > 0 ) { this->mat = this->giveDomain()->giveMaterial(this->matNum); } return IRRT_OK; }
void Tr2Shell7PhFi:: computeGaussPoints() { if ( !integrationRulesArray ) { int nPointsTri = 6; // points in the plane int nPointsEdge = 2; // edge integration specialIntegrationRulesArray = new IntegrationRule * [ 3 ]; // Midplane and thickness // Midplane (Mass matrix integrated analytically through the thickness) specialIntegrationRulesArray [ 1 ] = new GaussIntegrationRule(1, this); specialIntegrationRulesArray [ 1 ]->SetUpPointsOnWedge(nPointsTri, 1, _3dMat); //@todo replce with triangle which has a xi3-coord // Edge specialIntegrationRulesArray [ 2 ] = new GaussIntegrationRule(1, this); specialIntegrationRulesArray [ 2 ]->SetUpPointsOnLine(nPointsEdge, _3dMat); // Layered cross section for bulk integration //@todo - must use a cast here since check consistency has not been called yet LayeredCrossSection *layeredCS = dynamic_cast< LayeredCrossSection * >( Tr2Shell7PhFi:: giveCrossSection() ); if ( layeredCS == NULL ) { OOFEM_ERROR("Tr2Shell7PhFionly supports layered cross section"); } this->numberOfIntegrationRules = layeredCS->giveNumberOfLayers(); this->numberOfGaussPoints = layeredCS->giveNumberOfLayers() * nPointsTri * layeredCS->giveNumIntegrationPointsInLayer(); layeredCS->setupLayeredIntegrationRule(integrationRulesArray, this, nPointsTri); // Thickness integration for stress recovery specialIntegrationRulesArray [ 0 ] = new GaussIntegrationRule(1, this); specialIntegrationRulesArray [ 0 ]->SetUpPointsOnLine(layeredCS->giveNumIntegrationPointsInLayer(), _3dMat); } }
IRResultType Delamination :: initializeFrom(InputRecord *ir) { IRResultType result; // Required by IR_GIVE_FIELD macro result = EnrichmentItem :: initializeFrom(ir); if ( result != IRRT_OK ) return result; // Compute the delamination xi-coord IR_GIVE_FIELD(ir, this->interfaceNum, _IFT_Delamination_interfacenum); // interface number from the bottom IR_GIVE_FIELD(ir, this->crossSectionNum, _IFT_Delamination_csnum); if ( ir->hasField(_IFT_Delamination_averageStresses) ) { this->recoverStresses = false; //printf("averageStresses"); } #if 1 // update: csnum is now an IntArray of cross sections viable for delamination bool checkCS = false; double totalThickness(0.0); FloatArray layerThicknesses; int numberOfLayers(0); for (int iCS : this->crossSectionNum) { LayeredCrossSection *layeredCS = dynamic_cast< LayeredCrossSection * >( this->giveDomain()->giveCrossSection(iCS) ); if ( layeredCS == NULL ) { OOFEM_WARNING("Delamination EI requires a valid layered cross section number input: see record '%s'.", _IFT_Delamination_csnum); return IRRT_BAD_FORMAT; } else if ( this->interfaceNum.giveSize() < 1 || this->interfaceNum.giveSize() > 2 ) { OOFEM_WARNING("Size of record 'interfacenum' must be 1 or 2"); return IRRT_BAD_FORMAT; } // check that interface numbers are valid //interfaceNum.printYourself("interface num"); for ( int i = 1; i <= this->interfaceNum.giveSize(); i++ ) { if ( this->interfaceNum.at(i) < 1 || this->interfaceNum.at(i) >= layeredCS->giveNumberOfLayers() ) { OOFEM_WARNING( "Cross section does not contain the interface number (%d) specified in the record '%s' since number of layers is %d.", this->interfaceNum.at(i), _IFT_Delamination_interfacenum, layeredCS->giveNumberOfLayers() ); return IRRT_BAD_FORMAT; } } if (checkCS) { if ( layeredCS->give(CS_Thickness, FloatArray(), NULL, false) != totalThickness ) { OOFEM_WARNING("Delamination cross section have different totalThickness: see record '%s'.", _IFT_Delamination_csnum); return IRRT_BAD_FORMAT; } if ( layeredCS->giveNumberOfLayers() != numberOfLayers ) { OOFEM_WARNING("Delamination cross section have different number of layers: see record '%s'.", _IFT_Delamination_csnum); return IRRT_BAD_FORMAT; } } else numberOfLayers = layeredCS->giveNumberOfLayers(); totalThickness = layeredCS->give(CS_Thickness, FloatArray(), NULL, false); // no position available for ( int i = 1 ; i <= numberOfLayers ; i++) { double layerThickness = layeredCS->giveLayerThickness(i); if (checkCS) { if ( layerThickness != layerThicknesses.at(i) ) { OOFEM_WARNING("Delamination cross section have different layer thicknesses: see record '%s'.", _IFT_Delamination_csnum); return IRRT_BAD_FORMAT; } layerThicknesses.at(i) = layerThickness; } else { layerThicknesses.append(layeredCS->giveLayerThickness(i)); } } // compute xi-coord of the delamination this->delamXiCoord = -1.0; this->xiBottom = -1.0; for ( int i = 1; i <= this->interfaceNum.at(1); i++ ) { this->delamXiCoord += layeredCS->giveLayerThickness(i) / totalThickness * 2.0; this->xiBottom += layeredCS->giveLayerThickness(i) / totalThickness * 2.0; } if ( this->interfaceNum.giveSize() == 2 ) { if ( this->interfaceNum.at(1) >= this->interfaceNum.at(2) ) { OOFEM_WARNING("second intercfacenum must be greater than the first one"); return IRRT_BAD_FORMAT; } this->xiTop = -1.0; for ( int i = 1; i <= this->interfaceNum.at(2); i++ ) { this->xiTop += layeredCS->giveLayerThickness(i) / totalThickness * 2.0; } } else { this->xiTop = 1.0; // default is the top surface } checkCS = true; } #else // old csnum (int version). NB: this was a bug since element nodes that where not part of the cross section could be enriched. LayeredCrossSection *layeredCS = dynamic_cast< LayeredCrossSection * >( this->giveDomain()->giveCrossSection(this->crossSectionNum) ); if ( layeredCS == NULL ) { OOFEM_WARNING("Delamination EI requires a valid layered cross section number input: see record '%s'.", _IFT_Delamination_csnum); return IRRT_BAD_FORMAT; } else if ( this->interfaceNum.giveSize() < 1 || this->interfaceNum.giveSize() > 2 ) { OOFEM_WARNING("Size of record 'interfacenum' must be 1 or 2"); return IRRT_BAD_FORMAT; } // check that interface numbers are valid //interfaceNum.printYourself("interface num"); for ( int i = 1; i <= this->interfaceNum.giveSize(); i++ ) { if ( this->interfaceNum.at(i) < 1 || this->interfaceNum.at(i) >= layeredCS->giveNumberOfLayers() ) { OOFEM_WARNING( "Cross section does not contain the interface number (%d) specified in the record '%s' since number of layers is %d.", this->interfaceNum.at(i), _IFT_Delamination_interfacenum, layeredCS->giveNumberOfLayers() ); return IRRT_BAD_FORMAT; } } // compute xi-coord of the delamination this->delamXiCoord = -1.0; double totalThickness = layeredCS->give(CS_Thickness, FloatArray(), NULL, false); // no position available for ( int i = 1; i <= this->interfaceNum.at(1); i++ ) { this->delamXiCoord += layeredCS->giveLayerThickness(i) / totalThickness * 2.0; this->xiBottom += layeredCS->giveLayerThickness(i) / totalThickness * 2.0; } if ( this->interfaceNum.giveSize() == 2 ) { if ( this->interfaceNum.at(1) >= this->interfaceNum.at(2) ) { OOFEM_WARNING("second intercfacenum must be greater than the first one"); return IRRT_BAD_FORMAT; } for ( int i = 1; i <= this->interfaceNum.at(2); i++ ) { this->xiTop += layeredCS->giveLayerThickness(i) / totalThickness * 2.0; } } else { this->xiTop = 1.0; // default is the top surface } #endif IR_GIVE_OPTIONAL_FIELD(ir, this->matNum, _IFT_Delamination_CohesiveZoneMaterial); if ( this->matNum > 0 ) { this->mat = this->giveDomain()->giveMaterial(this->matNum); } IR_GIVE_OPTIONAL_FIELD(ir, this->initiationFactor, _IFT_Delamination_initiationFactor); if ( this->initiationFactor <= 0 ) { OOFEM_ERROR("initiation scale factor must be greater than 0."); return IRRT_BAD_FORMAT; } IR_GIVE_OPTIONAL_FIELD(ir, this->initiationRadius, _IFT_Delamination_initiationRadius); if ( this->initiationRadius < 0 ) { OOFEM_ERROR("initiation radius must be greater or equal than 0."); return IRRT_BAD_FORMAT; } return IRRT_OK; }