diff --git a/cmake/modules/DuneFemDgMacros.cmake b/cmake/modules/DuneFemDgMacros.cmake index 85157f73911ed68b5c99f60460a08d2c884f7cbf..e67dabea43a414d6c1e03494407c33c023639102 100644 --- a/cmake/modules/DuneFemDgMacros.cmake +++ b/cmake/modules/DuneFemDgMacros.cmake @@ -64,10 +64,12 @@ function(dune_add_test_case target paramfile ) set( abbr "${CMAKE_CURRENT_SOURCE_DIR}/" ) - set( default_params "fem.verboserank:0" "fem.prefix:${abbr}data/${paramfile}" "fem.prefix.input:${abbr}" "fem.eoc.outputpath:${abbr}data/${paramfile}" ) if( "${target}" STREQUAL NAME ) #First version of this function: we are creating a real new target + set( newTarget "${paramfile}" ) + #set( default_params "fem.verboserank:1" "fem.prefix:${abbr}data/${newTarget}" "fem.prefix.input:${abbr}" "fem.eoc.outputpath:${abbr}data/${newTarget}" ) + set( default_params "testcase.path:${abbr}" ) # default directory name for direct call (i.e. withouch testing tools) set( TESTCASE_OUTPUT "data" ) @@ -75,14 +77,19 @@ function(dune_add_test_case target paramfile ) set( TESTCASE_INPUT "parameter" ) # copy default parameter file to location of executable configure_file(${CMAKE_SOURCE_DIR}/cmake/scripts/parameter.in ${CMAKE_CURRENT_BINARY_DIR}/parameter ) - dune_add_test( ${target} ${paramfile} ${ARGN} CMD_ARGS ${CMAKE_CURRENT_SOURCE_DIR}/parameters/${paramfile} ${default_params} ) + #dune_add_test( NAME ${newTarget} ${ARGN} CMD_ARGS ${default_params} paramfile:parameters/${newTarget} ) + dune_add_test( NAME ${newTarget} ${ARGN} CMD_ARGS ${default_params} ) else() + set( newTarget "${target}_${paramfile}" ) + #set( default_params "fem.verboserank:1" "fem.prefix:${abbr}data/${newTarget}" "fem.prefix.input:${abbr}" "fem.eoc.outputpath:${abbr}data/${newTarget}" ) + set( default_params "testcase.path:${abbr}" "testcase:${paramfile}" ) + #Section version of this function: We just append another parameter file to an existing target if(NOT TARGET ${target}) message( ERROR "You have tried to create a test case depending on a non existing target '${target}'." ) endif() - add_test( NAME ${base_name}_${paramfile} - COMMAND ./${target} ${CMAKE_CURRENT_SOURCE_DIR}/parameters/${target}_${paramfile} ${default_params} ) + #add_test( NAME ${newTarget} COMMAND ./${target} ${default_params} paramfile:parameters/${newTarget} ) + add_test( NAME ${newTarget} COMMAND ./${target} ${default_params} ) endif() endfunction() @@ -104,12 +111,13 @@ macro(add_header_listing) file(GLOB_RECURSE HEADER_LIST "${CMAKE_CURRENT_SOURCE_DIR}/../${_mod}/*.hh" "${CMAKE_CURRENT_SOURCE_DIR}/../${_mod}/*.h" "${CMAKE_CURRENT_SOURCE_DIR}/../${_mod}/*.ui") list(APPEND COMMON_HEADER ${HEADER_LIST}) endforeach(_mod DEPENDENCIES) - set_source_files_properties(${COMMON_HEADER} PROPERTIES HEADER_FILE_ONLY 1) - add_custom_target(common_header SOURCES ${COMMON_HEADER}) + #set_source_files_properties(${COMMON_HEADER} PROPERTIES HEADER_FILE_ONLY 1) + #add_custom_target(common_header SOURCES ${COMMON_HEADER}) #needed at least one official target for finding header files in source code - dune_add_test( NAME _h SOURCES ${COMMON_HEADER} ) - set_target_properties(_h PROPERTIES LINKER_LANGUAGE CXX) + file(WRITE ${CMAKE_BINARY_DIR}/.qtcreator/main.cc "//this is a dummy file for including files into the project file structure of qtcreator\nint main(){}" ) + add_executable( qtcreator ${CMAKE_BINARY_DIR}/.qtcreator/main.cc ${COMMON_HEADER} ) + set_target_properties( qtcreator PROPERTIES LINKER_LANGUAGE CXX) endmacro(add_header_listing) macro(make_dependent_modules_sys_included) diff --git a/cmake/scripts/parameter.in b/cmake/scripts/parameter.in index c7a298b7267946302e73ebe36f17577fcd1560a9..d29a4dcddae869278a83f4ccde8928f877adcfd1 100644 --- a/cmake/scripts/parameter.in +++ b/cmake/scripts/parameter.in @@ -1,9 +1 @@ -# toggle verbosity of on process -# (-1: off, p: process p is verbose, in general 0 is a good choice) -fem.verboserank: 0 - -fem.prefix: ${CMAKE_CURRENT_SOURCE_DIR}/data/${TESTCASE_OUTPUT} # specify directory for data output (is created if not exists) -fem.prefix.input: ${CMAKE_CURRENT_SOURCE_DIR}/ -fem.eoc.outputpath: ${CMAKE_CURRENT_SOURCE_DIR}/data/${TESTCASE_OUTPUT} - -paramfile: parameters/${TESTCASE_INPUT} #real parameter file +testcase.path: ${CMAKE_CURRENT_SOURCE_DIR}/ diff --git a/dune/fem-dg/algorithm/caller/sub/adapt.hh b/dune/fem-dg/algorithm/caller/sub/adapt.hh index 09f84c424ebcfbbd66f559a1311d619940a75d48..437690bef18bb3f4ce98f37739198c857dfe9784 100644 --- a/dune/fem-dg/algorithm/caller/sub/adapt.hh +++ b/dune/fem-dg/algorithm/caller/sub/adapt.hh @@ -98,7 +98,7 @@ namespace Fem : sol_( sol ), adaptationHandler_( nullptr ), keyPrefix_( keyPrefix ), - adaptParam_( AdaptationParametersType( ParameterKey::generate( keyPrefix, "fem.adaptation." ) ) ), + adaptParam_( AdaptationParametersType( ParameterKey::generate( "", "fem.adaptation." ) ) ), indicator_( const_cast<GridPartType&>(sol_.gridPart()), model, tuple, keyPrefix_ ), estimator_( sol_.space(), model.problem(), adaptParam_ ) {} diff --git a/dune/fem-dg/examples/advdiff/main.cc b/dune/fem-dg/examples/advdiff/main.cc index edf0c460956eb76aaaa5f8cc89ad8cf4cae55d8b..790f3f0d32df4faa7296aa012feb2f5f11e2e1ca 100644 --- a/dune/fem-dg/examples/advdiff/main.cc +++ b/dune/fem-dg/examples/advdiff/main.cc @@ -10,15 +10,9 @@ int main(int argc, char ** argv) /* Initialize MPI (always do this even if you are not using MPI) */ Dune::Fem::MPIManager :: initialize( argc, argv ); try { - // *** Initialization - Dune::Fem::Parameter::append(argc,argv); - if (argc >= 2) - Dune::Fem::Parameter::append(argv[1]); - else - Dune::Fem::Parameter::append("parameter"); - - // write parameters used (before simulation starts) - Dune::Fem::Parameter::write("parameter.log"); + // read Parameters + if( !readParameters( argc, argv ) ) + return 1; Dune::Fem::AdvectionDiffusionAlgorithmCreator<Dune::GridSelector::GridType> algorithmCreator; diff --git a/dune/fem-dg/examples/advdiff/test/CMakeLists.txt b/dune/fem-dg/examples/advdiff/test/CMakeLists.txt index 85607cc06832b7057efe3d886920f2497db0ef06..976aba1619adeb15176199e193006c48f2715fc3 100644 --- a/dune/fem-dg/examples/advdiff/test/CMakeLists.txt +++ b/dune/fem-dg/examples/advdiff/test/CMakeLists.txt @@ -59,9 +59,4 @@ if( NOT FEMDG_FAST_TESTBUILD ) COMPILE_DEFINITIONS "${GRIDTYPE};POLORDER=${POLORDER};DISCRETEFUNCTIONSPACESENUM=4" TIMEOUT 3000 ) - dune_add_test_case( NAME advdiff_orthonormal - SOURCES ../main.cc - COMPILE_DEFINITIONS "${GRIDTYPE};POLORDER=${POLORDER};DISCRETEFUNCTIONSPACESENUM=4" - TIMEOUT 3000 ) - endif() diff --git a/dune/fem-dg/examples/dataio/main.cc b/dune/fem-dg/examples/dataio/main.cc index 236b63583b8bf9b2536c01cf7854951d2c4518b2..bf340f8a22ea26651e95ea04d89b3d747480816a 100644 --- a/dune/fem-dg/examples/dataio/main.cc +++ b/dune/fem-dg/examples/dataio/main.cc @@ -9,15 +9,9 @@ int main(int argc, char ** argv) /* Initialize MPI (always do this even if you are not using MPI) */ Dune::Fem::MPIManager :: initialize( argc, argv ); try { - // *** Initialization - Dune::Fem::Parameter::append(argc,argv); - if (argc >= 2) - Dune::Fem::Parameter::append(argv[1]); - else - Dune::Fem::Parameter::append("parameter"); - - // write parameters used (before simulation starts) - Dune::Fem::Parameter::write("parameter.log"); + // read Parameters + if( !readParameters( argc, argv ) ) + return 1; Dune::Fem::CheckPointingAlgorithmCreator<Dune::GridSelector::GridType> algorithmCreator; diff --git a/dune/fem-dg/examples/euler/main.cc b/dune/fem-dg/examples/euler/main.cc index 92be8a507edf15e9ba82f275442e9e95859a6667..bbeba6e7729da9ed139a5618e13691c055516c41 100644 --- a/dune/fem-dg/examples/euler/main.cc +++ b/dune/fem-dg/examples/euler/main.cc @@ -9,15 +9,9 @@ int main(int argc, char ** argv) /* Initialize MPI (always do this even if you are not using MPI) */ Dune::Fem::MPIManager :: initialize( argc, argv ); try { - // *** Initialization - Dune::Fem::Parameter::append(argc,argv); - if (argc >= 2) - Dune::Fem::Parameter::append(argv[1]); - else - Dune::Fem::Parameter::append("parameter"); - - // write parameters used (before simulation starts) - Dune::Fem::Parameter::write("parameter.log"); + // read Parameters + if( !readParameters( argc, argv ) ) + return 1; Dune::Fem::EulerAlgorithmCreator<Dune::GridSelector::GridType> algorithmCreator; diff --git a/dune/fem-dg/examples/incompnavierstokes/main.cc b/dune/fem-dg/examples/incompnavierstokes/main.cc index 34e10f638d4b79b8dc0bfcefc77b7adcbc4685e4..e63a6f8d1c57e6b2e6d90c7821403dce7ea5ae71 100644 --- a/dune/fem-dg/examples/incompnavierstokes/main.cc +++ b/dune/fem-dg/examples/incompnavierstokes/main.cc @@ -9,15 +9,9 @@ int main(int argc, char ** argv) /* Initialize MPI (always do this even if you are not using MPI) */ Dune::Fem::MPIManager :: initialize( argc, argv ); try { - // *** Initialization - Dune::Fem::Parameter::append(argc,argv); - if (argc >= 2) - Dune::Fem::Parameter::append(argv[1]); - else - Dune::Fem::Parameter::append("parameter"); - - // write parameters used (before simulation starts) - Dune::Fem::Parameter::write("parameter.log"); + // read Parameters + if( !readParameters( argc, argv ) ) + return 1; Dune::Fem::IncompressibleNavierStokesAlgorithmCreator<Dune::GridSelector::GridType> algorithmCreator; diff --git a/dune/fem-dg/examples/navierstokes/main.cc b/dune/fem-dg/examples/navierstokes/main.cc index c32539377a83cd5ba0e6a6a7ffca0f063ece33b5..7e9564d30e76f6c993248467158df34cab3bcc23 100644 --- a/dune/fem-dg/examples/navierstokes/main.cc +++ b/dune/fem-dg/examples/navierstokes/main.cc @@ -9,15 +9,9 @@ int main(int argc, char ** argv) /* Initialize MPI (always do this even if you are not using MPI) */ Dune::Fem::MPIManager :: initialize( argc, argv ); try { - // *** Initialization - Dune::Fem::Parameter::append(argc,argv); - if (argc >= 2) - Dune::Fem::Parameter::append(argv[1]); - else - Dune::Fem::Parameter::append("parameter"); - - // write parameters used (before simulation starts) - Dune::Fem::Parameter::write("parameter.log"); + // read Parameters + if( !readParameters( argc, argv ) ) + return 1; Dune::Fem::NavierStokesAlgorithmCreator<Dune::GridSelector::GridType> algorithmCreator; diff --git a/dune/fem-dg/examples/poisson/main.cc b/dune/fem-dg/examples/poisson/main.cc index 45fd8e4a4f0737cd4f46465c79dabcfca1455f41..d0a48fc714a120134f8a03d9625b21d04b0c5a8f 100644 --- a/dune/fem-dg/examples/poisson/main.cc +++ b/dune/fem-dg/examples/poisson/main.cc @@ -9,15 +9,9 @@ int main(int argc, char ** argv) /* Initialize MPI (always do this even if you are not using MPI) */ Dune::Fem::MPIManager :: initialize( argc, argv ); try { - // *** Initialization - Dune::Fem::Parameter::append(argc,argv); - if (argc >= 2) - Dune::Fem::Parameter::append(argv[1]); - else - Dune::Fem::Parameter::append("parameter"); - - // write parameters used (before simulation starts) - Dune::Fem::Parameter::write("parameter.log"); + // read Parameters + if( !readParameters( argc, argv ) ) + return 1; Dune::Fem::PoissonAlgorithmCreator<Dune::GridSelector::GridType> algorithmCreator; diff --git a/dune/fem-dg/examples/stokes/main.cc b/dune/fem-dg/examples/stokes/main.cc index c853d9efbdf79357c22fcc447e89340b0a6a2d48..39af2806f52e60d4c9918834146ee15c75ac8167 100644 --- a/dune/fem-dg/examples/stokes/main.cc +++ b/dune/fem-dg/examples/stokes/main.cc @@ -9,15 +9,9 @@ int main(int argc, char ** argv) /* Initialize MPI (always do this even if you are not using MPI) */ Dune::Fem::MPIManager :: initialize( argc, argv ); try { - // *** Initialization - Dune::Fem::Parameter::append(argc,argv); - if (argc >= 2) - Dune::Fem::Parameter::append(argv[1]); - else - Dune::Fem::Parameter::append("parameter"); - - // write parameters used (before simulation starts) - Dune::Fem::Parameter::write("parameter.log"); + // read Parameters + if( !readParameters( argc, argv ) ) + return 1; Dune::Fem::StokesAlgorithmCreator<Dune::GridSelector::GridType> algorithmCreator; diff --git a/dune/fem-dg/misc/simulator.hh b/dune/fem-dg/misc/simulator.hh index 3148c11022f298b9a2f8c8f2dba867ac13988e4a..dd01122cd4d179a42cae405c143513fe8399a663 100644 --- a/dune/fem-dg/misc/simulator.hh +++ b/dune/fem-dg/misc/simulator.hh @@ -127,6 +127,70 @@ void finalizeCodegen() } #endif +bool readParameters( int argc, char ** argv ) +{ + // append all parameters from command line + Dune::Fem::Parameter::append(argc,argv); + // no parameters defined: search for parameter file + if( argc <= 1 ) + Dune::Fem::Parameter::append("parameter"); + + + //get full test case path + const std::string testCasePath = Dune::Fem::Parameter::getValue< std::string >( "testcase.path", "" ); + //get name for a test case + const std::string testCaseName = Dune::Fem::Parameter::getValue< std::string >( "testcase", "" ); + + std::string path( argv[0] ); + std::string targetName = path.substr(path.find_last_of("/") + 1); + + //append test case name, if given + if( testCaseName != "" ) + targetName = targetName + "_" + testCaseName; + //set important paths which are related to the test case path + if( testCasePath != "" ) + { + Dune::Fem::Parameter::append("fem.prefix.input",testCasePath); + Dune::Fem::Parameter::append("fem.prefix",testCasePath + "data/" + targetName ); + Dune::Fem::Parameter::append("fem.eoc.outputpath",testCasePath + "data/" + targetName ); + } + else + { + //fail: We need data to provide further information via parameter file + if( !Dune::Fem::Parameter::exists( "fem.prefix" ) ) + { + std::cout << "Please specify parameter 'fem.prefix'" << std::endl; + return false; + } + if( !Dune::Fem::Parameter::exists( "fem.prefix.input" ) ) + { + std::cout << "Please specify parameter 'fem.prefix.input'" << std::endl; + return false; + } + if( !Dune::Fem::Parameter::exists( "fem.eoc.outputpath" ) ) + { + std::cout << "Please specify parameter 'fem.eoc.outputpath'" << std::endl; + return false; + } + } + + //read problem dependend file, if existent + std::string fullpath = Dune::Fem::Parameter::commonInputPath() + "/parameters/" + targetName; + if( std::ifstream( fullpath ) ) + Dune::Fem::Parameter::append( fullpath ); + else + { + std::cout << "Parameter file not found in " << fullpath << ". Aborting." << std::endl; + return false; + } + + // write parameters used (before simulation starts) + Dune::Fem::Parameter::write("parameter.log"); + + return true; +} + + namespace Dune {