コード例 #1
0
ファイル: run_WIM2d.py プロジェクト: nansencenter/WIM2d
def do_run(in_fields=None,params_in={}):

    if in_fields is not None:
        RUN_OPT  = 1
    else:
        RUN_OPT  = 0
        if len(params_in)>0:
            warnings.warn('params_in input being ignored - no input arrays')

    run_dict = {0: 'old version (no in/out)',
                1: 'in/out'}

    print("###################################################")
    print("Run option:")
    print(" "+str(RUN_OPT)+' : '+run_dict[RUN_OPT])
    print("###################################################")

    # check directories for outputs exist
    if (RUN_OPT == 0):
        outdir = 'out_py'
    else:
        outdir = 'out_py_io_1'

    dirs = [outdir,
            outdir+'/diagnostics',
            outdir+'/diagnostics/local',
            outdir+'/diagnostics/global',
            outdir+'/binaries',
            outdir+'/binaries/prog']

    # tell fortran where to save the outputs
    ifd_name = 'infile_dirs.txt'
    fid      = open(ifd_name,'w')
    fid.write('grid\n')
    fid.write(outdir+'\n')
    fid.close()

    for dirj in dirs:
        if not os.path.exists(dirj):
            os.makedirs(dirj)

    # clear out old progress files
    dd    = os.path.abspath(outdir+"/binaries/prog")
    files = os.listdir(dd)
    for f in files:
        os.remove(dd+"/"+f)

    if RUN_OPT == 0:
        # run the non-IO WIM 
        # (can still specify parameters in infile_nonIO.txt)
        print(" ")
        print("Running WIM without input/output")
        print("###################################################")
        print(" ")

        Fwim.py_wim2d_run()
        os.remove(ifd_name)

        print(" ")
        print("###################################################")
        print("Finished call to wim2d_run:")
        print("###################################################")
        print(" ")

        # load results from binary files
        return Fdat.wim_results(outdir)
        # out_fields  = Fdat.fn_check_out_bin(outdir+'/binaries')

    else:
        # run wim2d with inputs and outputs

        param_dict = default_params()

        for key in params_in:
            if key not in param_dict:
                raise ValueError('Parameter '+key+' invalid')
            else:
                param_dict[key] = params_in[key]

        param_vec = param_dict2vec(param_dict)
        if 0:
            print(params_in)
            print(param_dict)
            print(param_vec)
            sys.exit()


        if in_fields is not None:
            # 'in_fields' is given as input
            # - put data into 'in_arrays':
            keys  = ['icec','iceh','dfloe','Hs','Tp','mwd']

            nx,ny     = in_fields[keys[0]].shape
            in_arrays = np.zeros((nx,ny,6))

            n  = 0
            for key in keys:
                in_arrays[:,:,n] = in_fields[key]
                n                = n+1

            del in_fields

        elif 0:
            # 'in_fields' not given as input
            # - read in inputs from saved files:
            in_dir                 = 'out_py/binaries'
            grid_prams             = Fdat.fn_check_grid(in_dir)
            ice_fields,wave_fields = Fdat.fn_check_init(in_dir)

            # merge ice and wave fields:
            ice_fields.update(wave_fields)
            in_fields = ice_fields
            del wave_fields

            # put data into 'in_arrays':
            keys  = ['icec','iceh','dfloe','Hs','Tp','mwd']

            nx,ny     = in_fields[keys[0]].shape
            in_arrays = np.zeros((nx,ny,6))

            n  = 0
            for key in keys:
                in_arrays[:,:,n] = in_fields[key]
                n                = n+1

            del in_fields,ice_fields

        elif 1:
            # 'in_fields' not given as input
            # - specify 'in_arrays' manually

            in_dir     = 'out/binaries'
            grid_prams = Fdat.fn_check_grid(in_dir)

            n        = grid_prams['nx']
            ny       = grid_prams['ny']
            X        = grid_prams['X']
            Y        = grid_prams['Y']
            LANDMASK = grid_prams['LANDMASK']
            xmin     = X.min()
            xmax     = X.max()

            # set ice conc/thickness
            ICE_MASK = np.zeros((nx,ny))
            ICE_MASK[np.logical_and(X>0.7*xmin,LANDMASK<1)] = 1 # i>=24
            icec  = 0.75*ICE_MASK
            iceh  = 2.0*ICE_MASK
            dfloe = 250*ICE_MASK

            # set wave fields
            WAVE_MASK = np.zeros((nx,ny))
            WAVE_MASK[X<xmin*0.8] = 1 # i<=15
            Hs  = 2.0*WAVE_MASK
            Tp  = 12.0*WAVE_MASK
            mwd = -90.0*WAVE_MASK

            in_arrays[:,:,0] = icec
            in_arrays[:,:,1] = iceh
            in_arrays[:,:,2] = dfloe
            in_arrays[:,:,3] = Hs
            in_arrays[:,:,4] = Tp
            in_arrays[:,:,5] = mwd

        # run the WIM
        print(" ")
        print("###################################################")
        print("Running WIM with input/output")
        print("###################################################")
        print(" ")

        out_arrays  = Fwim.py_wim2d_run_io(in_arrays,param_vec)
        os.remove(ifd_name)

        print(" ")
        print("###################################################")
        print("Finished call to wim2d_run_io:")
        print("###################################################")
        print(" ")

        # Dmax  = out_arrays[:,:,0]
        # Hs    = out_arrays[:,:,1]
        # Tp    = out_arrays[:,:,2]
        # tau_x = out_arrays[:,:,3]
        # tau_y = out_arrays[:,:,4]
        # mwd   = out_arrays[:,:,4]

        # convert out_arrays to dictionary
        out_fields = Fdat.fn_check_out_arr(out_arrays)
        del out_arrays

    return out_fields,Fdat.wim_results(outdir)