예제 #1
0
파일: mpiMain.cpp 프로젝트: aceskpark/osfeo
int
main(int argc, char **argv)
{
  FEM_ObjectBrokerAllClasses theBroker;
  // MPI_MachineBroker theMachine(&theBroker, argc, argv);
  // theMachineBroker = &theMachine;
  theMachineBroker = new MPI_MachineBroker(&theBroker, argc, argv);

  OPS_rank = theMachineBroker->getPID();
  OPS_np = theMachineBroker->getNP();

  //
  // depending on rank we do something
  //
  if (OPS_rank != 0) {

    //
    // on slave processes we spin waiting to create & run actors
    //
    fprintf(stderr, "Slave Process Running %d\n", OPS_rank);
    theMachineBroker->runActors();

  } else {

    //
    // on process 0 we create some ShadowSubdomains & then start the OpenSees interpreter
    //
    fprintf(stderr, "Master Process Running OpenSees Interpreter %d\n", OPS_rank);   

    //
    // set some global parameters
    //
    OPS_OBJECT_BROKER = &theBroker;
    //    OPS_MACHINE = &theMachine;
    OPS_MACHINE = theMachineBroker;
    OPS_PARALLEL_PROCESSING = OPS_np;

	/* only use p0 if even number of partitions
    if (OPS_np%2 == 0) {
      OPS_NUM_SUBDOMAINS = OPS_np;
      OPS_USING_MAIN_DOMAIN = true;
      OPS_MAIN_DOMAIN_PARTITION_ID = 1;
    } else
      OPS_NUM_SUBDOMAINS = OPS_np - 1;
	  */
	// always use p0 even if ODD number of partitions
	  OPS_NUM_SUBDOMAINS = OPS_np;
      OPS_USING_MAIN_DOMAIN = true;
      OPS_MAIN_DOMAIN_PARTITION_ID = 1;

    OPS_PARTITIONED    = false;
    
    //
    // the rest straightr out of regular tclMain to start our interpreter
    //

    /*
     * The following #if block allows you to change the AppInit
     * function by using a #define of TCL_LOCAL_APPINIT instead
     * of rewriting this entire file.  The #if checks for that
     * #define and uses Tcl_AppInit if it doesn't exist.
     */

#ifndef TCL_LOCAL_APPINIT
#define TCL_LOCAL_APPINIT Tcl_AppInit    
#endif
    
    /* fmk - comment out the following block to get to compile 
       extern "C" int TCL_LOCAL_APPINIT _ANSI_ARGS_((Tcl_Interp *interp));
       fmk - end commented block */

    /*
     * The following #if block allows you to change how Tcl finds the startup
     * script, prime the library or encoding paths, fiddle with the argv,
     * etc., without needing to rewrite Tcl_Main()
     */
    
#ifdef TCL_LOCAL_MAIN_HOOK
    extern int TCL_LOCAL_MAIN_HOOK _ANSI_ARGS_((int *argc, char ***argv));
#endif
    
#ifdef TCL_XT_TEST
    XtToolkitInitialize();
#endif
    
#ifdef TCL_LOCAL_MAIN_HOOK
    TCL_LOCAL_MAIN_HOOK(&argc, &argv);
#endif

    g3TclMain(argc, argv, TCL_LOCAL_APPINIT, 1, 0);

    // some clean up to shut the remotes down if still running
    theDomain.clearAll();
    
    // shutdown the remote machines
    theMachineBroker->shutdown();
  }
  
  //
  // mpi clean up
  //

  fprintf(stderr, "Process Terminating %d\n", OPS_rank);

  if (theMachineBroker != 0)
    delete theMachineBroker;
  
  return 0;
}
예제 #2
0
int
main(int argc, char **argv)
{
  FEM_ObjectBrokerAllClasses theBroker;
  MPI_MachineBroker theMachine(&theBroker, argc, argv);
  theMachineBroker = &theMachine;
  OPS_MACHINE = &theMachine;

  rank = theMachine.getPID();
  np = theMachine.getNP();

  if (rank == 0) {
    OPS_theChannels = new Channel *[np-1];
    theChannels = OPS_theChannels;
    numChannels = np-1;
  } else {
    OPS_theChannels = new Channel *[1];
    theChannels = OPS_theChannels;
    numChannels = 1;
  }

  //
  // if rank 0 we send all args
  //

  int numArg = 0;
  int sizeArg = 0;
  char **args = 0;
  char *dataArgs = 0;

  if (rank == 0) {

    for (int i=0; i<argc; i++)
      if (argv[i] == NULL) {
	i = argc+1;
      } else {
	numArg ++;
	sizeArg += strlen(argv[i])+1;
      }

    static ID data(2);
    data(0) = numArg;
    data(1) = sizeArg;

    dataArgs = new char[sizeArg];
    int loc = 0;
    for (int i=0; i<numArg; i++) {
      int lengthArg = strlen(argv[i]);
      strncpy(&dataArgs[loc], argv[i],lengthArg+1);
      loc+=lengthArg+1;
    }

    Message msgChar(dataArgs, sizeArg);

    for (int j=0; j<np-1; j++) {
      Channel *otherChannel = theMachine.getRemoteProcess();
      OPS_theChannels[j] = otherChannel;
      otherChannel->sendID(0,0,data);
      otherChannel->sendMsg(0,0,msgChar);
    }
      
  } else {

    static ID data(2);    

    Channel *myChannel = theMachine.getMyChannel();
    OPS_theChannels[0] = myChannel;
    myChannel->recvID(0,0,data);
    numArg = data(0);
    sizeArg = data(1);
    dataArgs = new char[sizeArg];
    Message msgChar(dataArgs, sizeArg);
    
    myChannel->recvMsg(0,0,msgChar);
  }

  args = new char *[numArg];
  args[0] = dataArgs;
  int argCount = 1;
  for (int j=1; j<sizeArg-1; j++)
    if (dataArgs[j] == '\0') {
      args[argCount] = &dataArgs[j+1];
      argCount++;
    }

  OpenSeesParseArgv(argc, argv);  

#ifndef TCL_LOCAL_APPINIT
#define TCL_LOCAL_APPINIT Tcl_AppInit    
#endif

#ifdef TCL_LOCAL_MAIN_HOOK
  extern int TCL_LOCAL_MAIN_HOOK _ANSI_ARGS_((int *argc, char ***argv));
#endif
    
#ifdef TCL_XT_TEST
  XtToolkitInitialize();
#endif
    
#ifdef TCL_LOCAL_MAIN_HOOK
  TCL_LOCAL_MAIN_HOOK(&argc, &argv);
#endif

  g3TclMain(numArg, args, TCL_LOCAL_APPINIT, rank, np);

  // some clean up to shut the remotes down if still running
  //  theDomain.clearAll();
  
  // shutdown the remote machines
  //  theMachine.shutdown();

  //
  // mpi clean up
  //

  fprintf(stderr, "Process Terminating %d\n", rank);
  
  return 0;
}