Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
117 commits
Select commit Hold shift + click to select a range
39840b6
Start adding timers to lnd_set_decomp_and_domain_from_readmesh
ekluzek Jul 29, 2025
7003e1d
Make an internal subroutine for deallocation inside of lnd_set_decomp…
ekluzek Aug 1, 2025
f8e934f
Add release of the ESMF objects in the lnd_set_decomp_and_domain_from…
ekluzek Aug 1, 2025
e042339
ESMF tells me that some of these objects are used later and can not b…
ekluzek Aug 1, 2025
90f9210
Turn on removing all ESMF garbage for the things deleted, and add not…
ekluzek Aug 1, 2025
4be1136
Deallocate lndfrac_loc_input
ekluzek Aug 5, 2025
094288c
Add timers
ekluzek Aug 6, 2025
fe74146
Add more timers
ekluzek Aug 6, 2025
bc7bd46
Add return's after endrun calls so that the self-tests can trap expec…
ekluzek Aug 11, 2025
35a101d
Change endrun calls to use new format for file and line, and remove t…
ekluzek Aug 20, 2025
09e1d46
decompInit/decompMod: initialize pointers to null, add checking that …
ekluzek Aug 25, 2025
9367dd5
Allow get_proc_bounds to exit early if only b3gg/endg will be needed,…
ekluzek Aug 26, 2025
57ee0d3
Return up the chain in decompInit after endrun, for the testing. Do s…
ekluzek Aug 27, 2025
0a7ff22
Move comment over for clarity
ekluzek Aug 29, 2025
a892c4c
Add a MPI_SCAN as a temporary to start testing how it works and compa…
ekluzek Sep 2, 2025
a03b616
Start filling other procinfo settings with mpi_scan, this passes for …
ekluzek Sep 5, 2025
c3b43e8
Remove the mpiscan bit about clumpcnt
ekluzek Sep 5, 2025
33c15e5
Add global i,j indices for each gridcell on a processor to the proces…
ekluzek Sep 6, 2025
5cad336
Add more testing, test new processor_type methods, set gindex_global …
ekluzek Sep 6, 2025
d799ece
Can't do this test yest, as only gridcells are set at this point and …
ekluzek Sep 6, 2025
d1e5e5f
Fix setting of gi and gj indices, the serial case runs to completion now
ekluzek Sep 8, 2025
2dd6f06
Add ggidx global index to the processor_type, allocate, set and deall…
ekluzek Sep 8, 2025
ed351d4
Correct the indexing for ggidx
ekluzek Sep 9, 2025
2f0837c
Remove the prints that weren't with an abort
ekluzek Sep 9, 2025
444b834
Get it working for a threaded case, by adding an additional loop over…
ekluzek Sep 9, 2025
93e1bfe
Add more testing for correctness, add some notes about what can be re…
ekluzek Sep 11, 2025
29a334c
Get it working for the threaded case
ekluzek Sep 12, 2025
7a7f2dc
Comment out the old code and just use the new MPI_SCAN way, this work…
ekluzek Sep 13, 2025
623d7b8
Just do the checking over the local processor clumps and not all the …
ekluzek Sep 14, 2025
9f467b0
Remove the decompInit_lnd old code commented out, and extra writes to…
ekluzek Sep 29, 2025
f0b05bc
Initialize the gi/gj arrays to unset
ekluzek Sep 29, 2025
4eff18d
Add in an if for hist_printflds if noio from mpi_scan branch
ekluzek Dec 15, 2025
8bf9e52
Bring some of the missing things from the mpi_scan branch missed in t…
ekluzek Dec 15, 2025
a2e74ae
Remove some of the timers we don't really need on main
ekluzek Dec 15, 2025
cb1a775
A few changes on mpi_scan that don't need to come to main, remove som…
ekluzek Dec 15, 2025
07f9309
Add some comments and comment line breaks for new subroutines
ekluzek Dec 15, 2025
08d5d13
Merge remote-tracking branch 'escomp/b4b-dev' into decomp_mpi_scan_mo…
ekluzek Dec 16, 2025
d2ed480
Use shr_assert rather than assert_equal
ekluzek Dec 16, 2025
6ae1789
Update src/main/decompInitMod.F90
ekluzek Dec 16, 2025
f786948
Apply suggestions from code review
ekluzek Dec 16, 2025
0574ad7
Add explicit if statements around cohort settings for FATES, add and …
ekluzek Dec 16, 2025
d14b998
Only deallocate lndfrac_loc_input if it's associated, and initialize …
ekluzek Dec 18, 2025
cf5c992
Merge branch 'b4b-dev' into decomp_mpi_scan_move_to_b4b
ekluzek Dec 19, 2025
7a95c40
Add add_simple_patch optional argument in #3672, and use it for the o…
ekluzek Dec 20, 2025
fa03c00
Turn on more options to get more fields turned on
ekluzek Jan 7, 2026
2bc86a3
Merge branch 'b4b-dev' into decomp_mpi_scan_move_to_b4b
ekluzek Jan 8, 2026
354d965
Merge branch 'b4b-dev' into decomp_mpi_scan_move_to_b4b
ekluzek Jan 15, 2026
53d8323
Merge branch 'decomp_mpi_scan_move_to_b4b' of github.com:ekluzek/CTSM…
ekluzek Jan 15, 2026
e772ac2
Move nglob_x/nglob_y from decompInit to decompMod as module data
ekluzek Jan 19, 2026
b7f9bed
Merge branch 'decompMod_unittest' into decomp_mpi_scan_move_to_b4b
ekluzek Jan 20, 2026
a74f8be
Merge remote-tracking branch 'escomp/b4b-dev' into decomp_mpi_scan_mo…
ekluzek Jan 22, 2026
c9f5c72
Add call to calc_globalxy_indices in endrun, this leads to problems i…
ekluzek Jan 28, 2026
201889a
Make the calc functions pure so they can be called from endrun, the c…
ekluzek Jan 28, 2026
cd5e29f
Add a test for calc_globalxy_indices, to get this working temporarily…
ekluzek Jan 29, 2026
30b6916
Initialize nglob_x/nglob_y to -1, so can detect it not being set
ekluzek Jan 30, 2026
4c8698c
Add a test for fails of calc_globalxy
ekluzek Jan 30, 2026
42fc652
Make a subroutine public, so can be unit tested, change order of erro…
ekluzek Jan 30, 2026
9a54398
Add some fail tests for calc_ijindices_from_full_global_index that ar…
ekluzek Jan 30, 2026
84aa74c
Make pure again so will be safe to call from endrun
ekluzek Jan 30, 2026
df03ba6
Move msg and add_msg to top of module so doesn't have to be repeated …
ekluzek Jan 30, 2026
d46582a
Move settings of the decomp from the decomp test to the unittest shar…
ekluzek Feb 18, 2026
43ffa94
Merge branch 'b4b-dev' into decomp_mpi_scan_move_to_b4b
ekluzek Mar 12, 2026
2b867f5
Merge branch 'b4b-dev' into decomp_mpi_scan_move_to_b4b
ekluzek Mar 12, 2026
eb7a62e
Merge branch 'b4b-dev' into decomp_mpi_scan_move_to_b4b
ekluzek Mar 16, 2026
d847989
Merge remote-tracking branch 'escomp/b4b-dev' into decomp_mpi_scan_mo…
ekluzek Mar 25, 2026
d8e6681
Merge remote-tracking branch 'escomp/b4b-dev' into decomp_mpi_scan_mo…
ekluzek Apr 13, 2026
f84d5b8
Some work on getting unit tests closer to working, make sure array su…
ekluzek Apr 15, 2026
4f1ed37
Remove a part that wasn't working, just assume as shown in #3931 that…
ekluzek Apr 15, 2026
b75ece3
Make sure the subgrid teardown is called for every test that sets up …
ekluzek Apr 16, 2026
1f46acb
Move allocate for first part of processor_type from decompInitMod to …
ekluzek Apr 17, 2026
a18a1db
Add decompmod_allocate_clumps to decompMod to allocate the clumps
ekluzek Apr 17, 2026
fd199f9
Create decompmod_allocate_gindex to allocate global_gindex and move i…
ekluzek Apr 17, 2026
851bcf7
Move another set of allocation to procinfo%AllocateAfterGCellSet
ekluzek Apr 17, 2026
1eed779
Merge branch 'b4b-dev' into decomp_mpi_scan_move_to_b4b
ekluzek May 1, 2026
bb2958f
Move initialization of procinfo and clumps from decompInitMod to insi…
ekluzek May 2, 2026
d3a9af9
Assume one landunit per gridcell, one column per gridcell and one pat…
ekluzek May 2, 2026
f5ef978
Add decompmod_allocate_gindex to use statement so will compile
ekluzek May 2, 2026
9162252
Calling decompmod_allocate_gindex inside of the unittestSubgrid:set_d…
ekluzek May 3, 2026
7b6f8b1
Make the grid size uneven to catch certain types of errors, also fill…
ekluzek May 4, 2026
59ba880
Correct setting of gi/gj so it's indivdiual index rather than whole a…
ekluzek May 4, 2026
89619e7
Fix the error that Brian found with the help of AI, without this fix …
ekluzek May 4, 2026
1057fac
Merge branch 'b4b-dev' into decomp_mpi_scan_move_to_b4b
ekluzek May 9, 2026
f0e0a71
Add a test with the ni/nj sizes switched which catches problems with …
ekluzek May 9, 2026
08690d3
Remove write statements no longer needed
ekluzek May 9, 2026
8a62e99
Remove gi and gj arrays with unit tests working
ekluzek May 9, 2026
784899c
Also remove gi/gj from decompInit
ekluzek May 9, 2026
31a5c9d
Add note about fails
ekluzek May 10, 2026
7869d71
Set all of the gindex arrays, and add tests for get_global_index that…
ekluzek May 10, 2026
567c498
get_global_index does NOT work for subgrid_level_lndgrid, and decompM…
ekluzek May 10, 2026
333b6a7
Add tests that gindex for subgrid_level_lndgrid is correct and same a…
ekluzek May 10, 2026
9afc388
Remove ggidx and use gindex_global in it's place
ekluzek May 10, 2026
5c6c48b
Remove AllocateAfterGCellSet as no longer needed with gi/gj and ggidx…
ekluzek May 10, 2026
3d3fa98
Merge branch 'b4b-dev' into decomp_mpi_scan_move_to_b4b
ekluzek May 10, 2026
a0e06bc
Apply a few changes recommended with a review by co-pilot of the chan…
ekluzek May 10, 2026
5bf8cdd
Fix the user_nl_clm file as pointed out by co-pilot
ekluzek May 10, 2026
bbaf8fc
Fix a test as pointed out by co-pilot in review of the decomp_init tests
ekluzek May 10, 2026
0b523cb
Changes needed to get to build and run for a full model case
ekluzek May 10, 2026
5a6c34d
Add notes about the limitations of the decompMod and abortutils tests
ekluzek May 10, 2026
3dd38b6
Update the note for MPI_SCAN to note that MPI libraries may have diff…
ekluzek May 10, 2026
9cb558d
Merge branch 'b4b-dev' into decomp_mpi_scan_move_to_b4b
ekluzek May 11, 2026
56fa0a7
Seperate the deallocation of the ESMF objects from the general arrays…
ekluzek May 14, 2026
0702179
Merge tag 'ctsm5.4.044' into merge-master-20260609
ekluzek Jun 9, 2026
445f78d
Merge pull request #4085 from ekluzek/merge-master-20260609
ekluzek Jun 9, 2026
165e274
Merge branch 'b4b-dev' into decomp_mpi_scan_move_to_b4b
ekluzek Jun 24, 2026
66ad67f
Update src/main/test/accumul_test/test_accumul.pf
ekluzek Jul 1, 2026
4545cfa
Remove extra indent space that accidentally made it in
ekluzek Jul 2, 2026
835bb1c
Shorten the wallclock for the mpasa3p75 tests since they no longer ne…
ekluzek Jul 6, 2026
ca42e0b
Add the default mpasa3p75 test to the ctsm_sci testlist so that we te…
ekluzek Jul 6, 2026
fa8b40d
Remove the mpasa15 decomp_init test from expected fails as it's working
ekluzek Jul 6, 2026
0b9cd04
Merge pull request #3666 from ekluzek/decomp_mpi_scan_move_to_b4b
ekluzek Jul 6, 2026
67ba35c
reduce memory usage in CTSM init
sjsprecious Jun 11, 2026
599d8e8
reuse already-built CLM mesh
sjsprecious Jun 19, 2026
2a68d04
temporary hold for a new cdeps tag
sjsprecious Jun 25, 2026
aa1f87b
update interface with cdeps changes
sjsprecious Jun 29, 2026
2669220
fix failed tests for mpi-serial
sjsprecious Jun 30, 2026
d7f811d
update cdeps tag
sjsprecious Jul 2, 2026
acc0b2b
revert update of cdeps module
sjsprecious Jul 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions cime_config/testdefs/ExpectedTestFails.xml
Original file line number Diff line number Diff line change
Expand Up @@ -293,10 +293,10 @@

