LCOV - code coverage report
Current view: | top level - dynamics/se/dycore - namelist_mod.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 34 | 62 | 54.8 %
Date: | 2025-01-13 21:54:50 |  | Functions: | 2 | 2 | 100.0 %

              Line data    Source code
           1             : module namelist_mod
           2             :   !-----------------
           3             :   use cam_logfile,    only: iulog
           4             :   !-----------------
           5             :   use params_mod,     only: recursive, sfcurve
           6             :   !-----------------
           7             :   use shr_string_mod, only: shr_string_toUpper
           8             :   use shr_kind_mod,   only: r8=>shr_kind_r8
           9             :   !-----------------
          10             :   use control_mod,    only:   &
          11             :        partmethod,            & ! Mesh partitioning method (METIS)
          12             :        multilevel,            &
          13             :        numnodes,              &
          14             :        tasknum,               & ! used dg model in AIX machine
          15             :        remapfreq,             & ! number of steps per remapping call
          16             :        statefreq,             & ! number of steps per printstate call
          17             :        runtype,               &
          18             :        cubed_sphere_map,      &
          19             :        limiter_option,        &
          20             :        nu_top,                &
          21             :        hypervis_scaling,      & ! use tensor HV instead of scalar coefficient
          22             :        hypervis_power,        &
          23             :        columnpackage
          24             :
          25             :   !-----------------
          26             :   use thread_mod, only : omp_get_max_threads, max_num_threads, horz_num_threads, vert_num_threads, tracer_num_threads
          27             :   !-----------------
          28             :   use dimensions_mod, only : ne, np, npdg, nnodes, nmpi_per_node, npart, qsize, qsize_d, set_mesh_dimensions
          29             :   !-----------------
          30             :   !-----------------
          31             :   use cam_abortutils, only: endrun
          32             :   use parallel_mod,   only: parallel_t, partitionfornodes, useframes
          33             :   !-----------------
          34             :
          35             :
          36             :   use interpolate_mod, only : set_interp_parameter, get_interp_parameter
          37             :
          38             : !=============================================================================!
          39             :   implicit none
          40             :   private
          41             : !
          42             : ! This module should contain no global data and should only be 'use'd to
          43             : !    call one of the public interfaces below
          44             : !
          45             :   public :: homme_set_defaults
          46             :   public :: homme_postprocess_namelist
          47             :
          48             :  contains
          49             :
          50             :   ! ============================================
          51             :   ! homme_set_defaults:
          52             :   !
          53             :   !  Set default values for namelist variables
          54             :   !
          55             :   ! ============================================
          56        1536 :   subroutine homme_set_defaults()
          57        1536 :     npart               = 1
          58        1536 :     useframes           = 0
          59        1536 :     multilevel          = 1
          60        1536 :     numnodes            = -1
          61        1536 :     runtype             = 0
          62        1536 :     statefreq           = 1
          63        1536 :     remapfreq           = 240
          64        1536 :     tasknum             =-1
          65        1536 :     columnpackage       = "none"
          66        1536 :     nu_top              = 0
          67        1536 :     ne                  = 0
          68             :
          69        1536 :   end subroutine homme_set_defaults
          70             :
          71        1536 :   subroutine homme_postprocess_namelist(mesh_file, par)
          72             :     use mesh_mod,        only: MeshOpen
          73             :     use dimensions_mod,  only: use_cslam
          74             :     ! Dummy arguments
          75             :     character(len=*),  intent(in) :: mesh_file
          76             :     type (parallel_t), intent(in) :: par
          77             :
          78             :     ! Local variable
          79             :     real(kind=r8) :: dt_max
          80             :     character(len=*), parameter :: subname = 'HOMME_POSTPROCESS_NAMELIST: '
          81             :
          82        1536 :     if(par%masterproc) then
          83           2 :       write(iulog, *) subname, 'omp_get_max_threads() = ', max_num_threads
          84             :     end if
          85             :
          86        1536 :     if((vert_num_threads > 1) .and. (limiter_option .ne. 8)) then
          87           0 :        if(par%masterproc) then
          88           0 :          write(iulog, *) subname, 'WARNING: vertical threading on supported for limiter_option != 8 '
          89             :        end if
          90           0 :        vert_num_threads = 1
          91             :     endif
          92             :
          93        1536 :     if (ne /= 0) then
          94        1536 :       if (mesh_file /= "none" .and. mesh_file /= "/dev/null") then
          95           0 :         if (par%masterproc) then
          96           0 :           write(iulog, *) subname, "mesh_file:", trim(mesh_file),        &
          97           0 :                " and ne:",ne," are both sepcified in the input file."
          98           0 :           write(iulog,*) "            Specify one or the other, but not both."
          99             :         end if
         100           0 :         call endrun(subname//"Do not specify ne if using a mesh file input.")
         101             :       end if
         102             :     end if
         103        1536 :     if (par%masterproc) then
         104           2 :       write(iulog,*) subname, "Mesh File:", trim(mesh_file)
         105             :     end if
         106        1536 :     if (ne == 0) then
         107           0 :       if (par%masterproc) then
         108           0 :         write (iulog,*) subname, "Opening Mesh File:", trim(mesh_file)
         109             :       end if
         110           0 :       call set_mesh_dimensions()
         111           0 :       call MeshOpen(mesh_file, par)
         112             :     end if
         113             :
         114             :     ! set map
         115        1536 :     if (cubed_sphere_map < 0) then
         116        1536 :       if (ne == 0) then
         117           0 :         cubed_sphere_map = 2  ! element_local for var-res grids
         118             :       else
         119        1536 :         cubed_sphere_map = 0  ! default is equi-angle gnomonic
         120             :       end if
         121             :     end if
         122             :
         123        1536 :     if ((cubed_sphere_map /= 0) .AND. use_cslam) then
         124           0 :       if (par%masterproc) then
         125           0 :         write(iulog, *) subname, 'fvm transport and require equi-angle gnomonic cube sphere mapping.'
         126           0 :         write(iulog, *) '         Set cubed_sphere_map = 0 or comment it out all together.                          '
         127             :       end if
         128           0 :       call endrun(subname//"ERROR: fvm transport and cubed_sphere_map>0")
         129             :     end if
         130        1536 :     if (par%masterproc) then
         131           2 :       write (iulog,*) subname, "Reference element projection: cubed_sphere_map=",cubed_sphere_map
         132             :     end if
         133             :
         134             :     !logic around different hyperviscosity options
         135        1536 :     if (hypervis_power /= 0) then
         136           0 :       if (hypervis_scaling /= 0) then
         137           0 :         if (par%masterproc) then
         138           0 :           write(iulog, *) subname, 'Both hypervis_power and hypervis_scaling are nonzero.'
         139           0 :           write(iulog, *) '        (1) Set hypervis_power=1, hypervis_scaling=0 for HV based on an element area.'
         140           0 :           write(iulog, *) '        (2) Set hypervis_power=0 and hypervis_scaling=1 for HV based on a tensor.'
         141           0 :           write(iulog, *) '        (3) Set hypervis_power=0 and hypervis_scaling=0 for constant HV.'
         142             :         end if
         143           0 :         call endrun(subname//"ERROR: hypervis_power>0 and hypervis_scaling>0")
         144             :       end if
         145             :     end if
         146             :
         147        1536 :     if (multilevel <= 0) then
         148           0 :       nmpi_per_node = 1
         149             :     end if
         150             :
         151        1536 :     nnodes = npart / nmpi_per_node
         152             :
         153        1536 :     if((numnodes > 0) .and. (multilevel == 1)) then
         154           0 :       nnodes = numnodes
         155           0 :       nmpi_per_node = npart/nnodes
         156             :     end if
         157             :
         158             :     ! ====================================================================
         159             :     !  Do not perform node level partitioning if you are only on one node
         160             :     ! ====================================================================
         161        1536 :     if((nnodes .eq. 1) .and. PartitionForNodes) then
         162           0 :       PartitionForNodes = .FALSE.
         163             :     end if
         164             :
         165        1536 :   end subroutine homme_postprocess_namelist
         166             : end module namelist_mod

Generated by: LCOV version 1.14