void POIExportModule :: exportPrimVarAs(UnknownType valID, FILE *stream, TimeStep *tStep) { Domain *d = emodel->giveDomain(1); int j; FloatArray pv, coords(3); InternalStateValueType type = ISVT_UNDEFINED; if ( valID == DisplacementVector ) { type = ISVT_VECTOR; } else if ( valID == FluxVector ) { type = ISVT_SCALAR; } else { OOFEM_ERROR("POIExportModule::exportPrimVarAs: unsupported UnknownType"); } // print header if ( type == ISVT_SCALAR ) { fprintf(stream, "SCALARS prim_scalar_%d\n", ( int ) valID); } else if ( type == ISVT_VECTOR ) { fprintf(stream, "VECTORS vector_%d float\n", ( int ) valID); } else { fprintf(stderr, "POIExportModule::exportPrimVarAs: unsupported variable type\n"); } SpatialLocalizer *sl = d->giveSpatialLocalizer(); // loop over POIs std::list< POI_dataType > :: iterator PoiIter; for ( PoiIter = POIList.begin(); PoiIter != POIList.end(); ++PoiIter ) { coords.at(1) = ( * PoiIter ).x; coords.at(2) = ( * PoiIter ).y; coords.at(3) = ( * PoiIter ).z; //region = (*PoiIter).region; Element *source = sl->giveElementContainingPoint(coords, NULL); if ( source ) { // ask interface EIPrimaryUnknownMapperInterface *interface = ( EIPrimaryUnknownMapperInterface * ) ( source->giveInterface(EIPrimaryUnknownMapperInterfaceType) ); if ( interface ) { interface->EIPrimaryUnknownMI_computePrimaryUnknownVectorAt(VM_Total, tStep, coords, pv); } else { pv.resize(0); OOFEM_WARNING2( "POIExportModule::exportPrimVarAs: element %d with no EIPrimaryUnknownMapperInterface support", source->giveNumber() ); } fprintf(stream, "%10d ", ( * PoiIter ).id); if ( pv.giveSize() ) { for ( j = 1; j <= pv.giveSize(); j++ ) { fprintf( stream, " %15e ", pv.at(j) ); } } fprintf(stream, "\n"); } else { OOFEM_ERROR4( "POIExportModule::exportPrimVarAs: no element containing POI(%e,%e,%e) found", coords.at(1), coords.at(2), coords.at(3) ); } } }
int EIPrimaryUnknownMapper :: evaluateAt(FloatArray &answer, IntArray &dofMask, ValueModeType mode, Domain *oldd, FloatArray &coords, IntArray ®List, TimeStep *tStep) { Element *oelem; EIPrimaryUnknownMapperInterface *interface; SpatialLocalizer *sl = oldd->giveSpatialLocalizer(); ///@todo Change to the other version after checking that it works properly. Will render "giveElementCloseToPoint" obsolete (superseeded by giveElementClosestToPoint). #if 1 if ( regList.isEmpty() ) { oelem = sl->giveElementContainingPoint(coords); } else { oelem = sl->giveElementContainingPoint(coords, & regList); } if ( !oelem ) { if ( regList.isEmpty() ) { oelem = oldd->giveSpatialLocalizer()->giveElementCloseToPoint(coords); } else { oelem = oldd->giveSpatialLocalizer()->giveElementCloseToPoint(coords, & regList); } if ( !oelem ) { OOFEM_WARNING("EIPrimaryUnknownMapper :: evaluateAt - Couldn't find any element containing point."); return false; } } #else FloatArray lcoords, closest; if ( regList.isEmpty() ) { oelem = sl->giveElementClosestToPoint(lcoords, closest, coords, 0 ); } else { // Take the minimum of any region double mindist = 0.0, distance; oelem = NULL; for ( int i = 1; i < regList.giveSize(); ++i ) { Element *tmpelem = sl->giveElementClosestToPoint(lcoords, closest, coords, regList.at(i) ); distance = closest.distance_square(coords); if ( tmpelem != NULL ) { distance = closest.distance_square(coords); if ( distance < mindist || i == 1 ) { mindist = distance; oelem = tmpelem; if (distance == 0.0) { break; } } } } } if ( !oelem ) { OOFEM_WARNING("EIPrimaryUnknownMapper :: evaluateAt - Couldn't find any element containing point."); return false; } #endif interface = static_cast< EIPrimaryUnknownMapperInterface * >( oelem->giveInterface(EIPrimaryUnknownMapperInterfaceType) ); if ( interface ) { interface->EIPrimaryUnknownMI_givePrimaryUnknownVectorDofID(dofMask); #if 1 interface->EIPrimaryUnknownMI_computePrimaryUnknownVectorAt(mode, tStep, coords, answer); #else interface->EIPrimaryUnknownMI_computePrimaryUnknownVectorAtLocal(mode, tStep, lcoords, answer); #endif } else { OOFEM_ERROR("EIPrimaryUnknownMapper :: evaluateAt - Element does not support EIPrimaryUnknownMapperInterface"); } return true; }