Fixes to previous merge commits

This commit is contained in:
Henrik Rusche 2013-07-03 19:34:16 +02:00
parent 031d180f63
commit 09fbf2ef28
20 changed files with 935 additions and 398 deletions

19
ThirdParty/.gitignore vendored Normal file
View file

@ -0,0 +1,19 @@
# git-ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# editor and misc backup files - anywhere
*~
.*~
*.bak
*.bak[0-9][0-9]
*.orig
*.orig[0-9][0-9]
\#*\#
# ignore the build
rpmBuild/BUILD
rpmBuild/RPMS
rpmBuild/rpmDB
rpmBuild/tmp
# end-of-file

View file

@ -77,8 +77,8 @@ URL: http://www.paraview.org/files/v3.12/
Source: %url/%{name}-%{version}.tar.gz Source: %url/%{name}-%{version}.tar.gz
Prefix: %{_prefix} Prefix: %{_prefix}
Group: Development/Tools Group: Development/Tools
Patch0: ParaView-3.12.0.patch_darwin Patch0: ParaView-3.12.0.patch_darwin
Patch1: paraview-gcc47.patch Patch1: paraview-gcc47.patch
%define _installPrefix %{_prefix}/packages/%{name}-%{version}/platforms/%{_WM_OPTIONS} %define _installPrefix %{_prefix}/packages/%{name}-%{version}/platforms/%{_WM_OPTIONS}

View file

@ -251,22 +251,22 @@ Darwin)
then then
# Use Mac-Ports-Compiler instead of Apple-gcc-4.2 # Use Mac-Ports-Compiler instead of Apple-gcc-4.2
case $WM_COMPILER in case $WM_COMPILER in
Gcc43) Gcc43)
export WM_CC='gcc-mp-4.3' export WM_CC='gcc-mp-4.3'
export WM_CXX='g++-mp-4.3' export WM_CXX='g++-mp-4.3'
;; ;;
Gcc44) Gcc44)
export WM_CC='gcc-mp-4.4' export WM_CC='gcc-mp-4.4'
export WM_CXX='g++-mp-4.4' export WM_CXX='g++-mp-4.4'
;; ;;
Gcc45) Gcc45)
export WM_CC='gcc-mp-4.5' export WM_CC='gcc-mp-4.5'
export WM_CXX='g++-mp-4.5' export WM_CXX='g++-mp-4.5'
;; ;;
*) *)
export WM_COMPILER= export WM_COMPILER=
;; ;;
esac esac
fi fi
;; ;;

View file

@ -79,9 +79,9 @@ alias _foamSource 'if ($?FOAM_VERBOSE && $?prompt) echo "Sourcing: \!*"; source
# Add in preset user or site preferences: # Add in preset user or site preferences:
set foamPrefs=`$WM_PROJECT_DIR/bin/foamEtcFile prefs.csh` set foamPrefs=`$WM_PROJECT_DIR/bin/foamEtcFile prefs.csh`
if ( $status == 0 ) then if ( $status == 0 ) then
if ($foamPrefs) then if ( $?foamPrefs ) then
_foamSource $foamPrefs _foamSource $foamPrefs
endif endif
endif endif
unset foamPrefs unset foamPrefs
@ -110,7 +110,7 @@ if ( ! $?WM_OSTYPE ) setenv WM_OSTYPE POSIX
# Compiler: set to Gcc, Gcc43 or Icc (for Intel's icc) # Compiler: set to Gcc, Gcc43 or Icc (for Intel's icc)
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if ( ! $?WM_COMPILER ) setenv WM_COMPILER Gcc if ( ! $?WM_COMPILER ) setenv WM_COMPILER Gcc
setenv WM_COMPILER Gcc #setenv WM_COMPILER Gcc
#setenv WM_COMPILER Icc #setenv WM_COMPILER Icc
setenv WM_COMPILER_ARCH setenv WM_COMPILER_ARCH
@ -129,7 +129,7 @@ if ( ! $?WM_PRECISION_OPTION ) setenv WM_PRECISION_OPTION DP
# WM_COMPILE_OPTION = Opt | Debug | Prof # WM_COMPILE_OPTION = Opt | Debug | Prof
if ( ! $?WM_COMPILE_OPTION ) setenv WM_COMPILE_OPTION Opt if ( ! $?WM_COMPILE_OPTION ) setenv WM_COMPILE_OPTION Opt
setenv WM_COMPILE_OPTION Opt #setenv WM_COMPILE_OPTION Opt
#setenv WM_COMPILE_OPTION Debug #setenv WM_COMPILE_OPTION Debug
# WM_MPLIB = | OPENMPI | MPICH | MPICH-GM | HPMPI | GAMMA | MPI | QSMPI # WM_MPLIB = | OPENMPI | MPICH | MPICH-GM | HPMPI | GAMMA | MPI | QSMPI
@ -247,20 +247,20 @@ case Darwin:
# Use Mac-Ports-Compiler instead of Apple-gcc-4.2 # Use Mac-Ports-Compiler instead of Apple-gcc-4.2
if ( ! $?compilerInstall ) setenv compilerInstall System if ( ! $?compilerInstall ) setenv compilerInstall System
if ( $compilerInstall == "System" ) then if ( $compilerInstall == "System" ) then
switch ($WM_COMPILER) switch ($WM_COMPILER)
case Gcc43: case Gcc43:
setenv WM_CC 'gcc-mp-4.3' setenv WM_CC 'gcc-mp-4.3'
setenv WM_CXX 'g++-mp-4.3' setenv WM_CXX 'g++-mp-4.3'
breaksw; breaksw;
case Gcc44: case Gcc44:
setenv WM_CC 'gcc-mp-4.4' setenv WM_CC 'gcc-mp-4.4'
setenv WM_CXX 'g++-mp-4.4' setenv WM_CXX 'g++-mp-4.4'
breaksw; breaksw;
case Gcc45: case Gcc45:
setenv WM_CC 'gcc-mp-4.5' setenv WM_CC 'gcc-mp-4.5'
setenv WM_CXX 'g++-mp-4.5' setenv WM_CXX 'g++-mp-4.5'
breaksw; breaksw;
endsw endsw
#setenv WM_COMPILER "" #setenv WM_COMPILER ""
endif endif

View file

@ -140,26 +140,13 @@
#setenv PARAVIEW_DIR path_to_system_installed_paraview #setenv PARAVIEW_DIR path_to_system_installed_paraview
#setenv PARAVIEW_BIN_DIR $PARAVIEW_DIR/bin #setenv PARAVIEW_BIN_DIR $PARAVIEW_DIR/bin
# System installed bison
#setenv BISON_SYSTEM 1
# System installed flex
#setenv FLEX_SYSTEM 1
# System installed m4
#setenv M4_SYSTEM 1
# System installed PyFoam
#setenv PYFOAM_SYSTEM 1
# System installed swak4Foam
#setenv SWAK4FOAM_SYSTEM 1
# Specify ParaView version # Specify ParaView version
# ~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~
#setenv ParaView_VERSION git # eg, cvs/git version #setenv ParaView_VERSION git # eg, cvs/git version
#setenv ParaView_MAJOR 3.7 #setenv ParaView_MAJOR 3.7
# System identifier for the OpenFOAM CDash test harness on openfoam-extend # System identifier for the OpenFOAM CDash test harness on openfoam-extend
# #
# By default, your system FQN/hostname will be used as the system identifier # By default, your system FQN/hostname will be used as the system identifier

View file

@ -151,17 +151,12 @@ compilerInstall=System
# System installed m4 # System installed m4
#export M4_SYSTEM=1 #export M4_SYSTEM=1
# System installed PyFoam
#export PYFOAM_SYSTEM=1
# System installed swak4Foam
#export SWAK4FOAM_SYSTEM=1
# Specify ParaView version # Specify ParaView version
# ~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~
#export ParaView_VERSION=git # eg, cvs/git version #export ParaView_VERSION=git # eg, cvs/git version
#export ParaView_MAJOR=3.7 #export ParaView_MAJOR=3.7
# System identifier for the OpenFOAM CDash test harness on openfoam-extend # System identifier for the OpenFOAM CDash test harness on openfoam-extend
# #
# By default, your system FQN/hostname will be used as the system identifier # By default, your system FQN/hostname will be used as the system identifier

View file

