Menu

#301 conjugateHeatTransfer library fails to work properly when there are more than 15 materials in a simulation case

new
None
normal
minor
Always
none
Bug
openSUSE-13.2
other
2016-01-17
2016-01-17
Sergei
No

Library source files are located here: $WM_PROJECT_DIR/applications/solvers/coupled/
The bug is in the file conjugateHeatTransfer/thermalModel/thermalLaws/multiMaterialThermal/multiMaterialThermal.C, in the function multiMaterialThermal::indicator (const label) const to be more specific:

//- $WM_PROJECT_DIR/applications/solvers/coupled/conjugateHeatTransfer/thermalModel/thermalLaws/multiMaterialThermal/multiMaterialThermal.C
Foam::tmp<Foam::volScalarField> Foam::multiMaterialThermal::indicator
(
    const label i
) const
{
    const scalarField& mat = materials_.internalField();

    tmp<volScalarField> tresult
    (
        new volScalarField
        (
            IOobject
            (
                "indicator",
                mesh().time().timeName(),
                mesh(),
                IOobject::NO_READ,
                IOobject::NO_WRITE
            ),
            mesh(),
            dimless,
            zeroGradientFvPatchScalarField::typeName
        )
    );

    volScalarField& result = tresult();

    forAll (mat, matI)
    {
        if (mat[matI] > i - SMALL && mat[matI] < i + SMALL)
        {
            result[matI] = 1.0;
        }
        else
        {
            result[matI] = 0.0;
        }
    }

    result.correctBoundaryConditions();

    return tresult;
}

the code block if (mat[matI] > i - SMALL && mat[matI] < i + SMALL) checks whether the matI'th cell is of the i'th material. If so, the indicator is set to one, otherwise it is zero. Everithing is fine while i<16. When i>=16 this check is always false for all cells because of round-off error (SMALL=1e-15):

mat[matI] > i - SMALL && mat[matI] < i + SMALL
(16.0 > (16 - 1.e-15)) && (16.0 < (16 + 1.e-15)) 
(16.0 > 16.0) && (16.0 < 16.0) is false.

