mirror of
https://github.com/OPM/opm-simulators.git
synced 2024-12-22 15:33:29 -06:00
make the property system work with multiple compile units
so far, the linker bailed out due to duplicate definitions of variables if multiple compile units used the same type tag. This is problematic if the sources are split into separate compile units and that use the same type tag; in particular, this applies for traditional libraries. Due to various C++ peculiarities, this patch complicates the internal implementation of the property system quite a bit, but given that the usage of it (as well as the compile time) stay unchanged, I do not consider this to be a big problem. Note that the introspection code is particularly problematic because it needs static initializers that do not cause the linker to choke in the case of multiple compile units. Finally, to prevent future regressions, this patch adds a unit test for the lens problem which uses multiple compile units. (This test is called lens_immiscible_ecfv_ad_mcu and basically identical to the existing lens_immiscible_ecfv_ad test and I thus think that it is pretty unimaginative -- improvement proposals are welcome.)
This commit is contained in:
parent
69ad7630d6
commit
b93a61fd38
@ -28,25 +28,9 @@
|
||||
*/
|
||||
#include "config.h"
|
||||
|
||||
#include "lens_immiscible_ecfv_ad.hh"
|
||||
|
||||
#include <ewoms/common/start.hh>
|
||||
#include <ewoms/models/immiscible/immisciblemodel.hh>
|
||||
#include <ewoms/disc/ecfv/ecfvdiscretization.hh>
|
||||
#include "problems/lensproblem.hh"
|
||||
|
||||
namespace Ewoms {
|
||||
namespace Properties {
|
||||
NEW_TYPE_TAG(LensProblemEcfvAd, INHERITS_FROM(ImmiscibleTwoPhaseModel, LensBaseProblem));
|
||||
|
||||
// use the element centered finite volume spatial discretization
|
||||
SET_TAG_PROP(LensProblemEcfvAd, SpatialDiscretizationSplice, EcfvDiscretization);
|
||||
|
||||
// use automatic differentiation for this simulator
|
||||
SET_TAG_PROP(LensProblemEcfvAd, LocalLinearizerSplice, AutoDiffLocalLinearizer);
|
||||
|
||||
// this problem works fine if the linear solver uses single precision scalars
|
||||
SET_TYPE_PROP(LensProblemEcfvAd, LinearSolverScalar, float);
|
||||
|
||||
}}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
|
50
examples/lens_immiscible_ecfv_ad.hh
Normal file
50
examples/lens_immiscible_ecfv_ad.hh
Normal file
@ -0,0 +1,50 @@
|
||||
// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
// vi: set et ts=4 sw=4 sts=4:
|
||||
/*
|
||||
This file is part of the Open Porous Media project (OPM).
|
||||
|
||||
OPM is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
OPM is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OPM. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Consult the COPYING file in the top-level source directory of this
|
||||
module for the precise wording of the license and the list of
|
||||
copyright holders.
|
||||
*/
|
||||
/*!
|
||||
* \file
|
||||
*
|
||||
* \brief Two-phase test for the immiscible model which uses the element-centered finite
|
||||
* volume discretization in conjunction with automatic differentiation
|
||||
*/
|
||||
#ifndef EWOMS_LENS_IMMISCIBLE_ECFV_AD_HH
|
||||
#define EWOMS_LENS_IMMISCIBLE_ECFV_AD_HH
|
||||
|
||||
#include <ewoms/models/immiscible/immisciblemodel.hh>
|
||||
#include <ewoms/disc/ecfv/ecfvdiscretization.hh>
|
||||
#include "problems/lensproblem.hh"
|
||||
|
||||
namespace Ewoms {
|
||||
namespace Properties {
|
||||
NEW_TYPE_TAG(LensProblemEcfvAd, INHERITS_FROM(ImmiscibleTwoPhaseModel, LensBaseProblem));
|
||||
|
||||
// use the element centered finite volume spatial discretization
|
||||
SET_TAG_PROP(LensProblemEcfvAd, SpatialDiscretizationSplice, EcfvDiscretization);
|
||||
|
||||
// use automatic differentiation for this simulator
|
||||
SET_TAG_PROP(LensProblemEcfvAd, LocalLinearizerSplice, AutoDiffLocalLinearizer);
|
||||
|
||||
// this problem works fine if the linear solver uses single precision scalars
|
||||
SET_TYPE_PROP(LensProblemEcfvAd, LinearSolverScalar, float);
|
||||
}}
|
||||
|
||||
#endif // EWOMS_LENS_IMMISCIBLE_ECFV_AD_HH
|
45
examples/lens_immiscible_ecfv_ad_cu1.cpp
Normal file
45
examples/lens_immiscible_ecfv_ad_cu1.cpp
Normal file
@ -0,0 +1,45 @@
|
||||
// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
// vi: set et ts=4 sw=4 sts=4:
|
||||
/*
|
||||
This file is part of the Open Porous Media project (OPM).
|
||||
|
||||
OPM is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
OPM is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OPM. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Consult the COPYING file in the top-level source directory of this
|
||||
module for the precise wording of the license and the list of
|
||||
copyright holders.
|
||||
*/
|
||||
/*!
|
||||
* \file
|
||||
*
|
||||
* \brief This test is identical to the simulation of the lens problem that uses the
|
||||
* element centered finite volume discretization in conjunction with automatic
|
||||
* differentiation (lens_immiscible_ecfv_ad).
|
||||
*
|
||||
* The only difference is that it uses multiple compile units in order to ensure that
|
||||
* eWoms code can be used within libraries that use the same type tag within multiple
|
||||
* compile units. This file represents the first compile unit and just defines an startup
|
||||
* function for the simulator.
|
||||
*/
|
||||
#include "config.h"
|
||||
|
||||
#include "lens_immiscible_ecfv_ad.hh"
|
||||
|
||||
#include <ewoms/common/start.hh>
|
||||
|
||||
int mainCU1(int argc, char **argv)
|
||||
{
|
||||
typedef TTAG(LensProblemEcfvAd) ProblemTypeTag;
|
||||
return Ewoms::start<ProblemTypeTag>(argc, argv);
|
||||
}
|
45
examples/lens_immiscible_ecfv_ad_cu2.cpp
Normal file
45
examples/lens_immiscible_ecfv_ad_cu2.cpp
Normal file
@ -0,0 +1,45 @@
|
||||
// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
// vi: set et ts=4 sw=4 sts=4:
|
||||
/*
|
||||
This file is part of the Open Porous Media project (OPM).
|
||||
|
||||
OPM is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
OPM is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OPM. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Consult the COPYING file in the top-level source directory of this
|
||||
module for the precise wording of the license and the list of
|
||||
copyright holders.
|
||||
*/
|
||||
/*!
|
||||
* \file
|
||||
*
|
||||
* \brief This test is identical to the simulation of the lens problem that uses the
|
||||
* element centered finite volume discretization in conjunction with automatic
|
||||
* differentiation (lens_immiscible_ecfv_ad).
|
||||
*
|
||||
* The only difference is that it uses multiple compile units in order to ensure that
|
||||
* eWoms code can be used within libraries that use the same type tag within multiple
|
||||
* compile units. This file represents the second compile unit and just defines an
|
||||
* startup function for the simulator.
|
||||
*/
|
||||
#include "config.h"
|
||||
|
||||
#include "lens_immiscible_ecfv_ad.hh"
|
||||
|
||||
#include <ewoms/common/start.hh>
|
||||
|
||||
int mainCU2(int argc, char **argv)
|
||||
{
|
||||
typedef TTAG(LensProblemEcfvAd) ProblemTypeTag;
|
||||
return Ewoms::start<ProblemTypeTag>(argc, argv);
|
||||
}
|
41
examples/lens_immiscible_ecfv_ad_main.cpp
Normal file
41
examples/lens_immiscible_ecfv_ad_main.cpp
Normal file
@ -0,0 +1,41 @@
|
||||
// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
// vi: set et ts=4 sw=4 sts=4:
|
||||
/*
|
||||
This file is part of the Open Porous Media project (OPM).
|
||||
|
||||
OPM is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
OPM is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OPM. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Consult the COPYING file in the top-level source directory of this
|
||||
module for the precise wording of the license and the list of
|
||||
copyright holders.
|
||||
*/
|
||||
/*!
|
||||
* \file
|
||||
*
|
||||
* \brief This test is identical to the simulation of the lens problem that uses the
|
||||
* element centered finite volume discretization in conjunction with automatic
|
||||
* differentiation (lens_immiscible_ecfv_ad).
|
||||
*
|
||||
* The only difference is that it uses multiple compile units in order to ensure that
|
||||
* eWoms code can be used within libraries that use the same type tag within multiple
|
||||
* compile units. This file calls contains main() and just calls the main entry point
|
||||
* defined by the first compile unit.
|
||||
*/
|
||||
int mainCU1(int argc, char **argv);
|
||||
int mainCU2(int argc, char **argv);
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
return mainCU1(argc, argv);
|
||||
}
|
Loading…
Reference in New Issue
Block a user