@ -450,21 +450,23 @@ endif
# QT # QT
# ~~~~~ # ~~~~~
if ( $?QT_SYSTEM == 0 && -e "$WM_THIRD_PARTY_DIR"/packages/qt-everywhere-opensource-src-4.7.0/platforms/$WM_OPTIONS )then if ( $?QT_SYSTEM == 0 && -e "$WM_THIRD_PARTY_DIR"/packages/qt-everywhere-opensource-src-4.7.4/platforms/$WM_OPTIONS )then
_foamSource $WM_THIRD_PARTY_DIR/packages/qt-everywhere-opensource-src-4.7.0/platforms/$WM_OPTIONS/etc/qt-everywhere-opensource-src-4.7.0.csh _foamSource $WM_THIRD_PARTY_DIR/packages/qt-everywhere-opensource-src-4.7.4/platforms/$WM_OPTIONS/etc/qt-everywhere-opensource-src-4.7.4.csh
#if ( $?QT_SYSTEM == 0 && -e "$WM_THIRD_PARTY_DIR"/packages/qt-everywhere-opensource-src-4.7.0/platforms/$WM_OPTIONS )then
# _foamSource $WM_THIRD_PARTY_DIR/packages/qt-everywhere-opensource-src-4.7.0/platforms/$WM_OPTIONS/etc/qt-everywhere-opensource-src-4.7.0.csh
endif endif
# PARAVIEW # PARAVIEW
# ~~~~~ # ~~~~~
if ( $?PARAVIEW_SYSTEM == 0 && -e "$WM_THIRD_PARTY_DIR"/packages/ParaView-3.12.0/platforms/$WM_OPTIONS ) then if ( $?PARAVIEW_SYSTEM == 0 && -e "$WM_THIRD_PARTY_DIR"/packages/ParaView-3.12.0/platforms/$WM_OPTIONS ) then
_foamSource $WM_THIRD_PARTY_DIR/packages/ParaView-3.12.0/platforms/$WM_OPTIONS/etc/ParaView-3.12.0.csh _foamSource $WM_THIRD_PARTY_DIR/packages/ParaView-3.12.0/platforms/$WM_OPTIONS/etc/ParaView-3.12.0.csh
#if ( $?PARAVIEW_SYSTEM == 0 && -e "$WM_THIRD_PARTY_DIR"/packages/ParaView-3.8.1/platforms/$WM_OPTIONS ) then #if ( $?PARAVIEW_SYSTEM == 0 && -e "$WM_THIRD_PARTY_DIR"/packages/ParaView-3.8.1/platforms/$WM_OPTIONS ) then
# _foamSource $WM_THIRD_PARTY_DIR/packages/ParaView-3.8.1/platforms/$WM_OPTIONS/etc/ParaView-3.8.1.csh # _foamSource $WM_THIRD_PARTY_DIR/packages/ParaView-3.8.1/platforms/$WM_OPTIONS/etc/ParaView-3.8.1.csh
endif
#if ( $?PARAVIEW_SYSTEM == 0 && -e "$WM_THIRD_PARTY_DIR"/packages/ParaView-3.14.1 ) then #if ( $?PARAVIEW_SYSTEM == 0 && -e "$WM_THIRD_PARTY_DIR"/packages/ParaView-3.14.1/platforms/$WM_OPTIONS ) then
# _foamSource $WM_THIRD_PARTY_DIR/packages/ParaView-3.14.1/platforms/$WM_OPTIONS/etc/ParaView-3.14.1.csh # _foamSource $WM_THIRD_PARTY_DIR/packages/ParaView-3.14.1/platforms/$WM_OPTIONS/etc/ParaView-3.14.1.csh
#endif endif
if ( $WM_ARCH == "darwinIntel" || $WM_ARCH == "darwinIntel64" ) then if ( $WM_ARCH == "darwinIntel" || $WM_ARCH == "darwinIntel64" ) then
setenv DYLD_LIBRARY_PATH ${LD_LIBRARY_PATH} setenv DYLD_LIBRARY_PATH ${LD_LIBRARY_PATH}

View file

