Ejemplo n.º 1
0
int main(int argc, char **argv)
{
    int i,nx = 50, ny = 50,nz = 50, batch = 0, echo = 0;
    char *env = NULL;
    simulation_data sim;

#ifdef PARALLEL
    /* Initialize MPI */
    MPI_Init(&argc, &argv);
#endif

    /* Check for command line arguments. */
    for(i = 1; i < argc; ++i)
    {
        if((i+1) < argc)
        {
            if(strcmp(argv[i], "-nx") == 0)
            {
                sscanf(argv[i+1], "%d", &nx);
                i++;
            }
            else if(strcmp(argv[i], "-ny") == 0)
            {
                sscanf(argv[i+1], "%d", &ny);
                i++;
            }
            else if(strcmp(argv[i], "-nz") == 0)
            {
                sscanf(argv[i+1], "%d", &nz);
                i++;
            }
            else if(strcmp(argv[i], "-dir") == 0)
            {
                /* Specify the path to VisIt installation. */
                VisItSetDirectory(argv[i+1]);
                i++;
            }
        }
        else if(strcmp(argv[i], "-batch") == 0)
        {
            batch = 1;
        }
        else if(strcmp(argv[i], "-echo") == 0)
        {
            echo = 1;
        }
    }

    /* Initialize environment variables. */
    SimulationArguments(argc, argv);

    simulation_data_ctor(&sim, nx, ny, nz);
    sim.echo = echo;

#ifdef PARALLEL
    /* Create a new communicator. */
    if (MPI_Comm_dup(MPI_COMM_WORLD, &sim.par_comm) != MPI_SUCCESS)
        sim.par_comm = MPI_COMM_WORLD;
    MPI_Comm_rank (sim.par_comm, &sim.par_rank);
    MPI_Comm_size (sim.par_comm, &sim.par_size);

    /* Install callback functions for global communication. */
    VisItSetBroadcastIntFunction2(SimBroadcastInt, (void*)&sim);
    VisItSetBroadcastStringFunction2(SimBroadcastString, (void*)&sim);

    /* Tell libsim whether the simulation is parallel. */
    VisItSetParallel(sim.par_size > 1);
    VisItSetParallelRank(sim.par_rank);

    /* Tell libsim which communicator to use. You must pass the address of
     * an MPI_Comm object.
     */
    VisItSetMPICommunicator((void *)&sim.par_comm);
#endif

    /* Only read the environment on rank 0. This could happen before MPI_Init if
     * we are using an MPI that does not like to let us spawn processes but we
     * would not know our processor rank.
     */
    if(sim.par_rank == 0)
        env = VisItGetEnvironment();

    /* Pass the environment to all other processors collectively. */
    VisItSetupEnvironment2(env);
    if(env != NULL)
        free(env);

    /* Call the main loop. */
    if(batch)
        mainloop_batch(&sim);
    else
    {
        if(sim.par_rank == 0)
        {
            /* Write out .sim file that VisIt uses to connect. */
            VisItInitializeSocketAndDumpSimFile(
#ifdef PARALLEL
            "zerocopy_par",
#else
            "zerocopy",
#endif
            "Demonstrates VariableData setArrayData functions for zero copy",
            "/path/to/where/sim/was/started",
            NULL, NULL, SimulationFilename());
        }

        mainloop_interactive(&sim);
    }

    if(VisItIsConnected())
        VisItDisconnect();

    simulation_data_dtor(&sim);
#ifdef PARALLEL
    MPI_Finalize();
#endif

    return 0;
}
Ejemplo n.º 2
0
int main(int argc, char **argv)
{
    char *env = NULL;
    int i = 0;
    simulation_data sim;
    simulation_data_ctor(&sim);

#ifdef PARALLEL
    /* Initialize MPI */
    MPI_Init(&argc, &argv);

    /* Create a new communicator. */
    if (MPI_Comm_dup(MPI_COMM_WORLD, &sim.par_comm) != MPI_SUCCESS)
        sim.par_comm = MPI_COMM_WORLD;

    MPI_Comm_rank (sim.par_comm, &sim.par_rank);
    MPI_Comm_size (sim.par_comm, &sim.par_size);
#endif

    /* Initialize environment variables. */
    SimulationArguments(argc, argv);

#ifdef PARALLEL
    /* Install callback functions for global communication. */
    VisItSetBroadcastIntFunction2(visit_broadcast_int_callback, (void*)&sim);
    VisItSetBroadcastStringFunction2(visit_broadcast_string_callback, (void*)&sim);

    /* Tell libsim whether the simulation is parallel. */
    VisItSetParallel(sim.par_size > 1);
    VisItSetParallelRank(sim.par_rank);

    /* Tell libsim which communicator to use. You must pass the address of
     * an MPI_Comm object.
     */
    VisItSetMPICommunicator((void *)&sim.par_comm);
#endif

    /* Only read the environment on rank 0. This could happen before MPI_Init if
     * we are using an MPI that does not like to let us spawn processes but we
     * would not know our processor rank.
     */
    if(sim.par_rank == 0)
        env = VisItGetEnvironment();

    /* Pass the environment to all other processors collectively. */
    VisItSetupEnvironment2(env);
    if(env != NULL)
        free(env);

    for(i = 1; i < argc; ++i)
    {
        if(strcmp(argv[i], "-echo") == 0)
            sim.echo = 1;
    }

    /* Write out .sim file that VisIt uses to connect. Only do it
     * on processor 0.
     */
    /* CHANGE 3 */
    if(sim.par_rank == 0)
    {
        /* Write out .sim file that VisIt uses to connect. */
        VisItInitializeSocketAndDumpSimFile(
#ifdef PARALLEL
            "ucdcurve_par",
#else
            "ucdcurve",
#endif
            "Demonstrates 1D unstructured mesh",
            "/path/to/where/sim/was/started",
            NULL, NULL, SimulationFilename());
    }

    /* Read input problem setup, geometry, data.*/
    read_input_deck();

    /* Call the main loop. */
    mainloop(&sim);

    simulation_data_dtor(&sim);
#ifdef PARALLEL
    MPI_Finalize();
#endif

    return 0;
}
Ejemplo n.º 3
0
int main(int argc, char **argv)
{
  char *env = NULL;
  simulation_data sim;
  simulation_data_ctor(&sim);
  sim.runMode = SIM_STOPPED;
  int r, c, ndims=2, dims[2]={8,8}, periods[2]={0,0};
  int xdivs=2, ydivs=2, zdivs=1;
  double before, after, *mem;
  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &sim.par_rank);
  MPI_Comm_size(MPI_COMM_WORLD, &sim.par_size);
  if(!sim.par_rank)
    get_procmem(&before);