<!-- decomp_init test list-->

<test name="SMS_Ln1_PL.mpasa15_mpasa15.I2000Clm45Sp.derecho_intel.clm-run_self_tests">
<test name="SMS_Ln1_PL.mpasa3p75_mpasa3p75_mt13.I2000Clm45Sp.derecho_intel.clm-for_testing_fastsetup_bypassrun--clm-mpasa3p75">
<phase name="RUN">
<status>FAIL</status>
<issue>#3316</issue>
<issue>#4107</issue>
</phase>
</test>

Expand Down
5 changes: 3 additions & 2 deletions cime_config/testdefs/testlist_clm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4545,6 +4545,7 @@
<test name="SMS_Ln1" grid="mpasa3p75_mpasa3p75_mt13" compset="I2000Clm45Sp" testmods="clm-for_testing_fastsetup_bypassrun--clm-mpasa3p75">
<machines>
<machine name="derecho" compiler="intel" category="uhr_decomp_init"/>
<machine name="derecho" compiler="intel" category="ctsm_sci"/>
</machines>
<options>
<option name="wallclock">0:15:00</option>
Expand All @@ -4556,7 +4557,7 @@
<machine name="derecho" compiler="intel" category="uhr_decomp_init"/>
</machines>
<options>
<option name="wallclock">1:00:00</option>
<option name="wallclock">0:15:00</option>
<option name="comment">Initialization test for mpasa3p75 "Large" layout</option>
</options>
</test>
Expand All @@ -4565,7 +4566,7 @@
<machine name="derecho" compiler="intel" category="uhr_decomp_init"/>
</machines>
<options>
<option name="wallclock">1:00:00</option>
<option name="wallclock">0:15:00</option>
<option name="comment">Initialization test for mpasa3p75 with "Large" high-memory layout with high memory by only using 80 processors per node</option>
</options>
</test>
Expand Down
5 changes: 4 additions & 1 deletion src/biogeophys/UrbanParamsType.F90
Original file line number Diff line number Diff line change
Expand Up @@ -425,7 +425,10 @@ subroutine UrbanInput(begg, endg, mode)
if (masterproc) write(iulog,*)'PCT_URBAN is not multi-density, nlevurb set to 0'
end if