@ -487,13 +487,10 @@ export MPI_BUFFER_SIZE
# Load cmake # Load cmake
# ~~~~~~~~~~ # ~~~~~~~~~~
<<<<<<< Temporary merge branch 1
[ -z "$CMAKE_SYSTEM" ] && [ -e $WM_THIRD_PARTY_DIR/packages/cmake-2.8.8/platforms/$WM_OPTIONS ] && { [ -z "$CMAKE_SYSTEM" ] && [ -e $WM_THIRD_PARTY_DIR/packages/cmake-2.8.8/platforms/$WM_OPTIONS ] && {
_foamSource $WM_THIRD_PARTY_DIR/packages/cmake-2.8.8/platforms/$WM_OPTIONS/etc/cmake-2.8.8.sh _foamSource $WM_THIRD_PARTY_DIR/packages/cmake-2.8.8/platforms/$WM_OPTIONS/etc/cmake-2.8.8.sh
======= #[ -z "$CMAKE_SYSTEM" ] && [ -e $WM_THIRD_PARTY_DIR/packages/cmake-2.8.6/platforms/$WM_OPTIONS ] && {
[ -z "$CMAKE_SYSTEM" ] && [ -e $WM_THIRD_PARTY_DIR/packages/cmake-2.8.6/platforms/$WM_OPTIONS ] && { # _foamSource $WM_THIRD_PARTY_DIR/packages/cmake-2.8.6/platforms/$WM_OPTIONS/etc/cmake-2.8.6.sh
_foamSource $WM_THIRD_PARTY_DIR/packages/cmake-2.8.6/platforms/$WM_OPTIONS/etc/cmake-2.8.6.sh
>>>>>>> Temporary merge branch 2
} }
[ "$FOAM_VERBOSE" -a "$PS1" ] && echo " CMAKE_DIR is initialized to: $CMAKE_DIR" [ "$FOAM_VERBOSE" -a "$PS1" ] && echo " CMAKE_DIR is initialized to: $CMAKE_DIR"
@ -521,8 +518,8 @@ export MPI_BUFFER_SIZE
# Load zoltan # Load zoltan
# ~~~~~~~~~~ # ~~~~~~~~~~
[ -z "$ZOLTAN_SYSTEM" ] && [ -e $WM_THIRD_PARTY_DIR/packages/zoltan-3.5/platforms/$WM_OPTIONS ] && { [ -z "$ZOLTAN_SYSTEM" ] && [ -e $WM_THIRD_PARTY_DIR/packages/zoltan_3.5 ] && {
_foamSource $WM_THIRD_PARTY_DIR/packages/zoltan-3.5/platforms/$WM_OPTIONS/etc/zoltan-3.5.sh _foamSource $WM_THIRD_PARTY_DIR/packages/zoltan_3.5/platforms/$WM_OPTIONS/etc/zoltan_3.5.sh
} }
[ "$FOAM_VERBOSE" -a "$PS1" ] && echo " ZOLTAN_DIR is initialized to: $ZOLTAN_DIR" [ "$FOAM_VERBOSE" -a "$PS1" ] && echo " ZOLTAN_DIR is initialized to: $ZOLTAN_DIR"
@ -554,6 +551,8 @@ export MPI_BUFFER_SIZE
# ~~~~~~~~~~~~~ # ~~~~~~~~~~~~~
[ -z "$PARAVIEW_SYSTEM" ] && [ -e $WM_THIRD_PARTY_DIR/packages/ParaView-3.12.0/platforms/$WM_OPTIONS ] && { [ -z "$PARAVIEW_SYSTEM" ] && [ -e $WM_THIRD_PARTY_DIR/packages/ParaView-3.12.0/platforms/$WM_OPTIONS ] && {
_foamSource $WM_THIRD_PARTY_DIR/packages/ParaView-3.12.0/platforms/$WM_OPTIONS/etc/ParaView-3.12.0.sh _foamSource $WM_THIRD_PARTY_DIR/packages/ParaView-3.12.0/platforms/$WM_OPTIONS/etc/ParaView-3.12.0.sh
#[ -z "$PARAVIEW_SYSTEM" ] && [ -e $WM_THIRD_PARTY_DIR/packages/ParaView-3.8.1/platforms/$WM_OPTIONS ] && {
# _foamSource $WM_THIRD_PARTY_DIR/packages/ParaView-3.8.1/platforms/$WM_OPTIONS/etc/ParaView-3.8.1.sh
} }
[ "$FOAM_VERBOSE" -a "$PS1" ] && echo " PARAVIEW_DIR is initialized to: $PARAVIEW_DIR" [ "$FOAM_VERBOSE" -a "$PS1" ] && echo " PARAVIEW_DIR is initialized to: $PARAVIEW_DIR"

View file

@ -48,7 +48,8 @@ template
class Type class Type
> >
void ProcessorPointPatchField void ProcessorPointPatchField
<PatchField, Mesh, PointPatch, ProcessorPointPatch, MatrixType, Type>::resizeBuf <PatchField, Mesh, PointPatch, ProcessorPointPatch, MatrixType, Type>::
resizeBuf
( (
List<char>& buf, List<char>& buf,
const label size const label size
@ -961,7 +962,8 @@ initInterfaceMatrixUpdate
const lduMatrix& m, const lduMatrix& m,
const scalarField& coeffs, const scalarField& coeffs,
const direction, const direction,
const Pstream::commsTypes commsType const Pstream::commsTypes commsType,
const bool switchToLhs
) const ) const
{ {
tmp<scalarField> tlocalMult(new scalarField(this->size(), 0)); tmp<scalarField> tlocalMult(new scalarField(this->size(), 0));
@ -985,95 +987,191 @@ initInterfaceMatrixUpdate
// use the counter. // use the counter.
label coeffI = 0; label coeffI = 0;
// Owner side if (switchToLhs)
// ~~~~~~~~~~
{ {
const labelList& cutOwn = procPatch_.cutEdgeOwnerIndices(); // Owner side
const labelList& cutOwnStart = procPatch_.cutEdgeOwnerStart(); // ~~~~~~~~~~
forAll (mp, pointI)
{ {
label ownIndex = cutOwnStart[pointI]; const labelList& cutOwn = procPatch_.cutEdgeOwnerIndices();
label endOwn = cutOwnStart[pointI + 1]; const labelList& cutOwnStart = procPatch_.cutEdgeOwnerStart();
for (; ownIndex < endOwn; ownIndex++) forAll (mp, pointI)
{ {
localMult[pointI] += label ownIndex = cutOwnStart[pointI];
coeffs[coeffI]*psiInternal[U[cutOwn[ownIndex]]]; label endOwn = cutOwnStart[pointI + 1];
// Multiply the internal side as well using the cut mask for (; ownIndex < endOwn; ownIndex++)
result[U[cutOwn[ownIndex]]] += {
cutMask[coeffI]*coeffs[coeffI]*psiInternal[mp[pointI]]; localMult[pointI] +=
coeffs[coeffI]*psiInternal[U[cutOwn[ownIndex]]];
// Multiply the internal side as well using the cut mask
result[U[cutOwn[ownIndex]]] -=
cutMask[coeffI]*coeffs[coeffI]*psiInternal[mp[pointI]];
coeffI++;
}
}
}
// Neighbour side
// ~~~~~~~~~~~~~~
{
const labelList& cutNei = procPatch_.cutEdgeNeighbourIndices();
const labelList& cutNeiStart = procPatch_.cutEdgeNeighbourStart();
forAll (mp, pointI)
{
label neiIndex = cutNeiStart[pointI];
label endNei = cutNeiStart[pointI + 1];
for (; neiIndex < endNei; neiIndex++)
{
localMult[pointI] +=
coeffs[coeffI]*psiInternal[L[cutNei[neiIndex]]];
// Multiply the internal side as well using the cut mask
result[L[cutNei[neiIndex]]] -=
cutMask[coeffI]*coeffs[coeffI]*psiInternal[mp[pointI]];
coeffI++;
}
}
}
// Doubly cut coefficients
// ~~~~~~~~~~~~~~~~~~~~~~~
// There exists a possibility of having an internal edge for a
// point on the processor patch which is in fact connected to
// another point of the same patch. This particular nastiness
// introduces a deformation in the solution because the edge is
// either multiplied twice or not at all. For this purpose, the
// offending edges need to be separated out and multiplied
// appropriately. This will only happen for cell tetrahedral
// decomposition and is generally nasty.
// No need for cut mask here
{
const labelList& doubleCut = procPatch_.doubleCutEdgeIndices();
const labelList& doubleCutOwner = procPatch_.doubleCutOwner();
const labelList& doubleCutNeighbour =
procPatch_.doubleCutNeighbour();
forAll (doubleCut, edgeI)
{
// Owner side
localMult[doubleCutOwner[edgeI]] +=
coeffs[coeffI]*psiInternal[U[doubleCut[edgeI]]];
coeffI++;
// Neighbour side
localMult[doubleCutNeighbour[edgeI]] +=
coeffs[coeffI]*psiInternal[L[doubleCut[edgeI]]];
coeffI++; coeffI++;
} }
} }
}
// Neighbour side // Add the local multiplication to this side as well
// ~~~~~~~~~~~~~~
{
const labelList& cutNei = procPatch_.cutEdgeNeighbourIndices();
const labelList& cutNeiStart = procPatch_.cutEdgeNeighbourStart();
forAll (mp, pointI) forAll (mp, pointI)
{ {
label neiIndex = cutNeiStart[pointI]; result[mp[pointI]] -= localMult[pointI];
label endNei = cutNeiStart[pointI + 1]; }
}
else
{
// Owner side
// ~~~~~~~~~~
{
const labelList& cutOwn = procPatch_.cutEdgeOwnerIndices();
const labelList& cutOwnStart = procPatch_.cutEdgeOwnerStart();
for (; neiIndex < endNei; neiIndex++) forAll (mp, pointI)
{ {
localMult[pointI] += label ownIndex = cutOwnStart[pointI];
coeffs[coeffI]*psiInternal[L[cutNei[neiIndex]]]; label endOwn = cutOwnStart[pointI + 1];
// Multiply the internal side as well using the cut mask for (; ownIndex < endOwn; ownIndex++)
result[L[cutNei[neiIndex]]] += {
cutMask[coeffI]*coeffs[coeffI]*psiInternal[mp[pointI]]; localMult[pointI] +=
coeffs[coeffI]*psiInternal[U[cutOwn[ownIndex]]];
// Multiply the internal side as well using the cut mask
result[U[cutOwn[ownIndex]]] +=
cutMask[coeffI]*coeffs[coeffI]*psiInternal[mp[pointI]];
coeffI++;
}
}
}
// Neighbour side
// ~~~~~~~~~~~~~~
{
const labelList& cutNei = procPatch_.cutEdgeNeighbourIndices();
const labelList& cutNeiStart = procPatch_.cutEdgeNeighbourStart();
forAll (mp, pointI)
{
label neiIndex = cutNeiStart[pointI];
label endNei = cutNeiStart[pointI + 1];
for (; neiIndex < endNei; neiIndex++)
{
localMult[pointI] +=
coeffs[coeffI]*psiInternal[L[cutNei[neiIndex]]];
// Multiply the internal side as well using the cut mask
result[L[cutNei[neiIndex]]] +=
cutMask[coeffI]*coeffs[coeffI]*psiInternal[mp[pointI]];
coeffI++;
}
}
}
// Doubly cut coefficients
// ~~~~~~~~~~~~~~~~~~~~~~~
// There exists a possibility of having an internal edge for a
// point on the processor patch which is in fact connected to
// another point of the same patch. This particular nastiness
// introduces a deformation in the solution because the edge is
// either multiplied twice or not at all. For this purpose, the
// offending edges need to be separated out and multiplied
// appropriately. This will only happen for cell tetrahedral
// decomposition and is generally nasty.
// No need for cut mask here
{
const labelList& doubleCut = procPatch_.doubleCutEdgeIndices();
const labelList& doubleCutOwner = procPatch_.doubleCutOwner();
const labelList& doubleCutNeighbour =
procPatch_.doubleCutNeighbour();
forAll (doubleCut, edgeI)
{
// Owner side
localMult[doubleCutOwner[edgeI]] +=
coeffs[coeffI]*psiInternal[U[doubleCut[edgeI]]];
coeffI++;
// Neighbour side
localMult[doubleCutNeighbour[edgeI]] +=
coeffs[coeffI]*psiInternal[L[doubleCut[edgeI]]];
coeffI++; coeffI++;
} }
} }
}
// Doubly cut coefficients // Add the local multiplication to this side as well
// ~~~~~~~~~~~~~~~~~~~~~~~
// There exists a possibility of having an internal edge for a forAll (mp, pointI)
// point on the processor patch which is in fact connected to
// another point of the same patch. This particular nastiness
// introduces a deformation in the solution because the edge is
// either multiplied twice or not at all. For this purpose, the
// offending edges need to be separated out and multiplied
// appropriately. This will only happen for cell tetrahedral
// decomposition and is generally nasty.
// No need for cut mask here
{
const labelList& doubleCut = procPatch_.doubleCutEdgeIndices();
const labelList& doubleCutOwner = procPatch_.doubleCutOwner();
const labelList& doubleCutNeighbour = procPatch_.doubleCutNeighbour();
forAll (doubleCut, edgeI)
{ {
// Owner side result[mp[pointI]] += localMult[pointI];
localMult[doubleCutOwner[edgeI]] +=
coeffs[coeffI]*psiInternal[U[doubleCut[edgeI]]];
coeffI++;
// Neighbour side
localMult[doubleCutNeighbour[edgeI]] +=
coeffs[coeffI]*psiInternal[L[doubleCut[edgeI]]];
coeffI++;
} }
} }
// Add the local multiplication to this side as well
forAll (mp, pointI)
{
result[mp[pointI]] += localMult[pointI];
}
// Send the localMult // Send the localMult
sendField(tlocalMult, commsType); sendField(tlocalMult, commsType);
} }
@ -1099,9 +1197,13 @@ updateInterfaceMatrix
const lduMatrix&, const lduMatrix&,
const scalarField&, const scalarField&,
const direction, const direction,
const Pstream::commsTypes commsType const Pstream::commsTypes commsType,
const bool switchToLhs
) const ) const
{ {
// Switch to lhs handled in init
// HJ, 22/May/2013
// Get the neighbour side multiplication // Get the neighbour side multiplication
tmp<scalarField> tneiMult = receivePointField<scalar>(commsType); tmp<scalarField> tneiMult = receivePointField<scalar>(commsType);
this->addToInternalField(result, tneiMult()); this->addToInternalField(result, tneiMult());

View file

@ -1024,7 +1024,8 @@ void GlobalPointPatchField
const lduMatrix& m, const lduMatrix& m,
const scalarField& coeffs, const scalarField& coeffs,
const direction, const direction,
const Pstream::commsTypes commsType const Pstream::commsTypes commsType,
const bool switchToLhs
) const ) const
{ {
tmp<scalarField> tlocalMult(new scalarField(this->size(), 0)); tmp<scalarField> tlocalMult(new scalarField(this->size(), 0));
@ -1047,125 +1048,261 @@ void GlobalPointPatchField
label coeffI = 0; label coeffI = 0;
scalarField sumOffDiag(this->size(), 0); scalarField sumOffDiag(this->size(), 0);
// Owner side if (switchToLhs)
// ~~~~~~~~~~
{ {
const labelList& cutOwn = globalPointPatch_.cutEdgeOwnerIndices(); // Owner side
const labelList& cutOwnStart = globalPointPatch_.cutEdgeOwnerStart(); // ~~~~~~~~~~
forAll (mp, pointI)
{ {
label ownIndex = cutOwnStart[pointI]; const labelList& cutOwn = globalPointPatch_.cutEdgeOwnerIndices();
label endOwn = cutOwnStart[pointI + 1]; const labelList& cutOwnStart =
globalPointPatch_.cutEdgeOwnerStart();
for (; ownIndex < endOwn; ownIndex++) forAll (mp, pointI)
{ {
localMult[pointI] += label ownIndex = cutOwnStart[pointI];
cutMask[coeffI]*coeffs[coeffI] label endOwn = cutOwnStart[pointI + 1];
*psiInternal[U[cutOwn[ownIndex]]];
sumOffDiag[pointI] += cutMask[coeffI]*coeffs[coeffI]; for (; ownIndex < endOwn; ownIndex++)
{
localMult[pointI] +=
cutMask[coeffI]*coeffs[coeffI]
*psiInternal[U[cutOwn[ownIndex]]];
// Multiply the internal side as well sumOffDiag[pointI] += cutMask[coeffI]*coeffs[coeffI];
result[U[cutOwn[ownIndex]]] +=
coeffs[coeffI]*psiInternal[mp[pointI]]; // Multiply the internal side as well
result[U[cutOwn[ownIndex]]] -=
coeffs[coeffI]*psiInternal[mp[pointI]];
coeffI++;
}
}
}
// Neighbour side
// ~~~~~~~~~~~~~~
{
const labelList& cutNei =
globalPointPatch_.cutEdgeNeighbourIndices();
const labelList& cutNeiStart =
globalPointPatch_.cutEdgeNeighbourStart();
forAll (mp, pointI)
{
label neiIndex = cutNeiStart[pointI];
label endNei = cutNeiStart[pointI + 1];
for (; neiIndex < endNei; neiIndex++)
{
localMult[pointI] +=
cutMask[coeffI]*coeffs[coeffI]
*psiInternal[L[cutNei[neiIndex]]];
sumOffDiag[pointI] += cutMask[coeffI]*coeffs[coeffI];
// Multiply the internal side as well
result[L[cutNei[neiIndex]]] -=
coeffs[coeffI]*psiInternal[mp[pointI]];
coeffI++;
}
}
}
// Doubly cut coefficients
// ~~~~~~~~~~~~~~~~~~~~~~~
// There exists a possibility of having an internal edge for a
// point on the processor patch which is in fact connected to
// another point of the same patch. This particular nastiness
// introduces a deformation in the solution because the edge is
// either multiplied twice or not at all. For this purpose, the
// offending edges need to be separated out and multiplied
// appropriately.
{
const labelList& doubleCut =
globalPointPatch_.doubleCutEdgeIndices();
const labelList& doubleCutOwner =
globalPointPatch_.doubleCutOwner();
const labelList& doubleCutNeighbour =
globalPointPatch_.doubleCutNeighbour();
forAll (doubleCut, edgeI)
{
// Owner side
localMult[doubleCutOwner[edgeI]] +=
cutMask[coeffI]*coeffs[coeffI]*
psiInternal[U[doubleCut[edgeI]]];
sumOffDiag[doubleCutOwner[edgeI]] +=
cutMask[coeffI]*coeffs[coeffI];
coeffI++;
// Neighbour side
localMult[doubleCutNeighbour[edgeI]] +=
cutMask[coeffI]*coeffs[coeffI]*
psiInternal[L[doubleCut[edgeI]]];
sumOffDiag[doubleCutNeighbour[edgeI]] +=
cutMask[coeffI]*coeffs[coeffI];
coeffI++; coeffI++;
} }
} }
}
// Neighbour side // Reduce/extract the result and enforce over all processors
// ~~~~~~~~~~~~~~
{
const labelList& cutNei = globalPointPatch_.cutEdgeNeighbourIndices();
const labelList& cutNeiStart =
globalPointPatch_.cutEdgeNeighbourStart();
forAll (mp, pointI) // Requires global sync points to flush buffers before gather-scatter
// communications. Reconsider. HJ, 29/Mar/2011
if (Pstream::defaultCommsType == Pstream::nonBlocking)
{ {
label neiIndex = cutNeiStart[pointI]; IPstream::waitRequests();
label endNei = cutNeiStart[pointI + 1]; OPstream::waitRequests();
}
for (; neiIndex < endNei; neiIndex++) tmp<Field<scalar> > trpf =
reduceExtractPoint<scalar>(localMult);
Field<scalar>& rpf = trpf();
// Get addressing
const labelList& addr = globalPointPatch_.meshPoints();
forAll (addr, i)
{
result[addr[i]] -= rpf[i];
}
}
else
{
// Owner side
// ~~~~~~~~~~
{
const labelList& cutOwn = globalPointPatch_.cutEdgeOwnerIndices();
const labelList& cutOwnStart =
globalPointPatch_.cutEdgeOwnerStart();
forAll (mp, pointI)
{ {
localMult[pointI] += label ownIndex = cutOwnStart[pointI];
cutMask[coeffI]*coeffs[coeffI] label endOwn = cutOwnStart[pointI + 1];
*psiInternal[L[cutNei[neiIndex]]];
sumOffDiag[pointI] += cutMask[coeffI]*coeffs[coeffI]; for (; ownIndex < endOwn; ownIndex++)
{
localMult[pointI] +=
cutMask[coeffI]*coeffs[coeffI]
*psiInternal[U[cutOwn[ownIndex]]];
// Multiply the internal side as well sumOffDiag[pointI] += cutMask[coeffI]*coeffs[coeffI];
result[L[cutNei[neiIndex]]] +=
coeffs[coeffI]*psiInternal[mp[pointI]]; // Multiply the internal side as well
result[U[cutOwn[ownIndex]]] +=
coeffs[coeffI]*psiInternal[mp[pointI]];
coeffI++;
}
}
}
// Neighbour side
// ~~~~~~~~~~~~~~
{
const labelList& cutNei =
globalPointPatch_.cutEdgeNeighbourIndices();
const labelList& cutNeiStart =
globalPointPatch_.cutEdgeNeighbourStart();
forAll (mp, pointI)
{
label neiIndex = cutNeiStart[pointI];
label endNei = cutNeiStart[pointI + 1];
for (; neiIndex < endNei; neiIndex++)
{
localMult[pointI] +=
cutMask[coeffI]*coeffs[coeffI]
*psiInternal[L[cutNei[neiIndex]]];
sumOffDiag[pointI] += cutMask[coeffI]*coeffs[coeffI];
// Multiply the internal side as well
result[L[cutNei[neiIndex]]] +=
coeffs[coeffI]*psiInternal[mp[pointI]];
coeffI++;
}
}
}
// Doubly cut coefficients
// ~~~~~~~~~~~~~~~~~~~~~~~
// There exists a possibility of having an internal edge for a
// point on the processor patch which is in fact connected to
// another point of the same patch. This particular nastiness
// introduces a deformation in the solution because the edge is
// either multiplied twice or not at all. For this purpose, the
// offending edges need to be separated out and multiplied
// appropriately.
{
const labelList& doubleCut =
globalPointPatch_.doubleCutEdgeIndices();
const labelList& doubleCutOwner =
globalPointPatch_.doubleCutOwner();
const labelList& doubleCutNeighbour =
globalPointPatch_.doubleCutNeighbour();
forAll (doubleCut, edgeI)
{
// Owner side
localMult[doubleCutOwner[edgeI]] +=
cutMask[coeffI]*coeffs[coeffI]*
psiInternal[U[doubleCut[edgeI]]];
sumOffDiag[doubleCutOwner[edgeI]] +=
cutMask[coeffI]*coeffs[coeffI];
coeffI++;
// Neighbour side
localMult[doubleCutNeighbour[edgeI]] +=
cutMask[coeffI]*coeffs[coeffI]*
psiInternal[L[doubleCut[edgeI]]];
sumOffDiag[doubleCutNeighbour[edgeI]] +=
cutMask[coeffI]*coeffs[coeffI];
coeffI++; coeffI++;
} }
} }
}
// Doubly cut coefficients // Reduce/extract the result and enforce over all processors
// ~~~~~~~~~~~~~~~~~~~~~~~
// There exists a possibility of having an internal edge for a // Requires global sync points to flush buffers before gather-scatter
// point on the processor patch which is in fact connected to // communications. Reconsider. HJ, 29/Mar/2011
// another point of the same patch. This particular nastiness if (Pstream::defaultCommsType == Pstream::nonBlocking)
// introduces a deformation in the solution because the edge is
// either multiplied twice or not at all. For this purpose, the
// offending edges need to be separated out and multiplied
// appropriately.
{
const labelList& doubleCut = globalPointPatch_.doubleCutEdgeIndices();
const labelList& doubleCutOwner = globalPointPatch_.doubleCutOwner();
const labelList& doubleCutNeighbour =
globalPointPatch_.doubleCutNeighbour();
forAll (doubleCut, edgeI)
{ {
// Owner side IPstream::waitRequests();
localMult[doubleCutOwner[edgeI]] += OPstream::waitRequests();
cutMask[coeffI]*coeffs[coeffI]*
psiInternal[U[doubleCut[edgeI]]];
sumOffDiag[doubleCutOwner[edgeI]] +=
cutMask[coeffI]*coeffs[coeffI];
coeffI++;
// Neighbour side
localMult[doubleCutNeighbour[edgeI]] +=
cutMask[coeffI]*coeffs[coeffI]*
psiInternal[L[doubleCut[edgeI]]];
sumOffDiag[doubleCutNeighbour[edgeI]] +=
cutMask[coeffI]*coeffs[coeffI];
coeffI++;
} }
}
// Reduce/extract the result and enforce over all processors tmp<Field<scalar> > trpf =
reduceExtractPoint<scalar>(localMult);
// Requires global sync points to flush buffers before gather-scatter Field<scalar>& rpf = trpf();
// communications. Reconsider. HJ, 29/Mar/2011
if (Pstream::defaultCommsType == Pstream::nonBlocking)
{
IPstream::waitRequests();
OPstream::waitRequests();
}
tmp<Field<scalar> > trpf = // Get addressing
reduceExtractPoint<scalar>(localMult); const labelList& addr = globalPointPatch_.meshPoints();
Field<scalar>& rpf = trpf(); forAll (addr, i)
{
// Get addressing result[addr[i]] += rpf[i];
const labelList& addr = globalPointPatch_.meshPoints(); }
forAll (addr, i)
{
result[addr[i]] += rpf[i];
} }
} }

