void HOMExportModule :: doOutput(TimeStep *tStep, bool forcedOutput) { if ( !( testTimeStepOutput(tStep) || forcedOutput ) ) { return; } Domain *d = emodel->giveDomain(1); int nelem = d->giveNumberOfElements(); double dV, VolTot = 0.; FloatArray vecState, vecFlow, sumFlow(3); FloatArray internalSource, capacity; FloatArray answerArr, answerArr1; FloatMatrix answerMtrx; IntArray Mask; FloatMatrix baseGCS; sumFlow.zero(); domainType domType = d->giveDomainType(); if ( domType == _HeatTransferMode || domType == _HeatMass1Mode ) { #ifdef __TM_MODULE double sumState = 0.; TransportElement *transpElem; for ( int ielem = 1; ielem <= nelem; ielem++ ) { Element *elem = d->giveElement(ielem); if ( this->matnum.giveSize() == 0 || this->matnum.contains( elem->giveMaterial()->giveNumber() ) ) { for ( GaussPoint *gp: *elem->giveDefaultIntegrationRulePtr() ) { dV = elem->computeVolumeAround(gp); VolTot += dV; elem->giveIPValue(vecState, gp, IST_Temperature, tStep); elem->giveIPValue(vecFlow, gp, IST_TemperatureFlow, tStep); sumState += vecState.at(1) * dV; vecFlow.resize(3); vecFlow.times(dV); sumFlow += vecFlow; } } } sumState *= ( 1. / VolTot * this->scale ); fprintf(this->stream, "%e % e ", tStep->giveTargetTime(), sumState); sumFlow.times(1. / VolTot * this->scale); fprintf( this->stream, "% e % e % e ", sumFlow.at(1), sumFlow.at(2), sumFlow.at(3) ); //add total heat for each material - accumulated energy due to material capacity (J for heat) and internal source (J for heat) internalSource.resize( d->giveNumberOfCrossSectionModels() ); capacity.resize( d->giveNumberOfCrossSectionModels() ); for ( int ielem = 1; ielem <= nelem; ielem++ ) { transpElem = static_cast< TransportElement * >( d->giveElement(ielem) ); transpElem->computeInternalSourceRhsVectorAt(answerArr, tStep, VM_Total); internalSource.at( transpElem->giveCrossSection()->giveNumber() ) += answerArr.sum(); transpElem->giveCharacteristicMatrix(answerMtrx, CapacityMatrix, tStep); transpElem->computeVectorOf(VM_Incremental, tStep, answerArr); answerArr1.beProductOf(answerMtrx, answerArr); capacity.at( transpElem->giveCrossSection()->giveNumber() ) -= answerArr1.sum(); } internalSource.times( tStep->giveTimeIncrement() ); internalSourceEnergy.add(internalSource); capacityEnergy.add(capacity); for ( int i = 1; i <= internalSourceEnergy.giveSize(); i++ ) { fprintf( this->stream, "% e ", internalSourceEnergy.at(i) ); } fprintf(this->stream, " "); for ( int i = 1; i <= capacityEnergy.giveSize(); i++ ) { fprintf( this->stream, "% e ", capacityEnergy.at(i) ); } fprintf(this->stream, "\n"); #endif } else { //structural analysis #ifdef __SM_MODULE StructuralElement *structElem; //int nnodes = d->giveNumberOfDofManagers(); FloatArray VecStrain, VecStress, VecEigStrain, VecEigStrainReduced, tempStrain(6), tempStress(6), tempEigStrain(6), SumStrain(6), SumStress(6), SumEigStrain(6), tempFloatAr, damage; double sumDamage = 0.; //stress and strain vectors are always in global c.s. SumStrain.zero(); //xx, yy, zz, yz, zx, xy SumStress.zero(); SumEigStrain.zero(); for ( int ielem = 1; ielem <= nelem; ielem++ ) { Element *elem = d->giveElement(ielem); tempStrain.zero(); tempStress.zero(); tempEigStrain.zero(); if ( this->matnum.giveSize() == 0 || this->matnum.contains( elem->giveMaterial()->giveNumber() ) ) { for ( GaussPoint *gp: *elem->giveDefaultIntegrationRulePtr() ) { structElem = static_cast< StructuralElement * >(elem); // structElem->computeResultingIPEigenstrainAt(VecEigStrain, tStep, gp, VM_Incremental); structElem->computeResultingIPEigenstrainAt(VecEigStrainReduced, tStep, gp, VM_Total); if ( VecEigStrainReduced.giveSize() == 0 ) { VecEigStrain.resize(0); } else { ( ( StructuralMaterial * ) structElem->giveMaterial() )->giveFullSymVectorForm( VecEigStrain, VecEigStrainReduced, gp->giveMaterialMode() ); } dV = elem->computeVolumeAround(gp); elem->giveIPValue(VecStrain, gp, IST_StrainTensor, tStep); elem->giveIPValue(VecStress, gp, IST_StressTensor, tStep); elem->giveIPValue(damage, gp, IST_DamageTensor, tStep); //truss element has strains and stresses in the first array so transform them to global coordinates ///@todo Should this be the job of giveIPValue to ensure that vectors are given in global c.s.? if ( dynamic_cast< Truss3d * >(elem) ) { MaterialMode mmode = _3dMat; tempStress.at(1) = VecStress.at(1); tempStrain.at(1) = VecStrain.at(1); if ( VecEigStrain.giveSize() ) { tempEigStrain.at(1) = VecEigStrain.at(1); } StressVector stressVector1(tempStress, mmode); //convert from array StressVector stressVector2(mmode); StrainVector strainVector1(tempStrain, mmode); //convert from array StrainVector strainVector2(mmode); StrainVector strainEigVector1(tempEigStrain, mmode); //convert from array StrainVector strainEigVector2(mmode); elem->giveLocalCoordinateSystem(baseGCS); stressVector1.transformTo(stressVector2, baseGCS, 0); strainVector1.transformTo(strainVector2, baseGCS, 0); strainEigVector1.transformTo(strainEigVector2, baseGCS, 0); stressVector2.convertToFullForm(VecStress); strainVector2.convertToFullForm(VecStrain); strainEigVector2.convertToFullForm(VecEigStrain); } VolTot += dV; VecStrain.times(dV); VecStress.times(dV); VecEigStrain.times(dV); if ( damage.giveSize() ) { //only for models with damage sumDamage += damage.at(1) * dV; } SumStrain.add(VecStrain); SumEigStrain.add(VecEigStrain); SumStress.add(VecStress); //VecStrain.printYourself(); //VecEigStrain.printYourself(); //SumStrain.printYourself(); } } } //averaging SumStrain.times(1. / VolTot * this->scale); SumEigStrain.times(1. / VolTot * this->scale); SumStress.times(1. / VolTot * this->scale); sumDamage *= ( 1. / VolTot ); //SumStrain.printYourself(); //SumEigStrain.printYourself(); //SumStress.printYourself(); fprintf( this->stream, "%f ", tStep->giveTargetTime() ); for ( double s: SumStrain ) { //strain fprintf( this->stream, "%06.5e ", s ); } fprintf(this->stream, " "); for ( double s: SumStress ) { //stress fprintf( this->stream, "%06.5e ", s ); } fprintf(this->stream, " "); for ( double s: SumEigStrain ) { //eigenstrain fprintf( this->stream, "%06.5e ", s ); } fprintf(this->stream, "Vol %06.5e ", VolTot); fprintf(this->stream, "AvrDamage %06.5e ", sumDamage); fprintf(this->stream, "\n"); #endif } fflush(this->stream); }