#ifdef VISIT_INSITU
    SimulationArguments(argc, argv);
#endif
#define OPTS 1
#ifdef OPTS
  if(!sim.par_rank)
    {
    while(1)
      {
       static struct option long_options[] =
             {
               {"xdivs",  required_argument, 0, 'x'},
               {"ydivs",  required_argument, 0, 'y'},
               {"blocksize",  required_argument, 0, 'b'},
               {"timesteps",  required_argument, 0, 't'},
               {"file",    required_argument, 0, 'f'},
               {0, 0, 0, 0}
             };
           /* getopt_long stores the option index here. */
           int option_index = 0;
     
           c = getopt_long (argc, argv, "x:y:b:t:f:",
                            long_options, &option_index);
     
           /* Detect the end of the options. */
           if (c == -1)
             break;
     
           switch (c)
             {
             case 0:
               /* If this option set a flag, do nothing else now. */
               if (long_options[option_index].flag != 0)
                 break;
               printf ("option %s", long_options[option_index].name);
               if (optarg)
                 printf (" with arg %s", optarg);
               printf ("\n");
               break;
     
             case 'x':
               //printf ("option -x with value `%s'\n", optarg);
               dims[0] = atoi(optarg);
               break;
     
             case 'y':
               //printf ("option -y with value `%s'\n", optarg);
               dims[1] = atoi(optarg);
               break;

             case 'b':
               //printf ("option -b with value `%s'\n", optarg);
               BlockSize = atoi(optarg);
               break;

             case 't':
               //printf ("option -t with value `%s'\n", optarg);
               NUMBER_OF_ITERATIONS = atoi(optarg);
               break;
     
             case 'f':
               //printf ("option -f with value `%s'\n", optarg);
               strcpy(sim.filename, optarg);
               break;
     
             case '?':
               /* getopt_long already printed an error message. */
               break;
     
             default:
               abort ();
             }
         }
    }