View file

@ -33,10 +33,6 @@ Contributor
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include <sys/time.h>
#include <sstream>
#include <iomanip>
namespace Foam namespace Foam
{ {
@ -44,17 +40,13 @@ namespace Foam
template<class MasterPatch, class SlavePatch> template<class MasterPatch, class SlavePatch>
template<class Type> template<class Type>
void void MixingPlaneInterpolation<MasterPatch, SlavePatch>::toProfile
MixingPlaneInterpolation<MasterPatch, SlavePatch>::
interpolate
( (
const Field<Type>& srcF, const Field<Type>& srcF,
const labelListList& srcAddr, const labelListList& srcAddr,
const scalarListList& srcWeights, const scalarListList& srcWeights,
const labelListList& dstAddr, Field<Type>& profileBandValues
const scalarListList& dstWeights, )
Field<Type>& dstResultF
) const
{ {
// The src to profile transfer is done using weighted averaging // The src to profile transfer is done using weighted averaging
// evaluation of srcF. // evaluation of srcF.
@ -76,121 +68,133 @@ interpolate
// //
// average(phi) == sum(w*phi) // average(phi) == sum(w*phi)
int nbrProfileBands = interpolationProfile_.size() - 1;
List<Type> profileBandValues(nbrProfileBands, pTraits<Type>::zero);
scalarField srcScalingValues(nbrProfileBands, 0.0);
forAll (srcAddr, bandI) forAll (srcAddr, bandI)
{ {
forAll (srcAddr[bandI], faceI) forAll (srcAddr[bandI], faceI)
{ {
profileBandValues[bandI] += profileBandValues[bandI] +=
srcF[srcAddr[bandI][faceI]]*srcWeights[bandI][faceI]; srcF[srcAddr[bandI][faceI]]*srcWeights[bandI][faceI];
// NB: The next operation should be computed only
// once... and should sum up to 1.0 Let's keep this
// operation for now, until the mixingPlane interface is
// fully debugged (MB, 07/2010)
srcScalingValues[bandI] += srcWeights[bandI][faceI];
if (debug <= -200)
{
Info << "bande: " << bandI
<< " src valeur: " << srcF[srcAddr[bandI][faceI]]
<< " src weight: " << srcWeights[bandI][faceI] << endl;
}
} }
} }
}
// We don't need to divide the profileBandValues by the
// srcScalingValues because the srcScalingValues are identically
// equal to 1.0, thanks to the conservativeness of the GGI
// weighting factors
//profileBandValues = profileBandValues/srcScalingValues;
// profileBandValues are now the circumferentially averaged values template<class MasterPatch, class SlavePatch>
template<class Type>
// The profile to dst transfer is done by simply distributing the void MixingPlaneInterpolation<MasterPatch, SlavePatch>::fromProfile
(
const Field<Type>& profileBandValues,
const labelListList& dstAddr,
const scalarListList& dstWeights,
Field<Type>& dstResultF
)
{
// The profile to dst transfer is done by distributing the
// average value accordingly to the dst weighting factors // average value accordingly to the dst weighting factors
forAll (dstAddr, faceI) forAll (dstAddr, faceI)
{ {
const labelList& curAddr = dstAddr[faceI]; const labelList& curAddr = dstAddr[faceI];
const scalarList& curW = dstWeights[faceI]; const scalarList& curW = dstWeights[faceI];
dstResultF[faceI] = pTraits<Type>::zero;
forAll (curAddr, bandI) forAll (curAddr, bandI)
{ {
dstResultF[faceI] += profileBandValues[curAddr[bandI]]*curW[bandI]; dstResultF[faceI] += profileBandValues[curAddr[bandI]]*curW[bandI];
if (debug <= -200)
{
Info<< "bande: " << dstAddr[faceI][bandI]
<< " dst valeur: " << dstResultF[faceI]
<< " dst weight: " << dstWeights[faceI][bandI] << endl;
}
} }
} }
}
if (debug <= -500)
template<class MasterPatch, class SlavePatch>
template<class Type>
void MixingPlaneInterpolation<MasterPatch, SlavePatch>::maskedFromProfile
(
const Field<Type>& profileBandValues,
const labelListList& dstAddr,
const scalarListList& dstWeights,
Field<Type>& dstResultF,
const labelList& mask
)
{
// The profile to dst transfer is done by distributing the
// average value accordingly to the dst weighting factors
forAll (mask, maskI)
{ {
error::printStack(Info); // Pick the masked face
const label faceI = mask[maskI];
Info<< "srcF : " << srcF << nl const labelList& curAddr = dstAddr[faceI];
<< "srcAddr : " << srcAddr << nl const scalarList& curW = dstWeights[faceI];
<< "srcWeights: " << srcWeights << nl
<< "profileBandValues: " << profileBandValues << nl
<< "srcScalingValues: " << srcScalingValues << nl
<< "dstAddr : " << dstAddr << nl
<< "dstWeights: " << dstWeights << nl
<< "dstResultF: " << dstResultF << nl
<< "srcScalingValues: " << srcScalingValues << endl;
}
if (debug <= -999) dstResultF[maskI] = pTraits<Type>::zero;
{
fileName traceFileDir("./mixingPlaneTraceFiles");
if (!exists(traceFileDir)) forAll (curAddr, bandI)
{ {
mkDir(traceFileDir); dstResultF[maskI] += profileBandValues[curAddr[bandI]]*curW[bandI];
} }
struct timeval tod;
gettimeofday(&tod, NULL);
//struct timespec tp;
//clock_gettime(CLOCK_MONOTONIC, &tp);
std::ostringstream osBuffer;
osBuffer
<< Foam::name(tod.tv_sec)
<< "." << std::setfill('0') << std::setw(6)
<< Foam::name(tod.tv_usec);
fileName traceFileName(traceFileDir/"profileValues_" + osBuffer.str());
OFstream dumpFileSrc(traceFileName + "_orig");
OFstream dumpFileDst(traceFileName + "_interpolated");
OFstream dumpFileProfile(traceFileName + "_profile");
//Foam::error::printStack(Info);
InfoIn
(
"MixingPlaneInterpolation::interpolate"
) << "Dumping src profiles to: " << traceFileName + "_orig" << nl
<< "Dumping interpolated profiles to : "
<< traceFileName + "_interpolated" << nl
<< "Dumping profile values to: "
<< traceFileName + "_profile" << endl;
dumpFileDst << dstResultF << endl;
dumpFileSrc << srcF << endl;
dumpFileProfile << profileBandValues << endl;
} }
} }
template<class MasterPatch, class SlavePatch>
template<class Type>
void MixingPlaneInterpolation<MasterPatch, SlavePatch>::maskedTransform
(
Field<Type>& transField,
const tensorField& t,
const Field<Type>& inField,
const labelList& mask
)
{
// The profile to dst transfer is done by distributing the
// average value accordingly to the dst weighting factors
forAll (mask, maskI)
{
// Pick the masked face
const label faceI = mask[maskI];
transField[maskI] = transform(t[faceI], inField[maskI]);
}
}
template<class MasterPatch, class SlavePatch>
template<class Type>
void MixingPlaneInterpolation<MasterPatch, SlavePatch>::interpolate
(
const Field<Type>& srcF,
const labelListList& srcAddr,
const scalarListList& srcWeights,
const labelListList& dstAddr,
const scalarListList& dstWeights,
Field<Type>& dstResultF
) const
{
Field<Type> profileBandValues(nProfileBands(), pTraits<Type>::zero);
// Interpolate from patch to profile
toProfile
(
srcF,
srcAddr,
srcWeights,
profileBandValues
);
// profileBandValues are now the circumferentially averaged values
// Collect from profile to patch
fromProfile
(
profileBandValues,
dstAddr,
dstWeights,
dstResultF
);
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class MasterPatch, class SlavePatch> template<class MasterPatch, class SlavePatch>
@ -206,7 +210,7 @@ MixingPlaneInterpolation<MasterPatch, SlavePatch>::masterToSlave
FatalErrorIn FatalErrorIn
( (
"MixingPlaneInterpolation::masterToSlave(" "MixingPlaneInterpolation::masterToSlave("
"const Field<Type> ff)" "const Field<Type> ff) const"
) << "given field does not correspond to patch. Patch size: " ) << "given field does not correspond to patch. Patch size: "
<< masterPatch_.size() << " field size: " << patchFF.size() << masterPatch_.size() << " field size: " << patchFF.size()
<< abort(FatalError); << abort(FatalError);
@ -216,16 +220,6 @@ MixingPlaneInterpolation<MasterPatch, SlavePatch>::masterToSlave
// MB: We need this back // MB: We need this back
Field<Type> profileFF = transform(masterPatchToProfileT(), patchFF); Field<Type> profileFF = transform(masterPatchToProfileT(), patchFF);
if (debug > 1)
{
Info << "MixingPlaneInterpolation<MasterPatch, SlavePatch>::masterToSlave: "
<< "patchFF: " << patchFF << endl
<< "profileFF: " << profileFF << endl
<< "masterPatchToProfileT(): " << masterPatchToProfileT() << endl
<< "slaveProfileToPatchT(): " << slaveProfileToPatchT() << endl
<< endl;
}
// Do interpolation // Do interpolation
tmp<Field<Type> > tresult tmp<Field<Type> > tresult
( (
@ -243,14 +237,14 @@ MixingPlaneInterpolation<MasterPatch, SlavePatch>::masterToSlave
profileFF, // Master data in 'profile space' profileFF, // Master data in 'profile space'
masterPatchToProfileAddr(), // From master: compute the average masterPatchToProfileAddr(), // From master: compute the average
masterPatchToProfileWeights(), masterPatchToProfileWeights(),
slaveProfileToPatchAddr(), // To slave we distribute the average from slaveProfileToPatchAddr(), // To slave distribute average from
slaveProfileToPatchWeights(), // profile to patch slaveProfileToPatchWeights(), // profile to patch
result result
); );
// Apply transform to bring the slave field back from 'profile space' // Apply transform to bring the slave field back from 'profile space'
// to 'patch space' // to 'patch space'
transform(result, slaveProfileToPatchT(), result); // MB: We need this back transform(result, slaveProfileToPatchT(), result);
return tresult; return tresult;
} }
@ -283,7 +277,7 @@ MixingPlaneInterpolation<MasterPatch, SlavePatch>::slaveToMaster
FatalErrorIn FatalErrorIn
( (
"MixingPlaneInterpolation::slaveToMaster(" "MixingPlaneInterpolation::slaveToMaster("
"const Field<Type> ff)" "const Field<Type> ff) const"
) << "given field does not correspond to patch. Patch size: " ) << "given field does not correspond to patch. Patch size: "
<< slavePatch_.size() << " field size: " << patchFF.size() << slavePatch_.size() << " field size: " << patchFF.size()
<< abort(FatalError); << abort(FatalError);
@ -292,16 +286,6 @@ MixingPlaneInterpolation<MasterPatch, SlavePatch>::slaveToMaster
// Move slave data from 'patch space' to 'profile space' // Move slave data from 'patch space' to 'profile space'
Field<Type> profileFF = transform(slavePatchToProfileT(), patchFF); Field<Type> profileFF = transform(slavePatchToProfileT(), patchFF);
if (debug > 1)
{
Info << "MixingPlaneInterpolation<MasterPatch, SlavePatch>::slaveToMaster: "
<< "patchFF: " << patchFF << endl
<< "profileFF: " << profileFF << endl
<< "slavePatchToProfileT(): " << slavePatchToProfileT() << endl
<< "masterProfileToPatchT(): " << masterProfileToPatchT() << endl
<< endl;
}
// Do interpolation // Do interpolation
tmp<Field<Type> > tresult tmp<Field<Type> > tresult
( (
@ -345,6 +329,334 @@ MixingPlaneInterpolation<MasterPatch, SlavePatch>::slaveToMaster
return tint; return tint;
} }
template<class MasterPatch, class SlavePatch>
template<class Type>
tmp<Field<Type> >
MixingPlaneInterpolation<MasterPatch, SlavePatch>::masterToProfile
(
const Field<Type>& patchFF
) const
{
if (patchFF.size() != masterPatch_.size())
{
FatalErrorIn
(
"MixingPlaneInterpolation::masterToProfile("
"const Field<Type> ff) const"
) << "given field does not correspond to patch. Patch size: "
<< masterPatch_.size() << " field size: " << patchFF.size()
<< abort(FatalError);
}
// Move master data from 'patch space' to 'profile space'
Field<Type> profileFF = transform(masterPatchToProfileT(), patchFF);
// Do interpolation
tmp<Field<Type> > tresult
(
new Field<Type>
(
nProfileBands(),
pTraits<Type>::zero
)
);
Field<Type>& result = tresult();
toProfile
(
profileFF, // Master data in 'profile space'
masterPatchToProfileAddr(), // From master: compute the average
masterPatchToProfileWeights(),
result
);
return tresult;
}
template<class MasterPatch, class SlavePatch>
template<class Type>
tmp<Field<Type> >
MixingPlaneInterpolation<MasterPatch, SlavePatch>::masterToProfile
(
const tmp<Field<Type> >& tff
) const
{
tmp<Field<Type> > tint = masterToProfile(tff());
tff.clear();
return tint;
}
template<class MasterPatch, class SlavePatch>
template<class Type>
tmp<Field<Type> >
MixingPlaneInterpolation<MasterPatch, SlavePatch>::slaveToProfile
(
const Field<Type>& patchFF
) const
{
if (patchFF.size() != slavePatch_.size())
{
FatalErrorIn
(
"MixingPlaneInterpolation::slaveToProfile("
"const Field<Type> ff) const"
) << "given field does not correspond to patch. Patch size: "
<< slavePatch_.size() << " field size: " << patchFF.size()
<< abort(FatalError);
}
// Move slave data from 'patch space' to 'profile space'
Field<Type> profileFF = transform(slavePatchToProfileT(), patchFF);
// Do interpolation
tmp<Field<Type> > tresult
(
new Field<Type>
(
nProfileBands(),
pTraits<Type>::zero
)
);
Field<Type>& result = tresult();
toProfile
(
profileFF, // Slave data in 'profile space'
slavePatchToProfileAddr(), // From slave: compute the average
slavePatchToProfileWeights(),
result
);
return tresult;
}
template<class MasterPatch, class SlavePatch>
template<class Type>
tmp<Field<Type> >
MixingPlaneInterpolation<MasterPatch, SlavePatch>::slaveToProfile
(
const tmp<Field<Type> >& tff
) const
{
tmp<Field<Type> > tint = slaveToProfile(tff());
tff.clear();
return tint;
}
template<class MasterPatch, class SlavePatch>
template<class Type>
tmp<Field<Type> >
MixingPlaneInterpolation<MasterPatch, SlavePatch>::profileToMaster
(
const Field<Type>& profileFF
) const
{
if (profileFF.size() != nProfileBands())
{
FatalErrorIn
(
"MixingPlaneInterpolation::profileToMaster("
"const Field<Type> ff) const"
) << "given field does not correspond to profile. Profile size: "
<< nProfileBands() << " field size: " << profileFF.size()
<< abort(FatalError);
}
// Do interpolation
tmp<Field<Type> > tresult
(
new Field<Type>
(
masterPatch_.size(),
pTraits<Type>::zero
)
);
Field<Type>& result = tresult();
fromProfile
(
profileFF, // Master data in 'profile space'
masterProfileToPatchAddr(), // To master: distribute the average
masterProfileToPatchWeights(),
result
);
// Apply transform to bring the master field back from 'profile space'
// to 'patch space'
transform(result, masterProfileToPatchT(), result);
return tresult;
}
template<class MasterPatch, class SlavePatch>
template<class Type>
tmp<Field<Type> >
MixingPlaneInterpolation<MasterPatch, SlavePatch>::profileToMaster
(
const tmp<Field<Type> >& tff
) const
{
tmp<Field<Type> > tint = profileToMaster(tff());
tff.clear();
return tint;
}
template<class MasterPatch, class SlavePatch>
template<class Type>
void MixingPlaneInterpolation<MasterPatch, SlavePatch>::maskedProfileToMaster
(
const Field<Type>& profileFF,
Field<Type>& result,
const labelList& mask
) const
{
if (profileFF.size() != nProfileBands() || result.size() != mask.size())
{
FatalErrorIn
(
"bvoid MixingPlaneInterpolation<MasterPatch, SlavePatch>::"
"maskedProfileToMaster\n"
"(\n"
" const Field<Type>& profileFF,\n"
" Field<Type>& result,\n"
" const labelList& mask\n"
") const"
) << "given field does not correspond to profile. Profile size: "
<< nProfileBands() << " field size: " << profileFF.size()
<< " result size: " << result.size()
<< " mask size: " << mask.size()
<< abort(FatalError);
}
// Do interpolation
maskedFromProfile
(
profileFF, // Master data in 'profile space'
masterProfileToPatchAddr(), // To master: distribute the average
masterProfileToPatchWeights(),
result,
mask
);
// Apply transform to bring the master field back from 'profile space'
// to 'patch space'
maskedTransform(result, masterProfileToPatchT(), result, mask);
}
template<class MasterPatch, class SlavePatch>
template<class Type>
tmp<Field<Type> >
MixingPlaneInterpolation<MasterPatch, SlavePatch>::profileToSlave
(
const Field<Type>& profileFF
) const
{
if (profileFF.size() != nProfileBands())
{
FatalErrorIn
(
"MixingPlaneInterpolation::profileToSlave("
"const Field<Type> ff) const"
) << "given field does not correspond to profile. Profile size: "
<< nProfileBands() << " field size: " << profileFF.size()
<< abort(FatalError);
}
// Do interpolation
tmp<Field<Type> > tresult
(
new Field<Type>
(
slavePatch_.size(),
pTraits<Type>::zero
)
);
Field<Type>& result = tresult();
fromProfile
(
profileFF, // Slave data in 'profile space'
slaveProfileToPatchAddr(), // To slave distribute average from
slaveProfileToPatchWeights(), // profile to patch
result
);
// Apply transform to bring the slave field back from 'profile space'
// to 'patch space'
transform(result, slaveProfileToPatchT(), result);
return tresult;
}
template<class MasterPatch, class SlavePatch>
template<class Type>
tmp<Field<Type> >
MixingPlaneInterpolation<MasterPatch, SlavePatch>::profileToSlave
(
const tmp<Field<Type> >& tff
) const
{
tmp<Field<Type> > tint = profileToSlave(tff());
tff.clear();
return tint;
}
template<class MasterPatch, class SlavePatch>
template<class Type>
void MixingPlaneInterpolation<MasterPatch, SlavePatch>::maskedProfileToSlave
(
const Field<Type>& profileFF,
Field<Type>& result,
const labelList& mask
) const
{
if (profileFF.size() != nProfileBands() || result.size() != mask.size())
{
FatalErrorIn
(
"void MixingPlaneInterpolation<MasterPatch, SlavePatch>::"
"maskedProfileToSlave\n"
"(\n"
" const Field<Type>& profileFF,\n"
" Field<Type>& result,\n"
" const labelList& mask\n"
") const"
) << "given field does not correspond to profile. Profile size: "
<< nProfileBands() << " field size: " << profileFF.size()
<< " result size: " << result.size()
<< " mask size: " << mask.size()
<< abort(FatalError);
}
maskedFromProfile
(
profileFF, // Slave data in 'profile space'
slaveProfileToPatchAddr(), // To slave distribute average from
slaveProfileToPatchWeights(), // profile to patch
result,
mask
);
// Apply transform to bring the slave field back from 'profile space'
// to 'patch space'
maskedTransform(result, slaveProfileToPatchT(), result, mask);
}
template<class MasterPatch, class SlavePatch> template<class MasterPatch, class SlavePatch>
template<class Type> template<class Type>
tmp<Field<Type> > tmp<Field<Type> >
@ -367,15 +679,6 @@ MixingPlaneInterpolation<MasterPatch, SlavePatch>::masterToMaster
// Move master data from 'patch space' to 'profile space' // Move master data from 'patch space' to 'profile space'
Field<Type> profileFF = transform(masterPatchToProfileT(), patchFF); Field<Type> profileFF = transform(masterPatchToProfileT(), patchFF);
if (debug > 1)
{
Info << "MixingPlaneInterpolation<MasterPatch, SlavePatch>::masterToMaster: "
<< "patchFF: " << patchFF << endl
<< "profileFF: " << profileFF << endl
<< "masterPatchToProfileT(): " << masterPatchToProfileT() << endl
<< endl;
}
// Do interpolation // Do interpolation
tmp<Field<Type> > tresult tmp<Field<Type> > tresult
( (
@ -393,7 +696,7 @@ MixingPlaneInterpolation<MasterPatch, SlavePatch>::masterToMaster
profileFF, // Master data in 'profile space' profileFF, // Master data in 'profile space'
masterPatchToProfileAddr(), // From master: compute the average masterPatchToProfileAddr(), // From master: compute the average
masterPatchToProfileWeights(), masterPatchToProfileWeights(),
masterProfileToPatchAddr(), // To master: distribute the average masterProfileToPatchAddr(), // To master: distribute the average
masterProfileToPatchWeights(), masterProfileToPatchWeights(),
result result
); );
@ -405,6 +708,7 @@ MixingPlaneInterpolation<MasterPatch, SlavePatch>::masterToMaster
return tresult; return tresult;
} }
template<class MasterPatch, class SlavePatch> template<class MasterPatch, class SlavePatch>
template<class Type> template<class Type>
tmp<Field<Type> > tmp<Field<Type> >
@ -418,6 +722,7 @@ MixingPlaneInterpolation<MasterPatch, SlavePatch>::masterToMaster
return tint; return tint;
} }
template<class MasterPatch, class SlavePatch> template<class MasterPatch, class SlavePatch>
template<class Type> template<class Type>
tmp<Field<Type> > tmp<Field<Type> >
@ -440,15 +745,6 @@ MixingPlaneInterpolation<MasterPatch, SlavePatch>::slaveToSlave
// Move slave data from 'patch space' to 'profile space' // Move slave data from 'patch space' to 'profile space'
Field<Type> profileFF = transform(slavePatchToProfileT(), patchFF); Field<Type> profileFF = transform(slavePatchToProfileT(), patchFF);
if (debug > 1)
{
Info << "MixingPlaneInterpolation<MasterPatch, SlavePatch>::slaveToSlave: "
<< "patchFF: " << patchFF << endl
<< "profileFF: " << profileFF << endl
<< "slavePatchToProfileT(): " << slavePatchToProfileT() << endl
<< endl;
}
// Do interpolation // Do interpolation
tmp<Field<Type> > tresult tmp<Field<Type> > tresult
( (
@ -462,14 +758,14 @@ MixingPlaneInterpolation<MasterPatch, SlavePatch>::slaveToSlave
Field<Type>& result = tresult(); Field<Type>& result = tresult();
interpolate interpolate
( (
profileFF, // Slave data in 'profile space' profileFF, // Slave data in 'profile space'
slavePatchToProfileAddr(), // From slave: compute the average slavePatchToProfileAddr(), // From slave: compute the average
slavePatchToProfileWeights(), slavePatchToProfileWeights(),
slaveProfileToPatchAddr(), // To slave: distribute the average slaveProfileToPatchAddr(), // To slave: distribute the average
slaveProfileToPatchWeights(), slaveProfileToPatchWeights(),
result result
); );
// Apply transform to bring the slave field back from 'profile space' // Apply transform to bring the slave field back from 'profile space'
// to 'patch space' // to 'patch space'
@ -478,6 +774,7 @@ MixingPlaneInterpolation<MasterPatch, SlavePatch>::slaveToSlave
return tresult; return tresult;
} }
template<class MasterPatch, class SlavePatch> template<class MasterPatch, class SlavePatch>
template<class Type> template<class Type>
tmp<Field<Type> > tmp<Field<Type> >

