Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • icon-libraries/libfortran-support
1 result
Show changes
Commits on Source (4)
  • Jonas Jucker's avatar
    More tests for mo_util_string (!63) · 192aa262
    Jonas Jucker authored and Yen-Chen Chen's avatar Yen-Chen Chen committed
    
    <!--
    ICON
    
    ---------------------------------------------------------------
    Copyright (C) 2004-2024, DWD, MPI-M, DKRZ, KIT, ETH, MeteoSwiss
    Contact information: icon-model.org
    
    See AUTHORS.TXT for a list of authors
    See LICENSES/ for license information
    SPDX-License-Identifier: CC0-1.0
    ---------------------------------------------------------------
    -->
    
    ## What is the new feature
    Add more unit-tests for `mo_util_string`
    ## How is it implemented
    Each public subroutine has its own test
    
    ## Mandatory steps before review
    - [x] Gitlab CI passes _(Hint: use `make format` for linting)_ 
    - [x] New feature is covered by additional unit tests
    - [x] Mark the merge request as ready by removing `Draft:`
    
    ## Mandatory steps before merge
    - [x] Test coverage does not decrease
    - [x] Reviewed by a maintainer
    - [x] Incorporate review suggestions
    - [x] Remember to edit the commit message and select the proper changelog category (feature/bugfix/other)
    
    **You are not supposed to merge this request by yourself, the maintainers of fortan-support take care of this action!**
    
    Co-authored-by: default avatarJonas Jucker <jonas.jucker@c2sm.ethz.ch>
    Approved-by: default avatarYen-Chen Chen <yen-chen.chen@kit.edu>
    Merged-by: default avatarYen-Chen Chen <yen-chen.chen@kit.edu>
    Changelog: other
    192aa262
  • Yen-Chen Chen's avatar
    Add C unit tests (!54) · 58467f01
    Yen-Chen Chen authored
    <!--
    ICON
    
    ---------------------------------------------------------------
    Copyright (C) 2004-2024, DWD, MPI-M, DKRZ, KIT, ETH, MeteoSwiss
    Contact information: icon-model.org
    
    See AUTHORS.TXT for a list of authors
    See LICENSES/ for license information
    SPDX-License-Identifier: CC0-1.0
    ---------------------------------------------------------------
    -->
    
    ## What is the new feature
    Add unit tests for C functions
    ## How is it implemented
    Use Googletest to implement missing unit tests in #6
    
    
    
    ## Mandatory steps before review
    - [x] Gitlab CI passes _(Hint: use `make format` for linting)_ 
    - [x] New feature is covered by additional unit tests
    - [x] Mark the merge request as ready by removing `Draft:`
    
    ## Mandatory steps before merge
    - [x] Test coverage does not decrease
    - [ ] Reviewed by a maintainer
    - [ ] Incorporate review suggestions
    - [ ] Remember to edit the commit message and select the proper changelog category (feature/bugfix/other)
    
    **You are not supposed to merge this request by yourself, the maintainers of fortan-support take care of this action!**
    
    Approved-by: default avatarJonas Jucker <jonas.jucker@env.ethz.ch>
    Merged-by: default avatarJonas Jucker <jonas.jucker@env.ethz.ch>
    Changelog: other
    58467f01
  • Yen-Chen Chen's avatar
    Make release 1.1.0 (!62) · a3431d58
    Yen-Chen Chen authored
    <!--
    ICON
    
    ---------------------------------------------------------------
    Copyright (C) 2004-2024, DWD, MPI-M, DKRZ, KIT, ETH, MeteoSwiss
    Contact information: icon-model.org
    
    See AUTHORS.TXT for a list of authors
    See LICENSES/ for license information
    SPDX-License-Identifier: CC0-1.0
    ---------------------------------------------------------------
    -->
    
    ## What is the new feature
    This MR makes sure that the new version with OpenACC feature can be properly merged back to `icon-mpim`
    ## How is it implemented
    See MR in icon-mpim for BuildBot results. All BuildBots must pass.
    - Doxygen-style comments are removed to following the ICON style guide
    - Intent specifiers are manually capitalized. This is an open issue for `fprettify`. See [here](https://github.com/pseewald/fprettify/issues/108
    
    )
    - [x] Put back missing subroutines
    
    ## Mandatory steps before review
    - [x] Gitlab CI passes _(Hint: use `make format` for linting)_ 
    - [x] New feature is covered by additional unit tests
    - [x] Mark the merge request as ready by removing `Draft:`
    
    ## Mandatory steps before merge
    - [x] Test coverage does not decrease
    - [x] Reviewed by a maintainer
    - [x] Incorporate review suggestions
    - [ ] Remember to edit the commit message and select the proper changelog category (feature/bugfix/other)
    
    **You are not supposed to merge this request by yourself, the maintainers of fortan-support take care of this action!**
    
    Approved-by: default avatarJonas Jucker <jonas.jucker@env.ethz.ch>
    Merged-by: default avatarYen-Chen Chen <yen-chen.chen@kit.edu>
    Changelog: feature
    a3431d58
  • Yen-Chen Chen's avatar
    Fix: add release tag rule to workflow (!65) · 5dfa3d60
    Yen-Chen Chen authored
    
    <!--
    ICON
    
    ---------------------------------------------------------------
    Copyright (C) 2004-2024, DWD, MPI-M, DKRZ, KIT, ETH, MeteoSwiss
    Contact information: icon-model.org
    
    See AUTHORS.TXT for a list of authors
    See LICENSES/ for license information
    SPDX-License-Identifier: CC0-1.0
    ---------------------------------------------------------------
    -->
    
    ## What is the bug
    Fix the problem that release is not created automatically on tag
    ## How do you fix it
    Pipeline workflow was ruled out for tags
    
    ## How urgent is the bugfix
    - [x] I need it as soon as possible
    - [ ] I can wait for a couple of days
    - [ ] None of my current codes is directly affected
    
    ## Mandatory steps before review
    - [x] Gitlab CI passes _(Hint: use `make format` for linting)_ 
    - [x] Bugfix is covered by additional unit tests
    - [x] Mark the merge request as ready by removing `Draft:`
    
    ## Mandatory steps before merge
    - [x] Test coverage does not decrease
    - [x] Reviewed by a maintainer
    - [ ] Incorporate review suggestions
    - [ ] Remember to edit the commit message and select the proper changelog category (feature/bugfix/other)
    
    **You are not supposed to merge this request by yourself, the maintainers of fortan-support take care of this action!**
    
    Approved-by: default avatarJonas Jucker <jonas.jucker@env.ethz.ch>
    Merged-by: default avatarJonas Jucker <jonas.jucker@env.ethz.ch>
    Changelog: feature
    5dfa3d60
