Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "sampledSurfaces.H"
00027 #include <finiteVolume/volFields.H>
00028 #include <OpenFOAM/ListListOps.H>
00029
00030
00031
00032 template<class Type>
00033 void Foam::sampledSurfaces::sampleAndWrite
00034 (
00035 const GeometricField<Type, fvPatchField, volMesh>& vField,
00036 const surfaceWriter<Type>& formatter
00037 )
00038 {
00039
00040 autoPtr< interpolation<Type> > interpolator;
00041
00042 const word& fieldName = vField.name();
00043 const fileName outputDir = outputPath_/vField.time().timeName();
00044
00045 forAll(*this, surfI)
00046 {
00047 const sampledSurface& s = operator[](surfI);
00048
00049 Field<Type> values;
00050
00051 if (s.interpolate())
00052 {
00053 if (interpolator.empty())
00054 {
00055 interpolator = interpolation<Type>::New
00056 (
00057 interpolationScheme_,
00058 vField
00059 );
00060 }
00061
00062 values = s.interpolate(interpolator());
00063 }
00064 else
00065 {
00066 values = s.sample(vField);
00067 }
00068
00069 if (Pstream::parRun())
00070 {
00071
00072 List<Field<Type> > gatheredValues(Pstream::nProcs());
00073 gatheredValues[Pstream::myProcNo()] = values;
00074 Pstream::gatherList(gatheredValues);
00075
00076 if (Pstream::master())
00077 {
00078
00079 Field<Type> allValues
00080 (
00081 ListListOps::combine<Field<Type> >
00082 (
00083 gatheredValues,
00084 accessOp<Field<Type> >()
00085 )
00086 );
00087
00088
00089 if (mergeList_[surfI].pointsMap.size() == allValues.size())
00090 {
00091 inplaceReorder(mergeList_[surfI].pointsMap, allValues);
00092 allValues.setSize(mergeList_[surfI].points.size());
00093 }
00094
00095
00096
00097 if (mergeList_[surfI].faces.size())
00098 {
00099 formatter.write
00100 (
00101 outputDir,
00102 s.name(),
00103 mergeList_[surfI].points,
00104 mergeList_[surfI].faces,
00105 fieldName,
00106 allValues
00107 );
00108 }
00109 }
00110 }
00111 else
00112 {
00113
00114
00115 if (s.faces().size())
00116 {
00117 formatter.write
00118 (
00119 outputDir,
00120 s.name(),
00121 s.points(),
00122 s.faces(),
00123 fieldName,
00124 values
00125 );
00126 }
00127 }
00128 }
00129 }
00130
00131
00132 template<class Type>
00133 void Foam::sampledSurfaces::sampleAndWrite
00134 (
00135 fieldGroup<Type>& fields
00136 )
00137 {
00138 if (fields.size())
00139 {
00140
00141 if (fields.formatter.empty())
00142 {
00143 fields.formatter = surfaceWriter<Type>::New(writeFormat_);
00144 }
00145
00146 forAll(fields, fieldI)
00147 {
00148 if (Pstream::master() && verbose_)
00149 {
00150 Pout<< "sampleAndWrite: " << fields[fieldI] << endl;
00151 }
00152
00153 if (loadFromFiles_)
00154 {
00155 sampleAndWrite
00156 (
00157 GeometricField<Type, fvPatchField, volMesh>
00158 (
00159 IOobject
00160 (
00161 fields[fieldI],
00162 mesh_.time().timeName(),
00163 mesh_,
00164 IOobject::MUST_READ,
00165 IOobject::NO_WRITE,
00166 false
00167 ),
00168 mesh_
00169 ),
00170 fields.formatter()
00171 );
00172 }
00173 else
00174 {
00175 objectRegistry::const_iterator iter =
00176 mesh_.find(fields[fieldI]);
00177
00178 if
00179 (
00180 iter != mesh_.objectRegistry::end()
00181 && iter()->type()
00182 == GeometricField<Type, fvPatchField, volMesh>::typeName
00183 )
00184 {
00185 sampleAndWrite
00186 (
00187 mesh_.lookupObject
00188 <GeometricField<Type, fvPatchField, volMesh> >
00189 (
00190 fields[fieldI]
00191 ),
00192 fields.formatter()
00193 );
00194 }
00195 }
00196 }
00197 }
00198 }
00199
00200
00201