View file

@ -29,8 +29,8 @@ Description
Radial basis function interpolation class Radial basis function interpolation class
Description Description
Interpolation class which uses Radial Basis Functions to interpolate the Interpolation class which uses Radial Basis Functions to interpolate
fluid displacements for given boundary displacements. field from given data points to arbitrary set of points.
The coefficient vectors, alpha and beta are determined by solving The coefficient vectors, alpha and beta are determined by solving
the system: the system:
@ -38,25 +38,17 @@ Description
| db | = | Mbb Pb | | alpha | | db | = | Mbb Pb | | alpha |
| 0 | | Pb 0 | | beta | | 0 | | Pb 0 | | beta |
where db are the given boundary displacements, where db are the given field values at data carrier points.
Mbb the boundary RBF correlation matrix (NbxNb), containing RBF evaluations Mbb the boundary RBF correlation matrix (NbxNb), containing RBF evaluations
at the boundary nodes, and Pb some linear polynomial matrix (Nbx4). at the boundary nodes, and Pb some linear polynomial matrix (Nbx4).
Those coefficients are calculated every timestep, with the current In cases where far field data is not of interest, a cutoff function
boundary displacements db, with the inverse of Mbb. Using those is used to eliminate unnecessary data points in the far field
coefficients, the RBF is evaluated at all fluid points every
timestep.
The efficiency of this method is increased by:
1) using control points which is a subset of the moving
boundary points. Those control points are selected by
a coarsening function.
2) The outer boundary points are neglected since a cutoff function
is used toward the outer boundaries.
Author Author
Frank Bos, TU Delft. All rights reserved. Frank Bos, TU Delft. All rights reserved.
Dubravko Matijasevic, FSB Zagreb. Dubravko Matijasevic, FSB Zagreb.
Reorganisation by Hrvoje Jasak, Wikki Ltd.
SourceFiles SourceFiles
RBFInterpolation.C RBFInterpolation.C
@ -90,7 +82,7 @@ class RBFInterpolation
const vectorField& controlPoints_; const vectorField& controlPoints_;
//- Reference to all points //- Reference to all points
const vectorField& allPoints_; const vectorField& dataPoints_;
//- RBF function //- RBF function
autoPtr<RBFFunction> RBF_; autoPtr<RBFFunction> RBF_;
@ -136,7 +128,7 @@ public:
( (
const dictionary& dict, const dictionary& dict,
const vectorField& controlPoints, const vectorField& controlPoints,
const vectorField& allPoints const vectorField& dataPoints
); );
//- Construct as copy //- Construct as copy
@ -150,6 +142,18 @@ public:
// Member Functions // Member Functions
//- Return reference to control points
const vectorField& controlPoints() const
{
return controlPoints_;
}
//- Reference to all points
const vectorField& dataPoints() const
{
return dataPoints_;
}
//- Interpolate //- Interpolate
template<class Type> template<class Type>
tmp<Field<Type> > interpolate(const Field<Type>& ctrlField) const; tmp<Field<Type> > interpolate(const Field<Type>& ctrlField) const;

