double B3SolidMaterial :: giveHumidityIncrement(GaussPoint *gp, TimeStep *tStep) //computes humidity increment at given TimeStep { double humIncrement = 0.; int err, wflag = 0; /* ask for humidity from external sources, if provided */ FieldManager *fm = domain->giveEngngModel()->giveContext()->giveFieldManager(); FM_FieldPtr tf; FloatArray gcoords, et2, ei2; if ( ( tf = fm->giveField(FT_HumidityConcentration) ) ) { // humidity field registered gp->giveElement()->computeGlobalCoordinates( gcoords, gp->giveNaturalCoordinates() ); if ( ( err = tf->evaluateAt(et2, gcoords, VM_Total, tStep) ) ) { OOFEM_ERROR("tf->evaluateAt failed, error value %d", err); } if ( ( err = tf->evaluateAt(ei2, gcoords, VM_Incremental, tStep) ) ) { OOFEM_ERROR("tf->evaluateAt failed, error value %d", err); } // convert water mass to relative humidity humIncrement = this->inverse_sorption_isotherm( et2.at(1) ) - this->inverse_sorption_isotherm( et2.at(1) - ei2.at(1) ); wflag = 1; } if ( wflag == 0 ) { OOFEM_ERROR("external fields not found"); } return humIncrement; }
void SimpleCrossSection :: giveTemperatureVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep) { Element *elem = gp->giveElement(); answer.clear(); //sum up all prescribed temperatures over an element StructuralElement *selem = dynamic_cast< StructuralElement * >(elem); selem->computeResultingIPTemperatureAt(answer, tStep, gp, VM_Total); /* add external source, if provided */ FieldManager *fm = this->domain->giveEngngModel()->giveContext()->giveFieldManager(); FM_FieldPtr tf; if ( ( tf = fm->giveField(FT_Temperature) ) ) { // temperature field registered FloatArray gcoords, et2; int err; elem->computeGlobalCoordinates( gcoords, gp->giveNaturalCoordinates() ); if ( ( err = tf->evaluateAt(et2, gcoords, VM_Total, tStep) ) ) { OOFEM_ERROR("tf->evaluateAt failed, element %d, error code %d", elem->giveNumber(), err); } if ( et2.isNotEmpty() ) { if ( answer.isEmpty() ) { answer = et2; } else { answer.at(1) += et2.at(1); } } } }