if ( nlevurb == 0 ) return
if ( nlevurb == 0 ) then
call ncd_pio_closefile(ncid)
return
end if

! Allocate dynamic memory
allocate(urbinp%canyon_hwr(begg:endg, numurbl), &
Expand Down
228 changes: 228 additions & 0 deletions src/cpl/share_esmf/clm_shmem_mod.F90
Original file line number Diff line number Diff line change
@@ -0,0 +1,228 @@
module clm_shmem_mod
!-----------------------------------------------------------------------------
! Per-node MPI-3 shared-memory helper for large arrays that would otherwise be
! replicated identically on every MPI rank. One physical copy is allocated per
! shared-memory node and mapped into every rank on that node, freeing
! (ranks_per_node - 1) copies per node.
!
! Ported from CAM's cam_shmem_mod (src/utils/cam_shmem_mod.F90) and specialized
! for the CTSM decomposition setup: it provides a default-integer rank-1
! allocator (the CAM module only has real r4/r8 2d-5d wrappers) plus a
! node-leader sum-reduce that builds a globally-summed array in a node-shared
! buffer without every rank holding its own global-sized copy.
!
! Usage (collective over the land communicator mpicom):
! call clm_shmem_alloc_i4_1d(ptr, win, n) ! all ranks
! if (clm_shmem_is_leader()) ptr(:) = 0 ! leader owns the storage
! call clm_shmem_fence(win) ! publish the zeros
! <each rank stores into its disjoint indices of ptr>
! call clm_shmem_leader_allreduce_sum_i4(ptr,win,n) ! fence; sum across nodes; fence
! <all ranks may now read ptr for the rest of its lifetime>
! call clm_shmem_free(ptr, win) ! collective over the node comm
!
! The MPI-3 shared-memory path is used for real MPI builds. mpi-serial does not
! implement the MPI-2/MPI-3 one-sided / shared-memory interfaces, so for
! mpi-serial builds (CPP macro NO_MPI2, set by CIME for MPILIB=mpi-serial) a
! single-task fallback is compiled instead: each "node-shared" array is a plain
! local allocation (one task is its own node and its own leader, so there is no
! cross-rank sharing and the leader sum-reduce is a no-op). The F90 'mpi' module
! (not mpif.h) is used because the TYPE(C_PTR) overloads of MPI_WIN_ALLOCATE_SHARED
! / MPI_WIN_SHARED_QUERY are only guaranteed there (MPI-3.0).
!-----------------------------------------------------------------------------

use mpi
use, intrinsic :: iso_c_binding, only : c_ptr, c_f_pointer
use spmdMod , only : mpicom
use abortutils, only : endrun

implicit none
private

public :: clm_shmem_alloc_i4_1d ! allocate a node-shared default-integer rank-1 array
public :: clm_shmem_leader_allreduce_sum_i4 ! sum a node-shared array across nodes, in place
public :: clm_shmem_free ! free a node-shared array (MPI_Win_free)
public :: clm_shmem_fence ! synchronize a window (publish writes)
public :: clm_shmem_is_leader ! .true. on the leader (rank 0) of this node
public :: clm_shmem_leader_comm ! communicator containing only node leaders
public :: clm_shmem_npes_per_node ! number of ranks sharing this node

interface clm_shmem_free
module procedure clm_shmem_free_i4_1d
end interface clm_shmem_free

! Sentinel window handle used by the mpi-serial fallback (no real MPI window).
integer, parameter :: SHMEM_WIN_NONE = -1

logical, save :: initialized = .false.
integer, save :: node_comm = MPI_COMM_NULL ! ranks sharing a node
integer, save :: leader_comm = MPI_COMM_NULL ! one rank per node (the leaders)
integer, save :: node_rank = 0
integer, save :: node_size = 1
logical, save :: is_leader = .true.

contains

!=============================================================================
subroutine init_comms()
! Lazily build the node-local and node-leader communicators. Collective over
! mpicom; safe to call from every shared-memory request.
#ifndef NO_MPI2
integer :: ierr, color
#endif

if (initialized) return

#ifndef NO_MPI2
call mpi_comm_split_type(mpicom, MPI_COMM_TYPE_SHARED, 0, MPI_INFO_NULL, &
node_comm, ierr)
call mpi_comm_rank(node_comm, node_rank, ierr)
call mpi_comm_size(node_comm, node_size, ierr)
is_leader = (node_rank == 0)

! Communicator of node leaders only. masterproc (global rank 0) is a leader.
if (is_leader) then
color = 0
else
color = MPI_UNDEFINED
end if
call mpi_comm_split(mpicom, color, 0, leader_comm, ierr)
#else
! mpi-serial: a single task is its own node and its own leader.
node_rank = 0
node_size = 1
is_leader = .true.
#endif

initialized = .true.
end subroutine init_comms

!=============================================================================
subroutine clm_shmem_alloc_i4_1d(ptr, win, n)
! Allocate a node-shared default-integer array of length n. Only the node
! leader requests storage; peers map the leader's contiguous segment.
integer, pointer, intent(out) :: ptr(:)
integer, intent(out) :: win
integer, intent(in) :: n

#ifndef NO_MPI2
integer(kind=MPI_ADDRESS_KIND) :: winsize, qsize
integer :: ierr, disp_unit, qdisp
integer :: itmp
type(c_ptr) :: baseptr
#else
integer :: istat
#endif

call init_comms()

#ifndef NO_MPI2
disp_unit = storage_size(itmp) / 8 ! bytes per default integer (robust to -i8)
if (is_leader) then
winsize = int(n, MPI_ADDRESS_KIND) * int(disp_unit, MPI_ADDRESS_KIND)
else
winsize = 0_MPI_ADDRESS_KIND
end if

call mpi_win_allocate_shared(winsize, disp_unit, MPI_INFO_NULL, node_comm, &
baseptr, win, ierr)
if (ierr /= MPI_SUCCESS) call endrun('clm_shmem_mod: MPI_Win_allocate_shared failed')

! Non-leaders learn the address of the leader's (rank 0) contiguous segment.
if (.not. is_leader) then
call mpi_win_shared_query(win, 0, qsize, qdisp, baseptr, ierr)
if (ierr /= MPI_SUCCESS) call endrun('clm_shmem_mod: MPI_Win_shared_query failed')
end if

call c_f_pointer(baseptr, ptr, [n])
#else
! mpi-serial: single task, no shared memory -- a plain local allocation.
allocate(ptr(n), stat=istat)
if (istat /= 0) call endrun('clm_shmem_mod: allocate failed (mpi-serial path)')
win = SHMEM_WIN_NONE
#endif
end subroutine clm_shmem_alloc_i4_1d

!=============================================================================
subroutine clm_shmem_leader_allreduce_sum_i4(ptr, win, n)
! Build a globally-summed array in the node-shared buffer ptr(1:n): fence so
! every rank's stores are visible, then the node leaders sum their per-node
! partials across nodes (over leader_comm) into the shared buffer, then fence
! to publish the result to all ranks on the node. Collective over node_comm;
! every rank on the node must call it.
integer, pointer, intent(inout) :: ptr(:)
integer, intent(in) :: win
integer, intent(in) :: n

#ifndef NO_MPI2
integer, allocatable :: tmp(:)
integer :: ierr
#endif

call clm_shmem_fence(win) ! all node stores complete and visible to leader
#ifndef NO_MPI2
if (is_leader) then
allocate(tmp(n))
call mpi_allreduce(ptr, tmp, n, MPI_INTEGER, MPI_SUM, leader_comm, ierr)
if (ierr /= MPI_SUCCESS) call endrun('clm_shmem_mod: MPI_Allreduce failed')
ptr(1:n) = tmp(1:n)
deallocate(tmp)
end if
#else
! mpi-serial: the single task owns the whole domain, so ptr already holds the
! global array -- there is nothing to sum across nodes.
#endif
call clm_shmem_fence(win) ! publish global result to all node ranks
end subroutine clm_shmem_leader_allreduce_sum_i4

!=============================================================================
subroutine clm_shmem_fence(win)
! Collective over the node communicator; synchronizes the window so stores
! become visible to all ranks on the node. A no-op for the mpi-serial path.
integer, intent(in) :: win
#ifndef NO_MPI2
integer :: ierr
call mpi_win_fence(0, win, ierr)
if (ierr /= MPI_SUCCESS) call endrun('clm_shmem_mod: MPI_Win_fence failed')
#endif
end subroutine clm_shmem_fence

!=============================================================================
subroutine clm_shmem_free_i4_1d(ptr, win)
! Free the node-shared window and disassociate the pointer. Collective over
! the node communicator; a no-op when win == MPI_WIN_NULL.
integer, pointer :: ptr(:)
integer, intent(inout) :: win
#ifndef NO_MPI2
integer :: ierr
if (win /= MPI_WIN_NULL) then
call mpi_win_free(win, ierr)
if (ierr /= MPI_SUCCESS) call endrun('clm_shmem_mod: MPI_Win_free failed')
end if
if (associated(ptr)) nullify(ptr)
win = MPI_WIN_NULL
#else
! mpi-serial: ptr was a plain local allocation, so deallocate it.
if (associated(ptr)) deallocate(ptr)
win = SHMEM_WIN_NONE
#endif
end subroutine clm_shmem_free_i4_1d

!=============================================================================
logical function clm_shmem_is_leader()
call init_comms()
clm_shmem_is_leader = is_leader
end function clm_shmem_is_leader

!=============================================================================
integer function clm_shmem_leader_comm()
call init_comms()
clm_shmem_leader_comm = leader_comm
end function clm_shmem_leader_comm

!=============================================================================
integer function clm_shmem_npes_per_node()
call init_comms()
clm_shmem_npes_per_node = node_size
end function clm_shmem_npes_per_node

end module clm_shmem_mod
Loading
Loading