View file

@ -105,7 +105,7 @@ Foam::BlockAmgSolver<Type>::solve
solverPerf.finalResidual() = gSum(cmptMag(wA))/norm; solverPerf.finalResidual() = gSum(cmptMag(wA))/norm;
solverPerf.nIterations()++; solverPerf.nIterations()++;
} while (!stop(solverPerf)); } while (!this->stop(solverPerf));
} }
return solverPerf; return solverPerf;

View file

@ -93,7 +93,7 @@ Foam::BlockBiCGStabSolver<Type>::solve
// Check convergence, solve if not converged // Check convergence, solve if not converged
if (!stop(solverPerf)) if (!this->stop(solverPerf))
{ {
scalar rho = this->great_; scalar rho = this->great_;
scalar rhoOld = rho; scalar rhoOld = rho;

View file

@ -92,7 +92,7 @@ typename Foam::BlockSolverPerformance<Type> Foam::BlockCGSolver<Type>::solve
// Check convergence, solve if not converged // Check convergence, solve if not converged
if (!stop(solverPerf)) if (!this->stop(solverPerf))
{ {
scalar rho = this->great_; scalar rho = this->great_;
scalar rhoOld = rho; scalar rhoOld = rho;

View file

@ -128,7 +128,7 @@ Foam::BlockGMRESSolver<Type>::solve
// Check convergence, solve if not converged // Check convergence, solve if not converged
if (!stop(solverPerf)) if (!this->stop(solverPerf))
{ {
// Create the Hesenberg matrix // Create the Hesenberg matrix
scalarSquareMatrix H(nDirs_, 0); scalarSquareMatrix H(nDirs_, 0);

View file

@ -86,7 +86,7 @@ Foam::BlockGaussSeidelSolver<Type>::solve
// Check convergence, solve if not converged // Check convergence, solve if not converged
if (!stop(solverPerf)) if (!this->stop(solverPerf))
{ {
// Iteration loop // Iteration loop

View file

@ -41,11 +41,6 @@ engineTopoChangerMesh/deformingEngineMesh/deformingEngineMeshInitialize.C
engineTopoChangerMesh/deformingEngineMesh/deformingEngineMeshMove.C engineTopoChangerMesh/deformingEngineMesh/deformingEngineMeshMove.C
engineTopoChangerMesh/deformingEngineMesh/addDeformingEngineMeshZones.C engineTopoChangerMesh/deformingEngineMesh/addDeformingEngineMeshZones.C
engineTopoChangerMesh/deformingEngineMesh/deformingEngineMesh.C
engineTopoChangerMesh/deformingEngineMesh/deformingEngineMeshInitialize.C
engineTopoChangerMesh/deformingEngineMesh/deformingEngineMeshMove.C
engineTopoChangerMesh/deformingEngineMesh/addDeformingEngineMeshZones.C
engineTopoChangerMesh/engineValveSliding/addEngineValveSlidingMeshModifiers.C engineTopoChangerMesh/engineValveSliding/addEngineValveSlidingMeshModifiers.C
engineTopoChangerMesh/engineValveSliding/engineValveSliding.C engineTopoChangerMesh/engineValveSliding/engineValveSliding.C
engineTopoChangerMesh/engineValveSliding/engineValveSlidingInitialize.C engineTopoChangerMesh/engineValveSliding/engineValveSlidingInitialize.C

View file

@ -140,7 +140,7 @@ gaussGrad<Type>::grad
GeometricField<GradType, fvPatchField, volMesh>& gGrad = tgGrad(); GeometricField<GradType, fvPatchField, volMesh>& gGrad = tgGrad();
gGrad.rename("grad(" + vsf.name() + ')'); gGrad.rename("grad(" + vsf.name() + ')');
correctBoundaryConditions(vsf, gGrad); this->correctBoundaryConditions(vsf, gGrad);
return tgGrad; return tgGrad;
} }

View file

@ -2,7 +2,7 @@
c++WARN = -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor c++WARN = -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor
CC = ccache g++ -m64 CC = g++ -m64
include $(RULES)/c++$(WM_COMPILE_OPTION) include $(RULES)/c++$(WM_COMPILE_OPTION)