def main(args, logger: Logger = get_basic_logger()): params = utils.load_sim_params(os.path.join(args.rel_dir, "sim_params.yaml")) sim_dir = params.sim_dir mgmt_db_loc = params.mgmt_db_location submit_yes = True if args.auto else confirm("Also submit the job for you?") # get the srf(rup) name without extensions srf_name = os.path.splitext(os.path.basename(params.srf_file))[0] # if srf(variation) is provided as args, only create the slurm # with same name provided if args.srf is not None and srf_name != args.srf: return write_directory = args.write_directory if args.write_directory else sim_dir # get lf_sim_dir lf_sim_dir = os.path.join(sim_dir, "LF") header_dict = { "platform_specific_args": get_platform_node_requirements( platform_config[const.PLATFORM_CONFIG.MERGE_TS_DEFAULT_NCORES.name] ), "wallclock_limit": default_run_time_merge_ts, "job_name": "merge_ts.{}".format(srf_name), "job_description": "post emod3d: merge_ts", "additional_lines": "###SBATCH -C avx", } command_template_parameters = { "run_command": platform_config[const.PLATFORM_CONFIG.RUN_COMMAND.name], "merge_ts_path": binary_version.get_unversioned_bin( "merge_tsP3_par", get_machine_config(args.machine)["tools_dir"] ), } body_template_params = ( "{}.sl.template".format(merge_ts_name_prefix), {"lf_sim_dir": lf_sim_dir}, ) script_prefix = "{}_{}".format(merge_ts_name_prefix, srf_name) script_file_path = write_sl_script( write_directory, sim_dir, const.ProcessType.merge_ts, script_prefix, header_dict, body_template_params, command_template_parameters, ) if submit_yes: submit_script_to_scheduler( script_file_path, const.ProcessType.merge_ts.value, sim_struct.get_mgmt_db_queue(mgmt_db_loc), sim_dir, srf_name, target_machine=args.machine, logger=logger, )
def gp2ll_multi(coords, mlat, mlon, rot, nx, ny, hh): """ Converts gridpoint positions to longitude, latitude. coords: 2d list in format [[x0, y0], [x1, y1], ...] """ # derived parameters xlen = nx * hh ylen = ny * hh # where the x plane points xazim = (rot + 90) % 360 # convert gridpoint to offset km max_x = (nx - 1) * hh max_y = (ny - 1) * hh for c in coords: # length from corner c[0] *= hh c[1] *= hh # length from centre origin c[0] -= max_x * 0.5 c[1] -= max_y * 0.5 # run binary, get output p_conv = Popen( [ get_unversioned_bin("xy2ll"), "mlat=%s" % (mlat), "mlon=%s" % (mlon), "geoproj=1", "center_origin=1", "h=%s" % (hh), "xazim=%s" % (xazim), "xlen=%s" % (xlen), "ylen=%s" % (ylen), ], stdin=PIPE, stdout=PIPE, ) stdout = p_conv.communicate("\n".join(["%s %s" % tuple(c) for c in coords ]).encode())[0].decode() # lon, lat return [ list(map(float, line.split())) for line in stdout.rstrip().split("\n") ]
def srf2llv(srf, seg=-1, value="slip", lonlatdep=True, depth=False): """ Get longitude, latitude, depth (optional) and value of 'type' srf: filepath of SRF file seg: which segmentsto read (-1 for all) type: which parameter to read depth: whether to also include depth at point """ proc = Popen( [ get_unversioned_bin("srf2xyz"), "calc_xy=0", "lonlatdep=%d" % (lonlatdep), "dump_slip=0", "infile=%s" % (srf), "type=%s" % (value), "nseg=%d" % (seg), ], stdout=PIPE, ) out, err = proc.communicate() code = proc.wait() # process output llv = np.fromstring(out, dtype="f4", sep=" ") # create a slice filter if depth not wanted # longitude, latitude, depth, value if not depth: mask = np.array([True, True, False, True]) else: mask = np.array([True, True, True, True]) if lonlatdep: # output from srf2xyz is 4 columns wide return np.reshape(llv, (len(llv) // 4, 4))[:, mask] return np.reshape(llv, (len(llv) // 3, 3))
def ll2gp_multi( coords, mlon, mlat, rot, nx, ny, hh, dx=1, dy=1, decimated=False, verbose=False, keep_outside=False, ): """ Converts longitude/latitude positions to gridpoints. Three main modes of operation: 1: No dx, dy (= 1): gridpoint 2: dx or dy != 1: closest gridpoint considering dx/dy 3: decimated: gridpoint number if only decimated points existed coords: 2d list in format [[lon0, lat0], [lon1, lat1], ...] keep_outside: False will remove values outside the sim domain, True will replace those entries with None """ # derived parameters xlen = nx * hh ylen = ny * hh # where the x plane points xazim = (rot + 90) % 360 # run binary, get output # output is displacement (x, y) from center, in kilometres cmd = [ get_unversioned_bin("ll2xy"), "mlat=%s" % (mlat), "mlon=%s" % (mlon), "geoproj=1", "center_origin=1", "h=%s" % (hh), "xazim=%s" % (xazim), "xlen=%s" % (xlen), "ylen=%s" % (ylen), ] if verbose: print(" ".join(cmd)) # Has to be a byte string p_conv = Popen(cmd, stdin=PIPE, stdout=PIPE) stdout = p_conv.communicate("\n".join(["%s %s" % tuple(c) for c in coords ]).encode())[0].decode() xy = [ list(map(float, line.split())) for line in stdout.rstrip().split("\n") ] # convert displacement to grid points # has to be 'nx - 1', because the first gridpoint is offset 0km # nx = 1400 means the greatest offset is 1399 * hh km mid_x = (nx - 1) * hh * 0.5 mid_y = (ny - 1) * hh * 0.5 for i, c in enumerate(xy[::-1]): # make the distance relative to top corner # convert back to grid spacing # gridpoints are discrete c[0] = int(round((c[0] + mid_x) / hh)) c[1] = int(round((c[1] + mid_y) / hh)) # x values range from 0 -> nx - 1 if not (0 <= c[0] < nx and 0 <= c[1] < ny): if keep_outside: xy[-(i + 1)] = None else: # this is why xy is looped in reverse xy.remove(c) continue if decimated: c[0] //= dx c[1] //= dy else: # closest gridpoint considering decimation c[0] -= c[0] % dx c[1] -= c[1] % dy return xy