Showing with 265 additions and 238 deletions
......@@ -21,6 +21,7 @@ workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_REF_NAME == "master"
- if: '$CI_COMMIT_TAG =~ /^v?\d+\.\d+\.\d+$/'
nag:
stage: build_and_test
......
......@@ -18,7 +18,9 @@ find_package(OpenACC QUIET)
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
option(BUILD_TESTING "Build tests" ON)
option(BACKTRACE_TEST "Test backtrace function" ON)
option(BUILD_OMP "Build with OpenMP support" OFF)
option(BUILD_OPENACC "Build with OpenACC support" OFF)
option(MIXED_PRECISION "Use mixed precision" OFF)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
......
......@@ -30,7 +30,7 @@ The following packages/libraries are required for `libfortran-support`.
- CMake 3.18+
The following requirements are optional
- OpenACC(nvhpc) for GPU support
- `fprettify` for Fortran code formatting
- `clang-format` for C/C++ code formatting
- Ragel State Machine Compiler 7.0+ for C code generation from `.rl` files, used for
......@@ -45,6 +45,7 @@ The following requirements are optional
The `libfortran-support` library includes some general Fortran supporting modules that are used in ICON but are independent of the data types in ICON. Here is a list of the supported modules.
- `mo_exception`: message logger for ICON
- `mo_expression`: expression parsing
- `mo_fortran_tools`: basic array allocation, copy, etc. subroutines with GPU(OpenACC) support
- `mo_hash_table`: hash table operations
- `mo_io_units`: io unit definitions
- `mo_namelist`: open/close namelist files
......@@ -98,6 +99,8 @@ add_library(fortran-support
mkdir build
cd build
cmake ..
! Or the following for GPU support with OpenACC
cmake -DBUILD_OPENACC=ON ..
make
```
4. Format the code by `make format`.
......
#!/bin/bash
# ICON
#
# ---------------------------------------------------------------
# Copyright (C) 2004-2024, DWD, MPI-M, DKRZ, KIT, ETH, MeteoSwiss
# Contact information: icon-model.org
#
# See AUTHORS.TXT for a list of authors
# See LICENSES/ for license information
# SPDX-License-Identifier: BSD-3-Clause
# ---------------------------------------------------------------
fprettify --case 2 2 2 1 -i 2 -w 2 --strip-comments -r src/ test/fortran/ ||
echo "Try to install fprettify by \"pip install fprettify\""
......@@ -19,14 +19,24 @@ configure_file(
${CMAKE_CURRENT_BINARY_DIR}/config.h)
if (BUILD_OPENACC)
set(OpenACC_FLAGS "-Minfo=all -acc=gpu")
message(VERBOSE "Compiler id is ${CMAKE_Fortran_COMPILER_ID}")
if (CMAKE_Fortran_COMPILER_ID STREQUAL "Cray")
set(OpenACC_FLAGS "-hacc")
else () # Compiler ID for NVHPC is only supported after CMake 3.20
set(OpenACC_FLAGS "-Minfo=all -acc=gpu")
endif ()
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${OpenACC_FLAGS}")
endif()
endif ()
if (BUILD_OMP)
find_package(OpenMP QUIET)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${OpenMP_Fortran_FLAGS}")
endif ()
add_library(fortran-support
mo_exception.F90
mo_expression.F90
mo_lib_fortran_tools.F90
mo_fortran_tools.F90
mo_hash_table.F90
mo_io_units.F90
mo_namelist.F90
......@@ -74,6 +84,10 @@ set_target_properties(fortran-support
EXPORT_NAME ${PROJECT_NAME}::fortran-support
)
if (MIXED_PRECISION)
target_compile_definitions(fortran-support PRIVATE __MIXED_PRECISION)
endif ()
target_include_directories(fortran-support
PUBLIC
# Path to the Fortran modules:
......
......@@ -163,7 +163,7 @@ CONTAINS
END SUBROUTINE set_msg_timestamp
SUBROUTINE enable_logging(l_write_output)
LOGICAL, INTENT(in) :: l_write_output
LOGICAL, INTENT(IN) :: l_write_output
lwrite = l_write_output
END SUBROUTINE enable_logging
......@@ -226,8 +226,8 @@ CONTAINS
END FUNCTION error_prefix
SUBROUTINE finish(name, text)
CHARACTER(len=*), INTENT(in) :: name
CHARACTER(len=*), INTENT(in), OPTIONAL :: text
CHARACTER(len=*), INTENT(IN) :: name
CHARACTER(len=*), INTENT(IN), OPTIONAL :: text
CHARACTER(LEN=filename_max) :: tmp
tmp(:) = ' '
......@@ -246,9 +246,9 @@ CONTAINS
SUBROUTINE message(name, text, all_print)
CHARACTER(len=*), INTENT(in) :: name
CHARACTER(len=*), INTENT(in) :: text
LOGICAL, INTENT(in), OPTIONAL :: all_print
CHARACTER(len=*), INTENT(IN) :: name
CHARACTER(len=*), INTENT(IN) :: text
LOGICAL, INTENT(IN), OPTIONAL :: all_print
IF (PRESENT(all_print)) THEN
lprint = all_print
......@@ -266,8 +266,8 @@ CONTAINS
SUBROUTINE message_to_own_unit(name, text, nerr_unit)
CHARACTER(len=*), INTENT(in) :: name
CHARACTER(len=*), INTENT(in) :: text
CHARACTER(len=*), INTENT(IN) :: name
CHARACTER(len=*), INTENT(IN) :: text
INTEGER :: nerr_unit
IF (lvl_info_is_active() .AND. lvl_debug_is_active()) THEN
......@@ -280,8 +280,8 @@ CONTAINS
SUBROUTINE param(name, text)
CHARACTER(len=*), INTENT(in) :: name
CHARACTER(len=*), INTENT(in) :: text
CHARACTER(len=*), INTENT(IN) :: name
CHARACTER(len=*), INTENT(IN) :: text
IF (lvl_info_is_active()) THEN
CALL write_to_unit(name, text, lvl_param)
......@@ -290,10 +290,10 @@ CONTAINS
END SUBROUTINE param
SUBROUTINE write_to_unit(name, text, level, nerr_unit)
CHARACTER(len=*), INTENT(in) :: name
CHARACTER(len=*), INTENT(in) :: text
INTEGER, INTENT(in) :: level
INTEGER, INTENT(in), OPTIONAL :: nerr_unit
CHARACTER(len=*), INTENT(IN) :: name
CHARACTER(len=*), INTENT(IN) :: text
INTEGER, INTENT(IN) :: level
INTEGER, INTENT(IN), OPTIONAL :: nerr_unit
CHARACTER(len=filename_max) :: prefix
CHARACTER(len=10) :: ctime
......@@ -330,8 +330,8 @@ CONTAINS
SUBROUTINE warning(name, text)
CHARACTER(len=*), INTENT(in) :: name
CHARACTER(len=*), INTENT(in) :: text
CHARACTER(len=*), INTENT(IN) :: name
CHARACTER(len=*), INTENT(IN) :: text
CALL write_to_unit(name, text, lvl_warn)
......@@ -339,9 +339,9 @@ CONTAINS
SUBROUTINE print_lvalue(mstring, lvalue, routine)
CHARACTER(len=*), INTENT(in) :: mstring
LOGICAL, INTENT(in) :: lvalue
CHARACTER(len=*), TARGET, OPTIONAL, INTENT(in) :: routine
CHARACTER(len=*), INTENT(IN) :: mstring
LOGICAL, INTENT(IN) :: lvalue
CHARACTER(len=*), TARGET, OPTIONAL, INTENT(IN) :: routine
CHARACTER(len=:), POINTER :: rtn
CHARACTER(len=1), TARGET :: dummy
CHARACTER(len=filename_max) :: tmp = ""
......@@ -360,9 +360,9 @@ CONTAINS
SUBROUTINE print_ivalue(mstring, ivalue, routine)
CHARACTER(len=*), INTENT(in) :: mstring
INTEGER, INTENT(in) :: ivalue
CHARACTER(len=*), TARGET, OPTIONAL, INTENT(in) :: routine
CHARACTER(len=*), INTENT(IN) :: mstring
INTEGER, INTENT(IN) :: ivalue
CHARACTER(len=*), TARGET, OPTIONAL, INTENT(IN) :: routine
CHARACTER(len=:), POINTER :: rtn
CHARACTER(len=1), TARGET :: dummy
CHARACTER(len=filename_max) :: tmp = ""
......@@ -380,9 +380,9 @@ CONTAINS
SUBROUTINE print_i8value(mstring, i8value, routine)
CHARACTER(len=*), INTENT(in) :: mstring
INTEGER(i8), INTENT(in) :: i8value
CHARACTER(len=*), TARGET, OPTIONAL, INTENT(in) :: routine
CHARACTER(len=*), INTENT(IN) :: mstring
INTEGER(i8), INTENT(IN) :: i8value
CHARACTER(len=*), TARGET, OPTIONAL, INTENT(IN) :: routine
CHARACTER(len=:), POINTER :: rtn
CHARACTER(len=1), TARGET :: dummy
CHARACTER(len=filename_max) :: tmp = ""
......@@ -400,9 +400,9 @@ CONTAINS
SUBROUTINE print_rvalue(mstring, rvalue, routine)
CHARACTER(len=*), INTENT(in) :: mstring
REAL(wp), INTENT(in) :: rvalue
CHARACTER(len=*), TARGET, OPTIONAL, INTENT(in) :: routine
CHARACTER(len=*), INTENT(IN) :: mstring
REAL(wp), INTENT(IN) :: rvalue
CHARACTER(len=*), TARGET, OPTIONAL, INTENT(IN) :: routine
CHARACTER(len=:), POINTER :: rtn
CHARACTER(len=1), TARGET :: dummy
CHARACTER(len=filename_max) :: tmp = ""
......
......@@ -417,7 +417,7 @@ CONTAINS
SUBROUTINE parse_expression_string(expr_list, string)
CHARACTER(LEN=*), INTENT(IN) :: string
TYPE(expression), INTENT(out) :: expr_list
TYPE(expression), INTENT(OUT) :: expr_list
! local variables
TYPE(t_list) :: cqueue
......
......@@ -8,7 +8,13 @@
! See LICENSES/ for license information
! SPDX-License-Identifier: BSD-3-Clause
! ---------------------------------------------------------------
MODULE mo_lib_fortran_tools
! This module contains often-used Fortran language constructs.
!
! The small functions and subroutines in this module should depend
! only on most basic types and should not call other model-specific
! subroutines.
MODULE mo_fortran_tools
USE ISO_FORTRAN_ENV, ONLY: wp => real64, &
sp => real32, &
......@@ -26,6 +32,7 @@ MODULE mo_lib_fortran_tools
PUBLIC :: assign_if_present
PUBLIC :: t_ptr_2d3d, t_ptr_2d3d_vp
PUBLIC :: assign_if_present_allocatable
PUBLIC :: if_associated
PUBLIC :: t_ptr_1d, t_ptr_1d_sp, t_ptr_1d_int
PUBLIC :: t_ptr_1d_ptr_1d
PUBLIC :: t_ptr_2d, t_ptr_2d_sp, t_ptr_2d_int
......@@ -39,14 +46,15 @@ MODULE mo_lib_fortran_tools
PUBLIC :: init_contiguous_dp, init_contiguous_sp
PUBLIC :: init_contiguous_i4, init_contiguous_l
PUBLIC :: minval_1d
PUBLIC :: minval_2d
PUBLIC :: resize_arr_c1d
PUBLIC :: DO_DEALLOCATE
PUBLIC :: DO_PTR_DEALLOCATE
PUBLIC :: insert_dimension
PUBLIC :: assert_acc_host_only
PUBLIC :: assert_acc_device_only
PUBLIC :: set_acc_host_or_device
PUBLIC :: assert_lacc_equals_i_am_accel_node
PUBLIC :: set_acc_host_or_device
PRIVATE
......@@ -148,6 +156,12 @@ MODULE mo_lib_fortran_tools
MODULE PROCEDURE assign_if_present_character_allocatable
END INTERFACE assign_if_present_allocatable
!>
!! Return the passed pointer if it is associated, else return pointer to `els` (or NULL).
INTERFACE if_associated
MODULE PROCEDURE if_associated_rc_2d
END INTERFACE
!> `copy(b, a)` is meant to make it easier for compilers to circumvent
!! temporaries as are too often created in a(:, :, :) = b(:, :, :)
!!
......@@ -155,6 +169,7 @@ MODULE mo_lib_fortran_tools
!! OMP PARALLEL region. However, it must not be called inside another
!! OMP DO region.
INTERFACE copy
MODULE PROCEDURE copy_1d_dp
MODULE PROCEDURE copy_2d_dp
MODULE PROCEDURE copy_3d_dp
MODULE PROCEDURE copy_4d_dp
......@@ -182,6 +197,7 @@ MODULE mo_lib_fortran_tools
MODULE PROCEDURE init_zero_4d_dp
MODULE PROCEDURE init_zero_4d_sp
MODULE PROCEDURE init_zero_4d_i4
MODULE PROCEDURE init_1d_dp
MODULE PROCEDURE init_2d_dp
MODULE PROCEDURE init_3d_dp
MODULE PROCEDURE init_3d_spdp
......@@ -414,14 +430,30 @@ CONTAINS
y = x
END SUBROUTINE assign_if_present_character_allocatable
!>
!! Return `ptr` if it is associated, else return pointer to `els` or NULL.
FUNCTION if_associated_rc_2d(ptr, els) RESULT(p)
REAL(wp), CONTIGUOUS, POINTER, INTENT(IN) :: ptr(:, :)
REAL(wp), CONTIGUOUS, TARGET, INTENT(IN), OPTIONAL :: els(:, :)
REAL(wp), CONTIGUOUS, POINTER :: p(:, :)
IF (ASSOCIATED(ptr)) THEN
p => ptr
ELSE
IF (PRESENT(els)) THEN
p => els
ELSE
p => NULL()
END IF
END IF
END FUNCTION if_associated_rc_2d
!>
!! Swap content of two Integers
!!
!! Swap content of two Integers
!!
!! @par Revision History
!! Initial revision by Daniel Reinert, DWD (2014-10-28)
!!
SUBROUTINE swap_int(a, b)
INTEGER, INTENT(INOUT) :: a
INTEGER, INTENT(INOUT) :: b
......@@ -435,13 +467,8 @@ CONTAINS
END SUBROUTINE swap_int
!>
!! Expand array by given size
!!
!! Expand a 1D character array by given size.
!!
!! @par Revision History
!! Initial revision by Daniel Reinert, DWD (2014-10-28)
!!
SUBROUTINE resize_arr_c1d(arr, nelem)
! GCC 4.9.0 complained about CHARACTER(:); Cray did not!
CHARACTER(len=256), ALLOCATABLE, INTENT(INOUT) :: arr(:) ! array to be resized
......@@ -482,6 +509,30 @@ CONTAINS
END SUBROUTINE resize_arr_c1d
!> copy state, omp parallel, does not wait for other threads to complete
SUBROUTINE copy_1d_dp(src, dest, lacc, opt_acc_async)
REAL(dp), INTENT(IN) :: src(:)
REAL(dp), INTENT(OUT) :: dest(:)
LOGICAL, INTENT(IN), OPTIONAL :: lacc
LOGICAL, INTENT(IN), OPTIONAL :: opt_acc_async
INTEGER :: i1, m1
LOGICAL :: lzacc
CALL set_acc_host_or_device(lzacc, lacc)
m1 = SIZE(dest, 1)
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) IF(lzacc)
!$omp do private(i1)
DO i1 = 1, m1
dest(i1) = src(i1)
END DO
!$omp end do nowait
!$ACC END PARALLEL LOOP
CALL acc_wait_if_requested(1, opt_acc_async)
END SUBROUTINE copy_1d_dp
!> copy state, omp parallel, does not wait for other threads to complete
SUBROUTINE copy_2d_dp(src, dest, lacc, opt_acc_async)
REAL(dp), INTENT(IN) :: src(:, :)
......@@ -496,9 +547,7 @@ CONTAINS
m1 = SIZE(dest, 1)
m2 = SIZE(dest, 2)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(2) IF(lzacc)
#endif
#ifdef __INTEL_COMPILER
!$omp do private(i1,i2)
#else
......@@ -529,9 +578,7 @@ CONTAINS
m2 = SIZE(dest, 2)
m3 = SIZE(dest, 3)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(3) IF(lzacc)
#endif
#if (defined(_CRAYFTN) || defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3)
#else
......@@ -565,9 +612,7 @@ CONTAINS
m3 = SIZE(dest, 3)
m4 = SIZE(dest, 4)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(4) IF(lzacc)
#endif
#if (defined(_CRAYFTN) || defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3,i4)
#else
......@@ -604,9 +649,7 @@ CONTAINS
m4 = SIZE(dest, 4)
m5 = SIZE(dest, 5)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(5) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3,i4,i5)
#else
......@@ -645,9 +688,7 @@ CONTAINS
m4 = SIZE(dest, 4)
m5 = SIZE(dest, 5)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(5) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3,i4,i5)
#else
......@@ -683,9 +724,7 @@ CONTAINS
m1 = SIZE(dest, 1)
m2 = SIZE(dest, 2)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(2) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2)
#else
......@@ -716,9 +755,7 @@ CONTAINS
m2 = SIZE(dest, 2)
m3 = SIZE(dest, 3)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(3) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3)
#else
......@@ -752,9 +789,7 @@ CONTAINS
m3 = SIZE(dest, 3)
m4 = SIZE(dest, 4)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(4) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3,i4)
#else
......@@ -791,9 +826,7 @@ CONTAINS
m4 = SIZE(dest, 4)
m5 = SIZE(dest, 5)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(5) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3,i4,i5)
#else
......@@ -829,9 +862,7 @@ CONTAINS
m1 = SIZE(dest, 1)
m2 = SIZE(dest, 2)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(2) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2)
#else
......@@ -862,9 +893,7 @@ CONTAINS
m2 = SIZE(dest, 2)
m3 = SIZE(dest, 3)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(3) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3)
#else
......@@ -899,9 +928,7 @@ CONTAINS
m4 = SIZE(dest, 4)
m5 = SIZE(dest, 5)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(5) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3,i4,i5)
#else
......@@ -940,9 +967,7 @@ CONTAINS
m4 = SIZE(dest, 4)
m5 = SIZE(dest, 5)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(5) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3,i4,i5)
#else
......@@ -974,9 +999,7 @@ CONTAINS
CALL set_acc_host_or_device(lzacc, lacc)
m1 = SIZE(init_var, 1)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) IF(lzacc)
#endif
!$omp do
DO i1 = 1, m1
init_var(i1) = 0.0_dp
......@@ -996,9 +1019,7 @@ CONTAINS
CALL set_acc_host_or_device(lzacc, lacc)
m1 = SIZE(init_var, 1)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) IF(lzacc)
#endif
!$omp do
DO i1 = 1, m1
init_var(i1) = 0.0_dp
......@@ -1020,9 +1041,7 @@ CONTAINS
m1 = SIZE(init_var, 1)
m2 = SIZE(init_var, 2)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(2) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2)
#else
......@@ -1050,9 +1069,7 @@ CONTAINS
m1 = SIZE(init_var, 1)
m2 = SIZE(init_var, 2)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(2) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2)
#else
......@@ -1081,9 +1098,7 @@ CONTAINS
m2 = SIZE(init_var, 2)
m3 = SIZE(init_var, 3)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(3) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER) || defined(_CRAYFTN))
!$omp do private(i1,i2,i3)
#else
......@@ -1114,9 +1129,7 @@ CONTAINS
m2 = SIZE(init_var, 2)
m3 = SIZE(init_var, 3)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(3) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3)
#else
......@@ -1148,9 +1161,7 @@ CONTAINS
m2 = SIZE(init_var, 2)
m3 = SIZE(init_var, 3)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(3) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3)
#else
......@@ -1182,9 +1193,7 @@ CONTAINS
m3 = SIZE(init_var, 3)
m4 = SIZE(init_var, 4)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(4) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER) || defined(_CRAYFTN))
!$omp do private(i1,i2,i3,i4)
#else
......@@ -1218,9 +1227,7 @@ CONTAINS
m3 = SIZE(init_var, 3)
m4 = SIZE(init_var, 4)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(4) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER) || defined(_CRAYFTN))
!$omp do private(i1,i2,i3,i4)
#else
......@@ -1254,9 +1261,7 @@ CONTAINS
m3 = SIZE(init_var, 3)
m4 = SIZE(init_var, 4)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(4) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3,i4)
#else
......@@ -1276,6 +1281,28 @@ CONTAINS
CALL acc_wait_if_requested(1, opt_acc_async)
END SUBROUTINE init_zero_4d_i4
SUBROUTINE init_1d_dp(init_var, init_val, lacc, opt_acc_async)
REAL(dp), INTENT(OUT) :: init_var(:)
REAL(dp), INTENT(IN) :: init_val
LOGICAL, INTENT(IN), OPTIONAL :: lacc
LOGICAL, INTENT(IN), OPTIONAL :: opt_acc_async
INTEGER :: i1, m1
LOGICAL :: lzacc
CALL set_acc_host_or_device(lzacc, lacc)
m1 = SIZE(init_var, 1)
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) IF(lzacc)
!$omp do private(i1)
DO i1 = 1, m1
init_var(i1) = init_val
END DO
!$omp end do nowait
!$ACC END PARALLEL LOOP
CALL acc_wait_if_requested(1, opt_acc_async)
END SUBROUTINE init_1d_dp
SUBROUTINE init_2d_dp(init_var, init_val, lacc, opt_acc_async)
REAL(dp), INTENT(OUT) :: init_var(:, :)
REAL(dp), INTENT(IN) :: init_val
......@@ -1290,9 +1317,7 @@ CONTAINS
m1 = SIZE(init_var, 1)
m2 = SIZE(init_var, 2)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(2) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2)
#else
......@@ -1323,9 +1348,7 @@ CONTAINS
m2 = SIZE(init_var, 2)
m3 = SIZE(init_var, 3)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(3) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3)
#else
......@@ -1358,9 +1381,7 @@ CONTAINS
m2 = SIZE(init_var, 2)
m3 = SIZE(init_var, 3)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(3) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3)
#else
......@@ -1395,9 +1416,7 @@ CONTAINS
m4 = SIZE(init_var, 4)
m5 = SIZE(init_var, 5)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(5) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3,i4,i5)
#else
......@@ -1436,9 +1455,7 @@ CONTAINS
m4 = SIZE(init_var, 4)
m5 = SIZE(init_var, 5)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(5) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3,i4,i5)
#else
......@@ -1477,9 +1494,7 @@ CONTAINS
m4 = SIZE(init_var, 4)
m5 = SIZE(init_var, 5)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(5) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3,i4,i5)
#else
......@@ -1518,9 +1533,7 @@ CONTAINS
m4 = SIZE(init_var, 4)
m5 = SIZE(init_var, 5)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(5) IF(lzacc)
#endif
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3,i4,i5)
#else
......@@ -1542,20 +1555,22 @@ CONTAINS
CALL acc_wait_if_requested(1, opt_acc_async)
END SUBROUTINE init_5d_l
SUBROUTINE var_scale_3d_dp(var, scale_val, opt_acc_async)
REAL(dp), INTENT(INOUT) :: var(:, :, :)
REAL(dp), INTENT(IN) :: scale_val
SUBROUTINE var_scale_3d_dp(var, scale_val, lacc, opt_acc_async)
REAL(dp), INTENT(inout) :: var(:, :, :)
REAL(dp), INTENT(in) :: scale_val
LOGICAL, INTENT(IN), OPTIONAL :: lacc
LOGICAL, INTENT(IN), OPTIONAL :: opt_acc_async
INTEGER :: i1, i2, i3, m1, m2, m3
LOGICAL :: lzacc
CALL set_acc_host_or_device(lzacc, lacc)
m1 = SIZE(var, 1)
m2 = SIZE(var, 2)
m3 = SIZE(var, 3)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(3)
#endif
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(3) IF(lzacc)
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3)
#else
......@@ -1574,20 +1589,22 @@ CONTAINS
END SUBROUTINE var_scale_3d_dp
! add a constant value to a 3D field
SUBROUTINE var_addc_3d_dp(var, add_val, opt_acc_async)
REAL(dp), INTENT(INOUT) :: var(:, :, :)
REAL(dp), INTENT(IN) :: add_val
SUBROUTINE var_addc_3d_dp(var, add_val, lacc, opt_acc_async)
REAL(dp), INTENT(inout) :: var(:, :, :)
REAL(dp), INTENT(in) :: add_val
LOGICAL, INTENT(IN), OPTIONAL :: lacc
LOGICAL, INTENT(IN), OPTIONAL :: opt_acc_async
INTEGER :: i1, i2, i3, m1, m2, m3
LOGICAL :: lzacc
CALL set_acc_host_or_device(lzacc, lacc)
m1 = SIZE(var, 1)
m2 = SIZE(var, 2)
m3 = SIZE(var, 3)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(3)
#endif
!$ACC PARALLEL LOOP DEFAULT(PRESENT) ASYNC(1) COLLAPSE(3) IF(lzacc)
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3)
#else
......@@ -1605,21 +1622,23 @@ CONTAINS
CALL acc_wait_if_requested(1, opt_acc_async)
END SUBROUTINE var_addc_3d_dp
SUBROUTINE negative2zero_4d_dp(var, opt_acc_async)
REAL(dp), INTENT(INOUT) :: var(:, :, :, :)
SUBROUTINE negative2zero_4d_dp(var, lacc, opt_acc_async)
REAL(dp), INTENT(inout) :: var(:, :, :, :)
LOGICAL, INTENT(IN), OPTIONAL :: lacc
LOGICAL, INTENT(IN), OPTIONAL :: opt_acc_async
INTEGER :: i1, i2, i3, i4, m1, m2, m3, m4
REAL(dp) :: v
LOGICAL :: lzacc
CALL set_acc_host_or_device(lzacc, lacc)
m1 = SIZE(var, 1)
m2 = SIZE(var, 2)
m3 = SIZE(var, 3)
m4 = SIZE(var, 4)
#ifdef _OPENACC
!$ACC PARALLEL LOOP DEFAULT(PRESENT) PRIVATE(v) ASYNC(1) COLLAPSE(4)
#endif
!$ACC PARALLEL LOOP DEFAULT(PRESENT) PRIVATE(v) ASYNC(1) COLLAPSE(4) IF(lzacc)
#if (defined(__INTEL_COMPILER))
!$omp do private(i1,i2,i3,i4)
#else
......@@ -1774,6 +1793,36 @@ CONTAINS
END FUNCTION minval_1d
FUNCTION minval_2d(var, lacc)
!! Computes the MINVAL(var)
!! This wrapper enables the use of OpenACC without using ACC-KERNELS
INTEGER, INTENT(IN) :: var(:, :) ! input array
LOGICAL, INTENT(IN), OPTIONAL :: lacc ! if true, use OpenACC
LOGICAL :: lzacc ! non-optional version of lacc
INTEGER :: minval_2d, i, j, s1, s2
#ifdef _OPENACC
CALL set_acc_host_or_device(lzacc, lacc)
s1 = SIZE(var, 1)
s2 = SIZE(var, 2)
minval_2d = HUGE(minval_2d)
!$ACC PARALLEL LOOP GANG VECTOR DEFAULT(PRESENT) ASYNC(1) REDUCTION(MIN: minval_2d) IF(lacc)
DO j = 1, s2
DO i = 1, s1
minval_2d = MIN(minval_2d, var(i, j)) ! The loop is equivalent to MINVAL(var(:,:))
END DO
END DO
!$ACC END PARALLEL LOOP
!$ACC WAIT ! required to sync result back to CPU
#else
minval_2d = MINVAL(var(:, :))
#endif
END FUNCTION minval_2d
SUBROUTINE insert_dimension_r_dp_3_2_s(ptr_out, ptr_in, in_shape, &
new_dim_rank)
INTEGER, PARAMETER :: out_rank = 3
......@@ -2299,14 +2348,16 @@ CONTAINS
LOGICAL, INTENT(IN), OPTIONAL :: i_am_accel_node
#ifdef _OPENACC
IF (PRESENT(lacc) .AND. (lacc .NEQV. i_am_accel_node)) THEN
CALL finish(routine_name, 'lacc /= i_am_accel_node')
IF (PRESENT(lacc) .AND. PRESENT(i_am_accel_node)) THEN
IF (lacc .NEQV. i_am_accel_node) THEN
CALL finish(routine_name, 'lacc /= i_am_accel_node')
END IF
END IF
#endif
END SUBROUTINE assert_lacc_equals_i_am_accel_node
SUBROUTINE set_acc_host_or_device(lzacc, lacc)
PURE SUBROUTINE set_acc_host_or_device(lzacc, lacc)
LOGICAL, INTENT(OUT) :: lzacc
LOGICAL, INTENT(IN), OPTIONAL :: lacc
......@@ -2318,4 +2369,4 @@ CONTAINS
#endif
END SUBROUTINE set_acc_host_or_device
END MODULE mo_lib_fortran_tools
END MODULE mo_fortran_tools
......@@ -55,7 +55,7 @@ CONTAINS
!
FUNCTION find_next_free_unit(istart, istop) RESULT(iunit)
INTEGER :: iunit
INTEGER, INTENT(in) :: istart, istop
INTEGER, INTENT(IN) :: istart, istop
!
INTEGER :: kstart, kstop
LOGICAL :: lfound, lopened
......
......@@ -52,9 +52,9 @@ CONTAINS
!! opens the namelist file.
!!
SUBROUTINE open_nml(file, lwarn, istat)
CHARACTER(len=*), INTENT(in) :: file
LOGICAL, INTENT(in), OPTIONAL :: lwarn
INTEGER, INTENT(out), OPTIONAL :: istat
CHARACTER(len=*), INTENT(IN) :: file
LOGICAL, INTENT(IN), OPTIONAL :: lwarn
INTEGER, INTENT(OUT), OPTIONAL :: istat
LOGICAL :: l_lwarn = .FALSE.
INTEGER :: l_istat
......@@ -77,10 +77,6 @@ CONTAINS
!>
!! closes the namelist file.
!!
!!
!! @par Revision History
!! Luis Kornblueh, MPI-M, Hamburg, March 2001
!!
SUBROUTINE close_nml
INTEGER :: istat
......@@ -95,14 +91,11 @@ CONTAINS
!>
!! set file pointer to begin of namelist for reading namelist /name/ (case independent).
!!
!! @par Revision History
!! Luis Kornblueh, MPI-M, Hamburg, March 2001
!!
SUBROUTINE position_nml(name, unit, lrewind, status)
CHARACTER(len=*), INTENT(in) :: name ! namelist group name
INTEGER, INTENT(in), OPTIONAL :: unit ! file unit number
LOGICAL, INTENT(in), OPTIONAL :: lrewind ! default: true
INTEGER, INTENT(out), OPTIONAL :: status ! error return value
CHARACTER(len=*), INTENT(IN) :: name ! namelist group name
INTEGER, INTENT(IN), OPTIONAL :: unit ! file unit number
LOGICAL, INTENT(IN), OPTIONAL :: lrewind ! default: true
INTEGER, INTENT(OUT), OPTIONAL :: status ! error return value
CHARACTER(len=256) :: yline ! line read
CHARACTER(len=256) :: test ! uppercase namelist group name
......@@ -195,7 +188,7 @@ CONTAINS
!! and their actual values used in the simulation.
!!
SUBROUTINE open_nml_output(file)
CHARACTER(len=*), INTENT(in) :: file
CHARACTER(len=*), INTENT(IN) :: file
INTEGER :: istat
nnml_output = find_next_free_unit(10, 20)
......@@ -212,9 +205,6 @@ CONTAINS
!! close the ASCII output that contains all the namelist
!! variables and their actual values used in the simulation.
!!
!! @par Revision History
!! Hui Wan, MPI-M, 2009-03-17
!!
SUBROUTINE close_nml_output
INTEGER :: istat
......
......@@ -211,7 +211,6 @@ CONTAINS
!> Point query in octree data structure.
!
! @return no. of objects contained in traversed octree boxes.
INTEGER FUNCTION octree_count_point(octree, p)
TYPE(t_range_octree), INTENT(IN) :: octree !< octree data structure
REAL(wp), INTENT(IN) :: p(3) !< point to insert
......@@ -255,7 +254,6 @@ CONTAINS
!> Point query in octree data structure.
!
! @return list of objects contained in traversed octree boxes.
SUBROUTINE octree_query_point(octree, p, obj_list)
TYPE(t_range_octree), INTENT(IN) :: octree !< octree data structure
REAL(wp), INTENT(IN) :: p(3) !< point to insert
......
......@@ -28,9 +28,9 @@ MODULE mo_simple_dump
CONTAINS
SUBROUTINE dump2text1_wp(array, name, preserve_original)
REAL(wp), INTENT(inout) :: array(:)
CHARACTER(len=*), INTENT(in) :: name
LOGICAL, INTENT(in), OPTIONAL :: preserve_original
REAL(wp), INTENT(INOUT) :: array(:)
CHARACTER(len=*), INTENT(IN) :: name
LOGICAL, INTENT(IN), OPTIONAL :: preserve_original
LOGICAL :: do_copy
REAL(wp), ALLOCATABLE :: backup(:)
......@@ -49,9 +49,9 @@ CONTAINS
END SUBROUTINE dump2text1_wp
SUBROUTINE dump2text2_wp(array, name, preserve_original)
REAL(wp), INTENT(inout) :: array(:, :)
CHARACTER(len=*), INTENT(in) :: name
LOGICAL, INTENT(in), OPTIONAL :: preserve_original
REAL(wp), INTENT(INOUT) :: array(:, :)
CHARACTER(len=*), INTENT(IN) :: name
LOGICAL, INTENT(IN), OPTIONAL :: preserve_original
LOGICAL :: do_copy
REAL(wp), ALLOCATABLE :: backup(:, :)
......@@ -70,9 +70,9 @@ CONTAINS
END SUBROUTINE dump2text2_wp
SUBROUTINE dump2text3_wp(array, name, preserve_original)
REAL(wp), INTENT(inout) :: array(:, :, :)
CHARACTER(len=*), INTENT(in) :: name
LOGICAL, INTENT(in), OPTIONAL :: preserve_original
REAL(wp), INTENT(INOUT) :: array(:, :, :)
CHARACTER(len=*), INTENT(IN) :: name
LOGICAL, INTENT(IN), OPTIONAL :: preserve_original
LOGICAL :: do_copy
REAL(wp), ALLOCATABLE :: backup(:, :, :)
......
......@@ -24,8 +24,8 @@ MODULE mo_util_file
FUNCTION private_symlink(file, link) RESULT(iret) BIND(C, NAME='symlink')
IMPORT :: c_int, c_char
INTEGER(c_int) :: iret
CHARACTER(c_char), DIMENSION(*), INTENT(in) :: file
CHARACTER(c_char), DIMENSION(*), INTENT(in) :: link
CHARACTER(c_char), DIMENSION(*), INTENT(IN) :: file
CHARACTER(c_char), DIMENSION(*), INTENT(IN) :: link
END FUNCTION private_symlink
END INTERFACE
......@@ -33,7 +33,7 @@ MODULE mo_util_file
FUNCTION private_unlink(filename) RESULT(iret) BIND(C, NAME='unlink')
IMPORT :: c_int, c_char
INTEGER(c_int) :: iret
CHARACTER(c_char), DIMENSION(*), INTENT(in) :: filename
CHARACTER(c_char), DIMENSION(*), INTENT(IN) :: filename
END FUNCTION private_unlink
END INTERFACE
......@@ -41,7 +41,7 @@ MODULE mo_util_file
FUNCTION private_islink(filename) RESULT(iret) BIND(C, NAME='util_islink')
IMPORT :: c_int, c_char
INTEGER(c_int) :: iret
CHARACTER(c_char), DIMENSION(*), INTENT(in) :: filename
CHARACTER(c_char), DIMENSION(*), INTENT(IN) :: filename
END FUNCTION private_islink
END INTERFACE
......@@ -49,8 +49,8 @@ MODULE mo_util_file
FUNCTION private_rename(old_filename, new_filename) RESULT(iret) BIND(C, NAME='rename')
IMPORT :: c_int, c_char
INTEGER(c_int) :: iret
CHARACTER(c_char), DIMENSION(*), INTENT(in) :: old_filename
CHARACTER(c_char), DIMENSION(*), INTENT(in) :: new_filename
CHARACTER(c_char), DIMENSION(*), INTENT(IN) :: old_filename
CHARACTER(c_char), DIMENSION(*), INTENT(IN) :: new_filename
END FUNCTION private_rename
END INTERFACE
......@@ -58,8 +58,8 @@ MODULE mo_util_file
FUNCTION private_create_tmpfile(filename, max_len) RESULT(flen) BIND(C, NAME='util_create_tmpfile')
IMPORT :: c_char, c_int
INTEGER(c_int) :: flen
CHARACTER(c_char), DIMENSION(*), INTENT(inout) :: filename
INTEGER(c_int), VALUE, INTENT(in) :: max_len
CHARACTER(c_char), DIMENSION(*), INTENT(INOUT) :: filename
INTEGER(c_int), VALUE, INTENT(IN) :: max_len
END FUNCTION private_create_tmpfile
END INTERFACE
......@@ -67,7 +67,7 @@ MODULE mo_util_file
FUNCTION private_filesize(filename) RESULT(flen) BIND(C, NAME='util_filesize')
IMPORT :: c_long, c_char
INTEGER(c_long) :: flen
CHARACTER(c_char), DIMENSION(*), INTENT(in) :: filename
CHARACTER(c_char), DIMENSION(*), INTENT(IN) :: filename
END FUNCTION private_filesize
END INTERFACE
......@@ -75,7 +75,7 @@ MODULE mo_util_file
FUNCTION private_file_is_writable(filename) RESULT(iwritable) BIND(C, NAME='util_file_is_writable')
IMPORT :: c_int, c_char
INTEGER(c_int) :: iwritable
CHARACTER(c_char), DIMENSION(*), INTENT(in) :: filename
CHARACTER(c_char), DIMENSION(*), INTENT(IN) :: filename
END FUNCTION private_file_is_writable
END INTERFACE
......@@ -97,20 +97,20 @@ CONTAINS
FUNCTION util_symlink(file, link) RESULT(iret)
INTEGER :: iret
CHARACTER(len=*), INTENT(in) :: file
CHARACTER(len=*), INTENT(in) :: link
CHARACTER(len=*), INTENT(IN) :: file
CHARACTER(len=*), INTENT(IN) :: link
iret = private_symlink(TRIM(file)//c_null_char, TRIM(link)//c_null_char)
END FUNCTION util_symlink
FUNCTION util_unlink(filename) RESULT(iret)
INTEGER :: iret
CHARACTER(len=*), INTENT(in) :: filename
CHARACTER(len=*), INTENT(IN) :: filename
iret = private_unlink(TRIM(filename)//c_null_char)
END FUNCTION util_unlink
FUNCTION util_islink(filename) RESULT(islink)
LOGICAL :: islink
CHARACTER(len=*), INTENT(in) :: filename
CHARACTER(len=*), INTENT(IN) :: filename
INTEGER :: iret
iret = private_islink(TRIM(filename)//c_null_char)
islink = .FALSE.
......@@ -119,15 +119,15 @@ CONTAINS
FUNCTION util_rename(old_filename, new_filename) RESULT(iret)
INTEGER :: iret
CHARACTER(len=*), INTENT(in) :: old_filename
CHARACTER(len=*), INTENT(in) :: new_filename
CHARACTER(len=*), INTENT(IN) :: old_filename
CHARACTER(len=*), INTENT(IN) :: new_filename
iret = private_rename(TRIM(old_filename)//c_null_char, TRIM(new_filename)//c_null_char)
END FUNCTION util_rename
FUNCTION create_tmpfile(filename, max_len) RESULT(flen)
INTEGER :: flen
CHARACTER(len=*), INTENT(out) :: filename
INTEGER, INTENT(in) :: max_len
CHARACTER(len=*), INTENT(OUT) :: filename
INTEGER, INTENT(IN) :: max_len
! local variables
INTEGER :: i
!
......@@ -143,8 +143,8 @@ CONTAINS
FUNCTION util_tmpnam(filename, klen) RESULT(flen)
INTEGER :: flen
CHARACTER(len=*), INTENT(out) :: filename
INTEGER, INTENT(in) :: klen
CHARACTER(len=*), INTENT(OUT) :: filename
INTEGER, INTENT(IN) :: klen
flen = create_tmpfile(filename, klen)
IF (flen < 0) THEN
......@@ -154,13 +154,13 @@ CONTAINS
FUNCTION util_filesize(filename) RESULT(flen)
INTEGER(KIND=i8) :: flen
CHARACTER(len=*), INTENT(in) :: filename
CHARACTER(len=*), INTENT(IN) :: filename
flen = private_filesize(TRIM(filename)//c_null_char)
END FUNCTION util_filesize
FUNCTION util_file_is_writable(filename) RESULT(lwritable)
LOGICAL :: lwritable
CHARACTER(len=*), INTENT(in) :: filename
CHARACTER(len=*), INTENT(IN) :: filename
lwritable = (private_file_is_writable(TRIM(filename)//c_null_char) == 1)
END FUNCTION util_file_is_writable
......@@ -186,7 +186,6 @@ CONTAINS
error = c_createSymlink(targetPathCopy, linkNameCopy)
END FUNCTION createSymlink
! @return subtring from from the first "/" to the end of @p in_str.
FUNCTION get_filename(in_str) RESULT(out_str)
! Parameters
CHARACTER(len=*), INTENT(IN) :: in_str
......@@ -201,7 +200,7 @@ CONTAINS
END FUNCTION get_filename
FUNCTION get_filename_noext(name) RESULT(filename)
CHARACTER(len=*), INTENT(in) :: name
CHARACTER(len=*), INTENT(IN) :: name
CHARACTER(LEN=filename_max) :: filename
INTEGER :: end_name
......@@ -215,7 +214,6 @@ CONTAINS
END FUNCTION get_filename_noext
! @return subtring from the begin of @p in_str to the last "/".
FUNCTION get_path(in_str) RESULT(out_str)
! Parameters
CHARACTER(len=*), INTENT(IN) :: in_str
......
......@@ -25,7 +25,7 @@ MODULE mo_util_nml
& BIND(C, NAME='util_annotate_nml')
IMPORT :: c_int, c_char
INTEGER(c_int) :: iret
CHARACTER(c_char), DIMENSION(*), INTENT(in) :: in_filename, out_filename
CHARACTER(c_char), DIMENSION(*), INTENT(IN) :: in_filename, out_filename
END FUNCTION private_annotate_nml
END INTERFACE
......@@ -35,7 +35,7 @@ CONTAINS
FUNCTION util_annotate_nml(in_filename, out_filename) RESULT(iret)
INTEGER :: iret
CHARACTER(len=*), INTENT(in) :: in_filename, out_filename
CHARACTER(len=*), INTENT(IN) :: in_filename, out_filename
iret = private_annotate_nml(TRIM(in_filename)//c_null_char, &
& TRIM(out_filename)//c_null_char)
END FUNCTION util_annotate_nml
......
......@@ -55,7 +55,7 @@ MODULE mo_util_rusage
IMPORT :: c_int, c_long, rusage
INTEGER(c_int) :: r
INTEGER(c_int), VALUE :: who
TYPE(rusage), INTENT(inout) :: r_usage
TYPE(rusage), INTENT(INOUT) :: r_usage
END FUNCTION getrusage
END INTERFACE
......@@ -89,8 +89,8 @@ CONTAINS
FUNCTION add_rss_list(name, tag) RESULT(idx)
INTEGER :: idx
CHARACTER(len=*), INTENT(in) :: name
CHARACTER(len=10), INTENT(inout), OPTIONAL :: tag
CHARACTER(len=*), INTENT(IN) :: name
CHARACTER(len=10), INTENT(INOUT), OPTIONAL :: tag
TYPE(rss_list), ALLOCATABLE :: tmp_rss_lists(:)
INTEGER :: ist
......@@ -128,7 +128,7 @@ CONTAINS
END FUNCTION add_rss_list
SUBROUTINE add_rss_usage(list_idx)
INTEGER, INTENT(in) :: list_idx
INTEGER, INTENT(IN) :: list_idx
TYPE(rusage) :: ru
INTEGER :: max_size, idx, ret
......@@ -220,7 +220,7 @@ CONTAINS
FUNCTION find_next_free_unit(istart, istop) RESULT(iunit)
INTEGER :: iunit
INTEGER, INTENT(in) :: istart, istop
INTEGER, INTENT(IN) :: istart, istop
!
INTEGER :: kstart, kstop
LOGICAL :: lfound, lopened
......
......@@ -687,7 +687,7 @@ CONTAINS
END SUBROUTINE quicksort_string
SUBROUTINE insertion_sort_int(a)
INTEGER, INTENT(inout) :: a(:)
INTEGER, INTENT(INOUT) :: a(:)
INTEGER :: t, h
INTEGER :: i, n
......
......@@ -127,7 +127,7 @@ CONTAINS
! Conversion: Uppercase -> Lowercase
!
PURE FUNCTION tolower(uppercase)
CHARACTER(len=*), INTENT(in) :: uppercase
CHARACTER(len=*), INTENT(IN) :: uppercase
CHARACTER(len=LEN_TRIM(uppercase)) :: tolower
!
INTEGER, PARAMETER :: idel = ICHAR('a') - ICHAR('A')
......@@ -150,7 +150,7 @@ CONTAINS
!> convert string to lower case in-place, i.e. destructively
!!
ELEMENTAL SUBROUTINE lowcase(s)
CHARACTER(len=*), INTENT(inout) :: s
CHARACTER(len=*), INTENT(INOUT) :: s
INTEGER, PARAMETER :: idel = ICHAR('a') - ICHAR('A')
INTEGER, PARAMETER :: ia = ICHAR('A')
INTEGER, PARAMETER :: iz = ICHAR('Z')
......@@ -167,7 +167,7 @@ CONTAINS
! Conversion: Lowercase -> Uppercase
!
PURE FUNCTION toupper(lowercase)
CHARACTER(len=*), INTENT(in) :: lowercase
CHARACTER(len=*), INTENT(IN) :: lowercase
CHARACTER(len=LEN_TRIM(lowercase)) :: toupper
!
INTEGER, PARAMETER :: idel = ICHAR('A') - ICHAR('a')
......@@ -192,7 +192,7 @@ CONTAINS
! leading spaces.
!
PURE SUBROUTINE tocompact(string)
CHARACTER(len=*), INTENT(inout) :: string
CHARACTER(len=*), INTENT(INOUT) :: string
! local variables
INTEGER :: offset, i, i_max
CHARACTER :: char
......@@ -234,8 +234,8 @@ CONTAINS
!
PURE FUNCTION int2string(n, opt_fmt)
CHARACTER(len=11) :: int2string ! result
INTEGER, INTENT(in) :: n
CHARACTER(len=*), INTENT(in), OPTIONAL :: opt_fmt
INTEGER, INTENT(IN) :: n
CHARACTER(len=*), INTENT(IN), OPTIONAL :: opt_fmt
!
CHARACTER(len=11) :: fmt
......@@ -254,8 +254,8 @@ CONTAINS
!
PURE FUNCTION float2string(n, opt_fmt)
CHARACTER(len=32) :: float2string ! result
REAL, INTENT(in) :: n
CHARACTER(len=*), INTENT(in), OPTIONAL :: opt_fmt
REAL, INTENT(IN) :: n
CHARACTER(len=*), INTENT(IN), OPTIONAL :: opt_fmt
!
CHARACTER(len=10) :: fmt
!
......@@ -271,8 +271,8 @@ CONTAINS
!
PURE FUNCTION double2string(n, opt_fmt)
CHARACTER(len=32) :: double2string ! result
DOUBLE PRECISION, INTENT(in) :: n
CHARACTER(len=*), INTENT(in), OPTIONAL :: opt_fmt
DOUBLE PRECISION, INTENT(IN) :: n
CHARACTER(len=*), INTENT(IN), OPTIONAL :: opt_fmt
!
CHARACTER(len=10) :: fmt
!
......@@ -291,7 +291,7 @@ CONTAINS
!
PURE FUNCTION logical2string(n)
CHARACTER(len=10) :: logical2string ! result
LOGICAL, INTENT(in) :: n
LOGICAL, INTENT(IN) :: n
!
WRITE (logical2string, '(l10)') n
logical2string = ADJUSTL(logical2string)
......@@ -514,7 +514,7 @@ CONTAINS
!==============================================================================
!+ Remove duplicate entries from a list of strings.
!
! @note This is a very crude implementation, quadratic complexity.
! This is a very crude implementation, quadratic complexity.
!
SUBROUTINE remove_duplicates(str_list, nitems)
CHARACTER(len=*), INTENT(INOUT) :: str_list(:)
......@@ -545,7 +545,7 @@ CONTAINS
!==============================================================================
!+ Remove entries from a list of strings which occur in a second list.
!
! @note This is a very crude implementation, quadratic complexity.
! This is a very crude implementation, quadratic complexity.
!
SUBROUTINE difference(str_list1, nitems1, str_list2, nitems2)
CHARACTER(len=*), INTENT(INOUT) :: str_list1(:)
......@@ -579,7 +579,7 @@ CONTAINS
!+ Add entries from list 2 to list 1, if they are not already present
!+ in list 1.
!
! @note This is a very crude implementation, quadratic complexity.
! This is a very crude implementation, quadratic complexity.
!
SUBROUTINE add_to_list(str_list1, nitems1, str_list2, nitems2)
CHARACTER(len=*), INTENT(INOUT) :: str_list1(:)
......@@ -648,7 +648,6 @@ CONTAINS
CHARACTER(len=*), INTENT(IN) :: in_str
CHARACTER(len=MAX_CHAR_LENGTH) :: result_str, subst, keyword
! note: we don't call "finish" to avoid circular dep
IF (LEN_TRIM(in_str) > MAX_CHAR_LENGTH) &
& CALL finish(modname, "with_keywords: string too long")
result_str = in_str
......@@ -667,12 +666,6 @@ CONTAINS
! then we can use this function to replace a keyword that denotes a
! whole group of variables (like "tracers"), for example by
! group_list="Q1", "Q2", etc.
!
! @param[inout] varlist original array of strings (variable names)
! @param[in] group_name substitution keyword (i.e. variable group name)
! @param[in] group_list array of strings that will be inserted
!
! @return contents of @p varlist where @p group_name has been replaced.
!------------------------------------------------------------------------------
SUBROUTINE insert_group(varlist, nused, group_name, group_list, ninserted)
CHARACTER(LEN=*), INTENT(INOUT) :: varlist(:)
......@@ -865,7 +858,7 @@ CONTAINS
!> Remove all white space from a string (also between "words").
!
FUNCTION remove_whitespace(in_str)
CHARACTER(len=*), INTENT(in) :: in_str
CHARACTER(len=*), INTENT(IN) :: in_str
CHARACTER(len=LEN_TRIM(in_str)) :: remove_whitespace
! local variables
INTEGER :: i, j, ichar
......@@ -913,8 +906,8 @@ CONTAINS
END FUNCTION toCharacter
SUBROUTINE c2f_char(c, s)
CHARACTER(LEN=:), INTENT(out), ALLOCATABLE :: c
CHARACTER(KIND=c_char), INTENT(in) :: s(:)
CHARACTER(LEN=:), INTENT(OUT), ALLOCATABLE :: c
CHARACTER(KIND=c_char), INTENT(IN) :: s(:)
INTEGER :: i, ierror, slen
CHARACTER(LEN=*), PARAMETER :: routine = modName//":toCharacter"
......
......@@ -54,12 +54,6 @@ CONTAINS
! parse_line = "1,3,5...10,20...nlev"
! More complex example:
! parse_line = "1,2, 10 ...22;2;16-(3+11), N-2,16-(2+10);5"
!
! 08/2014 : F. Prill, DWD
!
! @param[in] parse_line string containing integer numbers
! @param[out] out_values out_values[i] = 1 if "i" was in parse_line
! @param[out] ierr error code != 0 if parser failed
! ---------------------------------------------------------------------
SUBROUTINE util_do_parse_intlist(parse_line, nlev_value, out_values, ierr)
CHARACTER(len=*), INTENT(IN) :: parse_line
......
......@@ -159,8 +159,6 @@ CONTAINS
END DO COLFIND_LOOP
END FUNCTION get_column_index
!> @return Set table entry in the given row and for a given column.
!
SUBROUTINE set_table_entry(table, irow, column_title, entry_str)
TYPE(t_table), INTENT(INOUT) :: table
INTEGER, INTENT(IN) :: irow
......
......@@ -30,7 +30,7 @@ MODULE mo_util_texthash
CONTAINS
FUNCTION sel_char(key, routine, err_msg) RESULT(ptr)
CLASS(*), POINTER, INTENT(in) :: key
CLASS(*), POINTER, INTENT(IN) :: key
CHARACTER(*), INTENT(IN) :: routine, err_msg
CHARACTER(:), POINTER :: ptr
......@@ -74,7 +74,7 @@ CONTAINS
END FUNCTION text_hash
LOGICAL FUNCTION text_isEqual(keyA, keyB) RESULT(is_equal)
CLASS(*), POINTER, INTENT(in) :: keyA, keyB
CLASS(*), POINTER, INTENT(IN) :: keyA, keyB
CHARACTER(*), PARAMETER :: routine = modname//":text_isEqual_cs"
CHARACTER(:), POINTER :: keyA_p, keyB_p
......