/***********************************************************************
* GNU Lesser General Public License
*
* This file is part of the GFDL Flexible Modeling System (FMS).
*
* FMS is free software: you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* FMS is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FMS. If not, see .
**********************************************************************/
/* Fortran-callable routine for returning the MLD ("brick"?) where
this thread/process is located. */
#include
#include
#ifdef use_libMPI
#include
#endif
int pe, npes;
#ifdef __sgi
#include
#include
#include
extern pmo_handle_t *mpi_sgi_mld;
extern int mpi_sgi_dsm_ppm;
int find_nodenum(int mynodedev);
int mld_id_() {
/* pmo_handle_t mymld; */
/* int mynodedev; */
/* int mymemorynode; */
#define SIZE 1000000
int array[SIZE];
pm_pginfo_t pginfo_buf;
int thisdev, thisnode;
bzero( array, sizeof(array) ); /* zero to force allocation */
__pm_get_page_info( array, 1, &pginfo_buf, 1 );
thisdev = pginfo_buf.node_dev;
thisnode = find_nodenum(thisdev);
return thisnode;
}
int find_nodenum(int mynodedev) {
int i;
struct stat sbuf;
char buff[80];
for (i=0; ;i++) {
sprintf(buff,"/hw/nodenum/%d",i);
stat(buff, &sbuf);
if (sbuf.st_ino == mynodedev)
return(i);
}
}
#else
int mld_id_() { /* dummy routine for portability */
return 0;
}
#endif /* sgi */
#ifdef test_threadloc
void main(int argc, char **argv) {
MPI_Init( &argc, &argv );
MPI_Comm_rank( MPI_COMM_WORLD, &pe );
MPI_Comm_size( MPI_COMM_WORLD, &npes );
#ifdef _OPENMP
#pragma omp parallel
{
int thrnum = omp_get_thread_num();
printf( "pe=%d thrnum=%d mld=%d\n", pe, thrnum, mld_id_() );
}
#endif
printf( "pe=%d mld=%d\n", pe, mld_id_() );
MPI_Finalize();
}
#endif