• 大小: 2.72MB
    文件类型: .gz
    金币: 1
    下载: 0 次
    发布日期: 2023-09-08
  • 语言: ASP
  • 标签: vasp  源代码  DFT  

资源简介

仅可用于科研学习目的,切勿用于商业或论文发表。

资源截图

代码片段和文件信息

/*
 * Some functions callable from fortran to use shared memory
 * wv 2011
 * shmem stuff from Willem Vermin SARA
 */
#include 
#include 
#include 
#include 
#include 
#include 
/*
 * get a shared memory segment
 * input: size (fortran integer*8)
 * output: shmem id
 */
void getshmem_(size_t *size int*id)
{
  key_t key;
  int shmflg;
  int shmid;
  key = IPC_PRIVATE;
  shmflg = IPC_CREAT | IPC_EXCL | 0600 | SHM_NORESERVE ;
  shmid = shmget(key *size shmflg);
  if (shmid == -1)
  {
    fprintf(stderr“%s in %s: cannot create shared segment %ld \n“__FUNCTION____FILE__*size);
    perror(0);
    exit(1);
  }
  *id = shmid;
}

void getshmem_error_(size_t *size int*id)
{
  key_t key;
  int shmflg;
  int shmid;
  key = IPC_PRIVATE;
  shmflg = IPC_CREAT | IPC_EXCL | 0600 | SHM_NORESERVE ;
  shmid = shmget(key *size shmflg);
  *id = shmid;
}
/*
 * attach shared memory to a pointer
 * input: shhmid: shared memory id
 * output: address (fortran integer*8)
 */
void attachshmem_(int *shmid void **address)
{
  void *shmaddr*r;
  int shmflg;
  shmflg = 0;
  shmaddr = 0;

  r = shmat(*shmid shmaddr shmflg);
  if (r == (void*) -1)
  {
    fprintf(stderr“%s in %s: cannot get address of shared segment\n“__FUNCTION____FILE__);
    perror(0);
    exit(1);
  }
  *address = r;
}
/*
 * detach shared memory from pointer
 * input: address (fortran integer*8)
 */
void detachshmem_(void **address)
{
  int r;
  r = shmdt(*address);
  if (r == -1)
  {
    fprintf(stderr“%s in %s:%d: cannot detach shared segment\n“__FUNCTION____FILE____LINE__);
    perror(0);
    exit(1);
  }
}
/*
 * destroy shared memory
 * input: shmid: shared memory id
 */
void destroyshmem_(int *shmid)
{
  struct shmid_ds buf;
  int r = shmctl(*shmidIPC_RMID&buf);
  if (r == -1)
  {
    fprintf(stderr“%s in %s:%d: cannot destroy shared segment\n“__FUNCTION____FILE____LINE__);
    perror(0);
    exit(1);
  }
}


/*
 * get a set of semaphores
 * input: size 
 * output: semaphores id
 */
void getsem_(int *size int*id)
{
  key_t key;
  int semflg;
  int semid;
  int mysize;
  int i rc;
  short  sarray[(*size)+1];

  key = IPC_PRIVATE;
  semflg = IPC_CREAT | IPC_EXCL | 0600;
  semflg = IPC_CREAT | 0600;
  mysize=(*size)+1 ;
  /* here I have an odd problem: using *size+1 instead of mysize 
     sometimes failed
     very odd some cross C-Fortran problem no idea          */
  semid = semget(key mysize semflg);
  if (semid == -1)
  {
    perror(0);
    fprintf(stderr“%s in %s: cannot create semaphores \n“__FUNCTION____FILE__);
    fprintf(stderr“requested size was %d\n“ mysize);
    exit(1);
  }
  /*        ‘1‘ --  The shared memory segment is being used.       */
  /*        ‘0‘ --  The shared memory segment is freed.            */
  /* the very first sempaphore can be  used to loc all others 
     currently this is not entirely thread save and might fail if no barrier
     is used before this lock since we do not

评论

共有 条评论