#endif
  MPI_Bcast(dims, 2, MPI_INT, 0, MPI_COMM_WORLD);
  MPI_Bcast(&BlockSize, 1, MPI_INT, 0, MPI_COMM_WORLD);
  MPI_Bcast(&NUMBER_OF_ITERATIONS, 1, MPI_INT, 0, MPI_COMM_WORLD);
  // broadcast name, even if it was not set
  MPI_Bcast(sim.filename, 256, MPI_CHAR, 0, MPI_COMM_WORLD);

  if(sim.par_size != dims[0]*dims[1])
    {
    if(sim.par_rank == 0)
      fprintf(stderr,"The cartesian topology requested (%d nodes) does not allow to map all tasks. Resubmit\n", sim.par_size);
    MPI_Finalize();
    exit(1);
    }

  MPI_Cart_create(MPI_COMM_WORLD, ndims, dims, periods, 1, &sim.comm_cart);
  MPI_Cart_coords(sim.comm_cart, sim.par_rank, 2, sim.coords);
  //sim.comm_cart = MPI_COMM_WORLD;
  sim.cart_dims[0] = dims[0];
  sim.cart_dims[1] = dims[1];

 /* Adjust the partitioning */
  sim.grid.Ncolumns = BlockSize; //LONGITUDE_SIZE; /* assume they divide evenly */
  sim.global_dims[0] = BlockSize * dims[0];

  sim.grid.Nrows = BlockSize; //LATITUDE_SIZE; /* assume they divide evenly */
  sim.global_dims[1] = BlockSize * dims[1];

  sim.global_dims[2] = BlockSize; //LEVELS_SIZE;
  sim.grid.Nlevels = BlockSize;

  //fprintf(stderr,"p=[%d], coords[%dx%d], array[%d*%d*%d] global[%d*%d*%d]\n", sim.par_rank, sim.coords[0], sim.coords[1], sim.grid.Ncolumns, sim.grid.Nrows, sim.grid.Nlevels, sim.global_dims[0], sim.global_dims[1], sim.global_dims[2]);

#ifdef VISIT_INSITU
    FILE *fp;
    if(sim.par_rank == 0){
        env = VisItGetEnvironment();
    //fp = fopen("/scratch/rosa/jfavre/foo.txt", "w");
    //fprintf(fp, "%s\n", env);
    }
      

    /* Pass the environment to all other processors collectively. */
    VisItSetupEnvironment2(env);
    if(env != NULL)
        free(env);

    /* Install callback functions for global communication. */
    VisItSetBroadcastIntFunction2(visit_broadcast_int_callback, (void*)&sim);
    VisItSetBroadcastStringFunction2(visit_broadcast_string_callback, (void*)&sim);
    /* Tell whether the simulation is parallel. */
    VisItSetParallel(sim.par_size > 1);
    VisItSetParallelRank(sim.par_rank);
    if(sim.par_rank == 0)
      {
      //fprintf(fp, "\n--reached before callbacks\n", env);
      //fclose(fp);
      }


    if(sim.par_rank == 0)
    {
        VisItInitializeSocketAndDumpSimFile("Cosmo",
            "Code YYY coupled with VisIt's libsim",
            "/path/to/where/sim/was/started",
            NULL, NULL, "/users/jfavre/.visit/simulations/rosa.sim2");
    }
#endif

  grid_data_allocate(&sim);

  mpi_elapsed = MPI_Wtime();
  mainloop(&sim);
  mpi_elapsed = MPI_Wtime() - mpi_elapsed;

  grid_data_dtor(&sim.grid);

  if(!sim.par_rank){
    get_procmem(&after);
    fprintf(stderr, "Testing get_procmem... %f %f %f\n",
          before, after, after-before);
    }

  MPI_Barrier(sim.comm_cart);
 
  if(sim.par_rank == 0)
    {
    printf("written grids of %d,%d,%d\n",  BlockSize, BlockSize, BlockSize);
    printf("written %d iterations\n", NUMBER_OF_ITERATIONS);
    printf("MPI Elapsed time: %f sec\n", mpi_elapsed);
    printf("average  %f Gbytes/sec\n", (BlockSize*BlockSize*BlockSize*4.0*sim.par_size*NUMBER_OF_ITERATIONS) / (1024*1024*1024*mpi_elapsed));
    }

  MPI_Finalize();

  return 0;
}