And the returned tresultconsists of zeros.multiMaterialThermal::indicator(label i)is invoked inmultiMaterialThermal::k()`:

Foam::tmp<Foam::volScalarField> Foam::multiMaterialThermal::k() const
{
    tmp<volScalarField> tresult
    (
        new volScalarField
        (
            IOobject
            (
                "kTmp",
                mesh().time().timeName(),
                mesh(),
                IOobject::NO_READ,
                IOobject::NO_WRITE
            ),
            mesh(),
            dimensionedScalar("zerok", dimensionSet(1, 1, -3, -1, 0), 0),
            calculatedFvPatchScalarField::typeName
        )
    );
    volScalarField& result = tresult();

    // Accumulate data for all fields
    const PtrList<thermalLaw>& laws = *this;

    forAll (laws, lawI)
    {
        result += indicator(lawI)*laws[lawI].k();
    }

    return tresult;
}

This function returns thermal conductivity field and it is zero all the way for lawI>=16.
The library conjugateHeatTransfer is used, for example, in conjugateHeatSimpleFoam solver, which blows up when thermal conductivity is zero in a cell.
To me, there is no point in defining materials_ as volScalarField. It should be rather defined as volLabelField. My superficial attempt to make modifications to the code wasn't successful:

+ wmake libso myConjugateHeatTransfer
Making dependency list for source file thermalModel/thermalLaws/multiMaterialThermal/multiMaterialThermal.C
Making dependency list for source file thermalModel/thermalLaws/multiMaterialZonesThermal/multiMaterialZonesThermal.C
SOURCE=thermalModel/thermalLaws/multiMaterialThermal/multiMaterialThermal.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-200 -I/opt/foam/foam-extend-3.2/src/finiteVolume/lnInclude     -I/opt/foam/foam-extend-3.2/src/thermophysicalModels/radiation/lnInclude     -I/opt/foam/foam-extend-3.2/src/thermophysicalModels/basic/lnInclude     -I/opt/foam/foam-extend-3.2/src/VectorN/lnInclude -IlnInclude -I. -I/opt/foam/foam-extend-3.2/src/foam/lnInclude -I/opt/foam/foam-extend-3.2/src/OSspecific/POSIX/lnInclude   -fPIC -c $SOURCE -o Make/linux64GccDPOpt/multiMaterialThermal.o
SOURCE=thermalModel/thermalLaws/multiMaterialZonesThermal/multiMaterialZonesThermal.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-200 -I/opt/foam/foam-extend-3.2/src/finiteVolume/lnInclude     -I/opt/foam/foam-extend-3.2/src/thermophysicalModels/radiation/lnInclude     -I/opt/foam/foam-extend-3.2/src/thermophysicalModels/basic/lnInclude     -I/opt/foam/foam-extend-3.2/src/VectorN/lnInclude -IlnInclude -I. -I/opt/foam/foam-extend-3.2/src/foam/lnInclude -I/opt/foam/foam-extend-3.2/src/OSspecific/POSIX/lnInclude   -fPIC -c $SOURCE -o Make/linux64GccDPOpt/multiMaterialZonesThermal.o
In file included from /opt/foam/foam-extend-3.2/src/foam/lnInclude/Field.C:27:0,
                 from /opt/foam/foam-extend-3.2/src/foam/lnInclude/Field.H:369,                                                                                                                                
                 from /opt/foam/foam-extend-3.2/src/foam/lnInclude/DimensionedField.H:42,                                                                                                                      
                 from /opt/foam/foam-extend-3.2/src/foam/lnInclude/GeometricField.H:44,                                                                                                                        
                 from /opt/foam/foam-extend-3.2/src/foam/lnInclude/GeometricScalarField.H:38,                                                                                                                  
                 from /opt/foam/foam-extend-3.2/src/foam/lnInclude/GeometricFields.H:34,                                                                                                                       
                 from /opt/foam/foam-extend-3.2/src/finiteVolume/lnInclude/volFields.H:38,                                                                                                                     
                 from lnInclude/thermalLaw.H:45,                                                                                                                                                               
                 from lnInclude/multiMaterialThermal.H:41,
                 from thermalModel/thermalLaws/multiMaterialZonesThermal/multiMaterialZonesThermal.H:41,
                 from thermalModel/thermalLaws/multiMaterialZonesThermal/multiMaterialZonesThermal.C:26:
/opt/foam/foam-extend-3.2/src/foam/lnInclude/FieldFunctions.C: In instantiation of ‘void Foam::cmptMultiply(Foam::Field<Type>&, const Foam::UList<T>&, const Foam::UList<T>&) [with Type = int]’:
/opt/foam/foam-extend-3.2/src/foam/lnInclude/FieldFunctions.C:531:1:   required from ‘Foam::tmp<Foam::Field<Type> > Foam::cmptMultiply(const Foam::UList<T>&, const Foam::tmp<Foam::Field<Type> >&) [with Type = int]’
/opt/foam/foam-extend-3.2/src/finiteVolume/lnInclude/fvPatchField.C:331:13:   required from ‘void Foam::fvPatchField<Type>::patchFlux(Foam::GeometricField<Type, Foam::fvsPatchField, Foam::surfaceMesh>&, const Foam::fvMatrix<Type>&) const [with Type = int]’
thermalModel/thermalLaws/multiMaterialZonesThermal/multiMaterialZonesThermal.C:93:2:   required from here
/opt/foam/foam-extend-3.2/src/foam/lnInclude/FieldM.H:166:61: error: call of overloaded ‘cmptMultiply(const int&, const int&)’ is ambiguous
         OP FUNC(List_ELEM(f2, f2P, i), List_ELEM(f3, f3P, i));              \
                                                             ^
/opt/foam/foam-extend-3.2/src/foam/lnInclude/FieldFunctionsM.C:97:5: note: in expansion of macro ‘TFOR_ALL_F_OP_FUNC_F_F’
     TFOR_ALL_F_OP_FUNC_F_F                                                    \
     ^
/opt/foam/foam-extend-3.2/src/foam/lnInclude/FieldFunctions.C:531:1: note: in expansion of macro ‘BINARY_FUNCTION’
 BINARY_FUNCTION(Type, Type, Type, cmptMultiply)
 ^
/opt/foam/foam-extend-3.2/src/foam/lnInclude/FieldM.H:166:61: note: candidates are:
         OP FUNC(List_ELEM(f2, f2P, i), List_ELEM(f3, f3P, i));              \
                                                             ^
/opt/foam/foam-extend-3.2/src/foam/lnInclude/FieldFunctionsM.C:97:5: note: in expansion of macro ‘TFOR_ALL_F_OP_FUNC_F_F’
     TFOR_ALL_F_OP_FUNC_F_F                                                    \
     ^
/opt/foam/foam-extend-3.2/src/foam/lnInclude/FieldFunctions.C:531:1: note: in expansion of macro ‘BINARY_FUNCTION’
 BINARY_FUNCTION(Type, Type, Type, cmptMultiply)
 ^
1 Attachments

Discussion


Log in to post a comment.

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.