===================== Large Jobs ===================== PolyADCIRC runs batches of simulations of size ``num_of_parallel_runs``. PolyADCIRC relies on `GNU Parallel `_ to handle simultaneously running a batch of serial jobs in parallel. PolyADCIRC relies on :program:`ibrun`, a `TACC `_ specific batch MPI launch command to handle simulataneously running a batch of parallel jobs in parallel. Based on user inputs PolyADCIRC writes the appropriate Bash scripts which are run using the :meth:`subprocess.POpen` command. Once the batch size (``num_of_parallel_runs``) gets too large the user may encounter :: tail: write error: Broken pipe We are currently working to eliminate this problem. The current work around is to reduce your batch size and break your job up into multiple jobs. These jobs may then be submitted to the queue and either run independently or sequentially. When doing so make sure that the run scripts specify a different ``save_dir``, ``save_file``, and ``script_name`` for each job. After your jobs complete the data may be concatenated into a single file. This file will have the same structure as if a single job was run. You might also want to create a ``crontab`` to periodically clear our your ``.sge`` directory. concatenation_2 ~~~~~~~~~~~~~~~ This file demonstrates concatenating data from two separate jobs. Import necessary modules:: import polyadcirc.run_framework.domain as dom import polyadcirc.run_framework.random_wall as rmw Specifiy directories for the jobs that were run:: base_dir = '/h1/lgraham/workspace' grid_dir = base_dir + '/ADCIRC_landuse/Inlet/inputs/poly_walls' save_dir1 = base_dir + '/ADCIRC_landuse/Inlet/runs/poly_wall1' save_dir2 = base_dir + '/ADCIRC_landuse/Inlet/runs/poly_wall2' basis_dir = base_dir + '/ADCIRC_landuse/Inlet/landuse_basis/gap/beach_walls_2lands' Specify the save file:: save_file = 'py_save_file' Load the data from both runs:: main_run, domain, mann_pts, wall_pts, points = rmw.loadmat(save_file, base_dir, grid_dir, save_dir1, basis_dir) other_run, domain, mann_pts2, wall_pts2, points2 = rmw.loadmat(save_file, base_dir, grid_dir, save_dir2, basis_dir) Concatenate the data from both runs and save to a :class:`~polyadcirc.run_framework.random_wall.runSet` object:: cated = main_run.concatenate(other_run, points, points2) Store the concatenated version of ``points`` in a dictonary object:: mdat = dict() mdat['points'] = cated[1] Concatenate and store ``mann_pts`` and ``wall_pts`` in the dictionary:: mdat['mann_pts'] = np.concatenate((mann_pts1, mann_pts2), axis = points1.ndim-1) mdat['wall_pts'] = np.concatenate((wall_pts1, wall_pts2), axis = points1.ndim-1) Save the data to a new save file in ``save_dir1`` as ``cat_file.mat``:: main_run.update_mdict(mdat) main_run.save(mdat, 'cat_file') concatenate_many ~~~~~~~~~~~~~~~~~~ This file demonstrates concatenating data from seven different jobs. Import necessary modules:: import polyadcirc.run_framework.domain as dom import polyadcirc.run_framework.random_wall as rmw Specify the directories for the jobs and the base string for the ``save_dir`` and ``save_file``. The name pattern for the ``save_dir`` and ``save_file`` is ``name+str(n)`` where ``n`` indicates this the the files and directory for the nth job:: base_dir = '/h1/lgraham/workspace' grid_dir = base_dir + '/ADCIRC_landuse/Inlet/inputs/poly_walls' save_dir = base_dir + '/ADCIRC_landuse/Inlet/runs/poly_wall' basis_dir = base_dir + '/ADCIRC_landuse/Inlet/landuse_basis/gap/beach_walls_2lands' save_file = 'py_save_file' Load the data from the first job:: main_run, domain, mann_pts, wall_pts, points = rmw.loadmat(save_file+'0', base_dir, grid_dir, save_dir+'_0', basis_dir) Load and concatenate the data for the remaning runs:: for i in xrange(1,7): save_file2 = save_file+str(i) # construct the save_file name save_dir2 = save_dir+'_'+str(i) # construct the save_dir name # load the data other_run, domain, mann_pts2, wall_pts2, points2 = rmw.loadmat(save_file2, base_dir, grid_dir, save_dir2,basis_dir) # concatenate the data run, points = main_run.concatenate(other_run, points, points2) Save the data to ``save_dir+'_0'`` :: mdat = dict() mdat['points'] = points main_run.update_mdict(mdat) main_run.save(mdat, 'poly7_file') Notice that in this example ``mann_pts`` and ``wall_pts`` are NOT saved. These two arrays have been stitched together into the ``points`` array using ``numpy.vstack((np.repeat(wall_points, s_p_wall,1), mann_pts))`` in :meth:`polyadcirc.run_framework.random_wall.runSet.run_points` into a single array.