Ejemplo n.º 1
0
    sidewallbc_text = """
  Velocity 1 = Variable Coordinate 1
    Real procedure "USF_Init.so" "UWa"
  Velocity 2 = Variable Coordinate 1
    Real procedure "USF_Init.so" "VWa" """

if temperature == 'model':
    temperature_text = """
  Viscosity = Variable Coordinate 1, Coordinate 2\r
    Real Procedure "USF_Init.so" "ModelViscosity""" ""
#  temperature_text="""
#  Constant Temperature = Variable Coordinate 1, Coordinate 2
#    Real Procedure "USF_Init.so" "ModelTemperature" """
else:
    try:
        A = flowparameterlib.arrhenius(273.15 + float(temperature))
        E = 3
        temperature_text = """
  Viscosity = Real $((""" + '2*' + str(E) + '*' + str(
            A[0]) + '*' + 'yearinsec)^(-1.0/3.0)*1.0e-6)'
    #  float(temperature)
    #  temperature_text="""
    #Constant Temperature = Real """+str(temperature)
    except:
        sys.exit("Unknown temperature of " + temperature)

if slidinglaw == 'linear':
    beta_data_file = 'inputs/beta_linear.xy'
    sliding_text = """
  Weertman Friction Coefficient = Variable Coordinate 1
    REAL Procedure "Sliding_Beta.so" "Linear_NearestNeighbor" """
Ejemplo n.º 2
0
def main():

    ##########
    # inputs #
    ##########

    args = get_arguments()

    RES = args.mesh
    partitions = str(args.n)
    regpar = str(args.regpar)
    method = args.method
    extrude = str(args.extrude)
    frontbc = str(args.frontbc)
    sidewallbc = str(args.sidewallbc)
    slipcoefficient = args.slipcoefficient
    glacier = args.glacier
    restartfile = args.restartfile
    restartposition = args.restartposition
    temperature = args.temperature
    itmax = args.itmax

    # Directories
    DIRS = os.path.join(os.getenv("CODE_HOME"),
                        "big3/modeling/solverfiles/3D/")
    DIRM = os.path.join(os.getenv("MODEL_HOME"), glacier + "/3D/" + RES + "/")
    DIRR = os.path.join(DIRM + 'mesh2d/inversion_' + method + '/')
    inputs = os.path.join(DIRM + "/inputs/")

    extent = np.loadtxt(inputs + "mesh_extent.dat")
    try:
        hole1 = np.loadtxt(inputs + "mesh_hole1.dat")
        hole2 = np.loadtxt(inputs + "mesh_hole2.dat")
        holes = [hole1, hole2]
    except:
        holes = []

    if not (os.path.exists(DIRR)):
        os.makedirs(DIRR)

    # Boundary numbers
    bbed = 4
    bsurf = 5
    runname = method + "_beta"

    # Grab boundary condition for front -- it will be different if we are using an actual
    # terminus position (neumann, pressure BC) or an outflow boundary (dirichlet, velocity BC)
    if method == 'adjoint':
        if (frontbc == 'neumann') or (frontbc == 'pressure'):
            frontbc_text = """
  Adjoint Force BC = Logical True
  Flow Force BC = Logical True
  External Pressure = Variable Coordinate 3 !we are in MPa units
  Real MATC "-1.0*waterpressure(tx)*1.0E-06" """
        elif (frontbc == 'dirichlet') or (frontbc == 'velocity'):
            frontbc_text = """
  Velocity 1 = Variable Coordinate 1
    Real procedure "USF_Init.so" "UIni"
  Velocity 2 = Variable Coordinate 1
    Real procedure "USF_Init.so" "VIni"
  ! Dirichlet BC => Dirichlet = 0 for Adjoint
  Adjoint 1 = Real 0.0
  Adjoint 2 = Real 0.0"""
        else:
            sys.exit("Unknown BC for front of glacier.")
    elif method == 'robin':
        if (frontbc == 'neumann') or (frontbc == 'pressure'):
            frontbc_text = """
  Flow Force BC = Logical True
  External Pressure = Variable Coordinate 3 !we are in MPa units
  Real MATC "-1.0*waterpressure(tx)*1.0E-06" """
        elif (frontbc == 'dirichlet') or (frontbc == 'velocity'):
            frontbc_text = """
  ! Dirichlet BCs
  Velocity 1 = Variable Coordinate 1, Coordinate 2
    Real procedure "USF_Init.so" "UIni"
  Velocity 2 = Variable Coordinate 1, Coordinate 2
    Real procedure "USF_Init.so" "VIni"
        
  ! Dirichlet BC => Same Dirichlet
  VeloD 1 = Variable Coordinate 1, Coordinate 2
    Real procedure "USF_Init.so" "UIni"
  VeloD 2 = Variable Coordinate 1, Coordinate 2
    Real procedure "USF_Init.so" "VIni" """

    # Set boundary condition for sidewalls (either measured velocity or slip coefficient).
    if method == 'adjoint':
        if sidewallbc == 'friction':
            sidewallbc_text = """
  Normal-Tangential Velocity = Logical True
  Normal-Tangential Adjoint = Logical True
  
  Adjoint Force BC = Logical True
  
  Velocity 1 = Real 0.0e0
  Adjoint 1 = Real 0.0e0
  
  Slip Coefficient 2 = Real """ + slipcoefficient + """
  Slip Coefficient 3 = Real """ + slipcoefficient
        elif sidewallbc == 'freeslip':
            sidewallbc_text = """
  Normal-Tangential Velocity = Logical True
  Normal-Tangential Adjoint = Logical True

  Adjoint Force BC = Logical True

  Velocity 1 = Real 0.0e0
  Adjoint 1 = Real 0.0e0"""
        elif sidewallbc == 'velocity':
            sidewallbc_text = """
  !! Dirichlet BC 
  Velocity 1 = Variable Coordinate 1
    Real procedure "USF_Init.so" "UWa"
  Velocity 2 = Variable Coordinate 1
    Real procedure "USF_Init.so" "VWa"
  
  ! Dirichlet BC => Dirichlet = 0 for Adjoint
  Adjoint 1 = Real 0.0
  Adjoint 2 = Real 0.0"""
        else:
            sys.exit("Unknown sidewall BC of " + sidewallbc)
    if method == 'robin':
        if sidewallbc == 'friction':
            sidewallbc_text = """
  Normal-Tangential Velocity = Logical True
  Normal-Tangential VeloD = Logical True

  Flow Force BC = Logical True

  Velocity 1 = Real 0.0
  VeloD 1 = Real 0.0e0
  Slip Coefficient 2 = Real """ + slipcoefficient + """
  Slip Coefficient 3 = Real """ + slipcoefficient
        elif sidewallbc == 'freeslip':
            sidewallbc_text = """
  Normal-Tangential Velocity = Logical True
  Normal-Tangential VeloD = Logical True

  Flow Force BC = Logical True

  Velocity 1 = Real 0.0
  VeloD 1 = Real 0.0e0"""
        elif sidewallbc == 'velocity':
            sidewallbc_text = """
  ! Dirichlet BCs
  Velocity 1 = Variable Coordinate 1
    Real procedure "USF_Init.so" "UWa"
  Velocity 2 = Variable Coordinate 1
    Real procedure "USF_Init.so" "VWa"

  ! Dirichlet BC => Same Dirichlet
  VeloD 1 = Variable Coordinate 1
    Real procedure "USF_Init.so" "UWa"
  VeloD 2 = Variable Coordinate 1
    Real procedure "USF_Init.so" "VWa" """
        else:
            sys.exit("Unknown sidewall BC of " + sidewallbc)

    if temperature == 'model':
        temperature_text = """
  Viscosity = Variable Coordinate 1, Coordinate 2
    Real Procedure "USF_Init.so" "ModelViscosity"
  Constant Temperature = Variable Coordinate 1, Coordinate 2
    Real Procedure "USF_Init.so" "ModelTemperature" """
    else:
        try:
            A = flowparameterlib.arrhenius(273.15 + float(temperature))
            E = 3
            temperature_text = """
  Viscosity = Real $((""" + '2*' + str(E) + '*' + str(
                A[0]) + '*' + 'yearinsec)^(-1.0/3.0)*1.0e-6)\r' + """
  Constant Temperature = Real """ + str(temperature)
        except:
            sys.exit("Unknown temperature of " + temperature)

    #############################
    # Run inversion solver file #
    #############################

    if not (os.path.exists(DIRR + "summary.dat")):
        fid_info = open(DIRR + "summary.dat", "w")
        fid_info.write('Lambda Nsim Cost Norm RelPrec_G \n')

    if restartfile != 'none':
        solverfile = restartfile
        date = restartfile[-12:-4]

        # Move previous timesteps to output directory
        DIRR_lambda = DIRR + "lambda_" + regpar + "_" + date + "/"
        names = os.listdir(DIRM + "/mesh2d")
        if not os.path.exists(DIRR_lambda):
            os.makedirs(DIRR_lambda)
        for name in names:
            if name.endswith('vtu') and name.startswith(method):
                os.rename(DIRM + "/mesh2d/" + name, DIRR_lambda + name)
        try:
            os.rename(
                DIRM + "M1QN3_" + method + "_beta.out",
                DIRR_lambda + "M1QN3_" + method + "_beta_beforerestart.out")
            os.rename(
                DIRM + "gradientnormadjoint_" + method + "_beta.dat",
                DIRR_lambda + "gradient_" + runname + "_beforerestart.dat")
            os.rename(DIRM + "cost_" + method + "_beta.dat",
                      DIRR_lambda + "cost_" + runname + "_beforerestart.dat")
        except:
            try:
                os.rename(
                    DIRR_lambda + "M1QN3_" + method + "_beta.out",
                    DIRR_lambda + "M1QN3_" + method +
                    "_beta_beforerestart.out")
                os.rename(
                    DIRR_lambda + "gradientnormadjoint_" + method +
                    "_beta.dat",
                    DIRR_lambda + "gradient_" + runname + "_beforerestart.dat")
                os.rename(
                    DIRR_lambda + "cost_" + method + "_beta.dat",
                    DIRR_lambda + "cost_" + runname + "_beforerestart.dat")
            except:
                pass

    else:
        # Get current date
        now = datetime.datetime.now()
        date = '{0}{1:02.0f}{2:02.0f}'.format((now.year), (now.month),
                                              (now.day))
        restartposition = 0

        solverfile = method + '_beta_' + regpar + '_' + date + '.sif'
        os.chdir(DIRM)
        fid1 = open(DIRS + method + '_beta_grounded.sif', 'r')
        fid2 = open(DIRM + solverfile, 'w')

        lines = fid1.read()
        lines = lines.replace('{Extrude}', '{0}'.format(extrude))
        lines = lines.replace('{Lambda}', '{0}'.format(regpar))
        lines = lines.replace('{FrontBC}', '{0}'.format(frontbc_text))
        lines = lines.replace('{SidewallBC}', '{0}'.format(sidewallbc_text))
        lines = lines.replace('{ItMax}', '{0}'.format(int(itmax)))
        lines = lines.replace('{Temperature}', '{0}'.format(temperature_text))
        fid2.write(lines + os.linesep)
        fid1.close()
        fid2.close()
        del fid1, fid2

    returncode = elmerrunlib.run_elmer(DIRM + solverfile, n=partitions)

    #####################################
    # Write cost values to summary file #
    #####################################

    fid = open(DIRM + "cost_" + method + "_beta.dat", "r")
    lines = fid.readlines()
    line = lines[-1]
    p = line.split()
    nsim = float(p[0])
    cost1 = float(p[1])
    cost2 = float(p[2])
    norm = float(p[3])
    fid.close()
    fid_info = open(DIRR + "summary.dat", "a")
    fid_info.write('{} {} {} {} {}\n'.format(regpar, nsim + restartposition,
                                             cost1, cost2, norm))
    fid_info.close()
    del fid

    #######################################
    # Move results to one directory #
    #######################################

    DIRR_lambda = DIRR + "lambda_" + regpar + "_" + date + "/"

    # Something wrong with saveline boundary, so moving to reading pvtu_files
    #bed = elmerreadlib.saveline_boundary(DIRM+"/mesh2d/",runname,bbed,['velocity 1','velocity 2','velocity 3','beta'])
    #surf = elmerreadlib.saveline_boundary(DIRM+"/mesh2d/",runname,bsurf,['vsurfini 1','vsurfini 2','velocity 1','velocity 2','velocity 3'])
    data = elmerreadlib.pvtu_file(
        DIRM + "/mesh2d/" + runname + "0001.pvtu",
        ['beta', 'velocity', 'vsurfini 1', 'vsurfini 2'])
    surf = elmerreadlib.values_in_layer(data, 'surf')
    bed = elmerreadlib.values_in_layer(data, 'bed')

    names = os.listdir(DIRM + "/mesh2d")
    if not os.path.exists(DIRR_lambda):
        os.makedirs(DIRR_lambda)
    for name in names:
        if name.endswith('pvtu') and name.startswith(method):
            os.rename(
                DIRM + "/mesh2d/" + name, DIRR_lambda + '{0}{1:04d}{2}'.format(
                    name[0:-9],
                    int(name[-9:-5]) + restartposition, '.pvtu'))
        elif name.endswith('vtu') and name.startswith(method):
            os.rename(
                DIRM + "/mesh2d/" + name, DIRR_lambda + '{0}{1:04d}{2}'.format(
                    name[0:-8],
                    int(name[-8:-4]) + restartposition, '.vtu'))
        elif name.startswith(method) and 'result' in name:
            os.rename(DIRM + "/mesh2d/" + name, DIRR_lambda + name)

    # Move saveline results
    files = os.listdir(DIRM + "/mesh2d/")
    for file in files:
        if file.startswith(runname) and ('.dat' in file):
            os.rename(DIRM + "/mesh2d/" + file, DIRR_lambda + file)

    # Move outputs for optimization
    os.rename(DIRM + "M1QN3_" + method + "_beta.out",
              DIRR_lambda + "M1QN3_" + method + "_beta.out")
    os.rename(DIRM + "gradientnormadjoint_" + method + "_beta.dat",
              DIRR_lambda + "gradient_" + runname + ".dat")
    os.rename(DIRM + "cost_" + method + "_beta.dat",
              DIRR_lambda + "cost_" + runname + ".dat")

    ################################
    # Output friction coefficients #
    ################################

    # Gridded linear beta square
    x, y, u = elmerreadlib.input_file(inputs + "udem.xy", dim=2)
    xx, yy = np.meshgrid(x, y)
    beta_linear = scipy.interpolate.griddata((bed['x'],bed['y']),\
      bed['beta']**2, (xx,yy), method='nearest')
    beta_linear_lin = scipy.interpolate.griddata((bed['x'],bed['y']),\
      bed['beta']**2, (xx,yy), method='linear')
    beta_weertman = scipy.interpolate.griddata((bed['x'],bed['y']),\
        (bed['beta']**2)/(bed['velocity']**(-2.0/3.0)), (xx,yy), method='nearest')
    beta_weertman_lin = scipy.interpolate.griddata((bed['x'],bed['y']),\
        (bed['beta']**2)/(bed['velocity']**(-2.0/3.0)), (xx,yy), method='linear')
    #if glacier == 'Helheim':
    #  # To get rid of edge effects near terminus, we take an average beta from farther upstream
    #  # and use that near the terminus
    #  ind_ave = np.where((xx > 302000) & (xx < 306000) & (yy < -2576000) & (yy > -2578000))
    #  ind = np.where((xx > 306000) & (yy < -2572000) & (yy > -2583000))
    #  beta_linear_lin[ind] = np.mean(beta_linear_lin[ind_ave])
    #  beta_weertman_lin[ind] = np.mean(beta_weertman_lin[ind_ave])
    ind = np.where(~(np.isnan(beta_linear_lin)))
    beta_linear[ind] = beta_linear_lin[ind]
    ind = np.where(~(np.isnan(beta_weertman_lin)))
    beta_weertman[ind] = beta_weertman_lin[ind]
    del beta_linear_lin, beta_weertman_lin

    # Output original results
    fidr = open(inputs + "beta_linear_" + regpar + "_FS_" + RES + ".dat", 'w')
    fidw = open(inputs + "beta_weertman_" + regpar + "_FS_" + RES + ".dat",
                'w')
    fidt = open(inputs + "taub_" + regpar + "_FS_" + RES + ".dat", 'w')
    fidr.write('{}\n'.format(len(bed['x'])))
    fidw.write('{}\n'.format(len(bed['x'])))
    fidt.write('{}\n'.format(len(bed['x'])))
    for i in range(0, len(bed['x'])):
        fidr.write('{0} {1} {2:.16f}\n'.format(bed['x'][i], bed['y'][i],
                                               bed['beta'][i]**2))
        fidw.write('{0} {1} {2:.16f}\n'.format(
            bed['x'][i], bed['y'][i],
            (bed['beta'][i]**2) / (bed['velocity'][i]**(-2.0 / 3.0))))
        fidt.write('{0} {1} {2:.16f}\n'.format(bed['x'][i], bed['y'][i],
                                               bed['taub'][i] * 1e3))
    fidr.close()
    fidw.close()
    fidt.close()
    del fidr, fidw, fidt

    # Output gridded results
    fidl = open(inputs + "beta_linear.xy", 'w')
    fidw = open(inputs + "beta_weertman.xy", 'w')
    fidl.write('{}\n{}\n'.format(len(x), len(y)))
    fidw.write('{}\n{}\n'.format(len(x), len(y)))
    for i in range(0, len(x)):
        for j in range(0, len(y)):
            fidl.write('{0} {1} {2:.6f}\n'.format(x[i], y[j], beta_linear[j,
                                                                          i]))
            fidw.write('{0} {1} {2:.6f}\n'.format(x[i], y[j],
                                                  beta_weertman[j, i]))
    fidl.close()
    fidw.close()
    del beta_linear, beta_weertman, u, x, y, fidl, fidw, xx, yy

    xgrid, ygrid, taubgrid = elmerreadlib.grid3d(bed, 'taub', holes, extent)
    xgrid, ygrid, vmodgrid = elmerreadlib.grid3d(surf, 'velocity', holes,
                                                 extent)
    xgrid, ygrid, vmesgrid1 = elmerreadlib.grid3d(surf, 'vsurfini 1', holes,
                                                  extent)
    xgrid, ygrid, vmesgrid2 = elmerreadlib.grid3d(surf, 'vsurfini 2', holes,
                                                  extent)

    plt.figure(figsize=(6.5, 3))
    plt.subplot(121)
    plt.imshow(taubgrid * 1e3, origin='lower', clim=[0, 500])
    plt.xticks([])
    plt.yticks([])
    cb = plt.colorbar(ticks=np.arange(0, 600, 100))
    cb.ax.tick_params(labelsize=10)
    cb.set_label('Basal shear stress (kPa)')

    plt.subplot(122)
    plt.imshow(vmodgrid - np.sqrt(vmesgrid1**2 + vmesgrid2**2),
               origin='lower',
               clim=[-200, 200],
               cmap='RdBu_r')
    plt.xticks([])
    plt.yticks([])
    cb = plt.colorbar(ticks=np.arange(-500, 600, 100))
    cb.ax.tick_params(labelsize=10)
    cb.set_label('Modeled-Measured (m/yr)')

    plt.tight_layout()

    plt.savefig(DIRR + 'lambda_' + regpar + '_' + date + '.pdf',
                format='PDF',
                dpi=400)
    plt.close()
Ejemplo n.º 3
0
                (ydata[1] - flowline[0, 2])**2)
ddata = ddata - ddata[200] * (dist1 / (dist1 + dist2)) + flowline[0, 0]

# Write out depths for flowline so that we can use those depths for interpolation
pts = np.zeros([len(flowline[:, 0]) * layers * 2, 3])
for i in range(0, len(flowline[:, 0])):
    pts[layers * 2 * i:layers * 2 * (i + 1), 0] = flowline[i, 0]
    pts[layers * 2 * i:layers * 2 * (i + 1), 1] = np.linspace(0, 1, layers * 2)
    pts[layers * 2 * i:layers * 2 * (i + 1),
        2] = np.linspace(flowline[i, 3], flowline[i, 4], layers * 2)

T = interpolate.griddata(np.column_stack([ddata, ndata]),
                         tempdata[:, 3],
                         pts[:, 0:2],
                         method='linear')
A = flowparameterlib.arrhenius(T)

# Write out flow law parameter at each node
nanind = np.where(np.isnan(A))
A = np.delete(A, nanind, axis=0)
pts = np.delete(pts, nanind, axis=0)
fid = open(DIRM + "Inputs/flowparameters.dat", "w")
fid.write('{}\n'.format(len(A)))
for i in range(0, len(A)):
    fid.write('{0} {1} {2} {3}\n'.format(pts[i, 0], pts[i, 2], T[i] - 273.15,
                                         A[i]))
fid.close()
del dist1, dist2, xdata, ydata, surf, bed, height, ndata, T, A

#####################################
# Print out bedrock for elmersolver #
Ejemplo n.º 4
0
def main():

    ##########
    # inputs #
    ##########

    args = get_arguments()

    RES = args.mesh
    partitions = str(args.n)
    regpar = str(args.regpar)
    frontbc = str(args.frontbc)
    glacier = args.glacier
    restartfile = args.restartfile
    restartposition = args.restartposition
    temperature = args.temperature
    itmax = args.itmax

    # Directories
    DIRS = os.path.join(os.getenv("CODE_HOME"),
                        "big3/modeling/solverfiles/ssa/")
    DIRM = os.path.join(os.getenv("MODEL_HOME"), glacier + "/3D/" + RES + "/")
    DIRR = os.path.join(DIRM + 'mesh2d/inversion_adjoint/')
    inputs = os.path.join(DIRM + "/inputs/")

    extent = np.loadtxt(inputs + "mesh_extent.dat")
    try:
        hole1 = np.loadtxt(inputs + "mesh_hole1.dat")
        hole2 = np.loadtxt(inputs + "mesh_hole2.dat")
        holes = [hole1, hole2]
    except:
        holes = []

    if not (os.path.exists(DIRR)):
        os.makedirs(DIRR)

    # Boundary numbers
    bbed = 4
    bsurf = 5
    runname = "adjoint_beta_ssa"

    if temperature == 'model':
        temperature_text = """
  mu = Variable Coordinate 1, Coordinate 2\r
    Real Procedure "USF_Init.so" "SSAViscosity""" ""
    else:
        try:
            print float(temperature)
            A = flowparameterlib.arrhenius(273.15 + float(temperature))
            E = 3
            temperature_text = """
  mu = Real $((""" + '2*' + str(E) + '*' + str(
                A[0]) + '*' + 'yearinsec)^(-1.0/3.0)*1.0e-6)'
        except:
            sys.exit("Unknown temperature of " + temperature)

    if frontbc == 'velocity' or frontbc == 'dirichlet':
        frontbc_text = """
  SSAVelocity 1= Equals vsurfini 1\r
  SSAVelocity 2= Equals vsurfini 2\r
  Adjoint 1 = Real 0.0\r
  Adjoint 2 = Real 0.0"""
    elif frontbc == 'pressure' or frontbc == 'neumann':
        frontbc_text = """
  Calving Front = Logical True"""

    ################################################
    # Compile fortran libraries for adjoint solver #
    ################################################

    # Check that fortran files are compiled
    DIRELMERLIB = os.path.join(os.getenv("CODE_HOME"),
                               "big3/modeling/elmerlib/")
    readfiles = os.listdir(DIRELMERLIB + "AdjointSSA/")
    outputfile = DIRELMERLIB + "AdjointSSASolvers.so"

    allstring = ''
    for f in readfiles:
        if f.endswith('.F90'):
            allstring = allstring + f + ' '

    os.chdir(DIRELMERLIB + "AdjointSSA/")
    call(["elmerf90", "-o", outputfile, allstring])
    del DIRELMERLIB

    #############################
    # Run inversion solver file #
    #############################

    if not (os.path.exists(DIRR + "summary.dat")):
        fid_info = open(DIRR + "summary.dat", "w")
        fid_info.write('Lambda Nsim Cost Norm RelPrec_G \n')

    if restartfile != 'none':
        solverfile = restartfile
        date = restartfile[-12:-4]

        # Move previous timesteps to output directory
        DIRR_lambda = DIRR + "lambda_" + regpar + "_" + date + "/"
        names = os.listdir(DIRM + "/mesh2d")
        if not os.path.exists(DIRR_lambda):
            os.makedirs(DIRR_lambda)
        for name in names:
            if name.endswith('vtu') and name.startswith('adjoint'):
                os.rename(DIRM + "/mesh2d/" + name, DIRR_lambda + name)
    else:
        # Get current date
        now = datetime.datetime.now()
        date = '{0}{1:02.0f}{2:02.0f}'.format((now.year), (now.month),
                                              (now.day))
        restartposition = 0

        solverfile = 'adjoint_beta_' + regpar + '_' + date + '.sif'
        os.chdir(DIRM)
        fid1 = open(DIRS + 'adjoint_beta_ssa.sif', 'r')
        fid2 = open(DIRM + solverfile, 'w')

        lines = fid1.read()
        lines = lines.replace('{Lambda}', '{0}'.format(regpar))
        lines = lines.replace('{ItMax}', '{0}'.format(int(itmax)))
        lines = lines.replace('{Temperature}', '{0}'.format(temperature_text))
        lines = lines.replace('{FrontBC}', '{0}'.format(frontbc_text))
        fid2.write(lines)
        fid1.close()
        fid2.close()
        del fid1, fid2

    returncode = elmerrunlib.run_elmer(DIRM + solverfile, n=partitions)

    #####################################
    # Write cost values to summary file #
    #####################################

    fidcost = open(DIRM + "cost.dat", "r")
    lines = fidcost.readlines()
    line = lines[-1]
    p = line.split()
    nsim = float(p[0])
    costsur = float(p[1])
    fidcost.close()

    fidcostreg = open(DIRM + "costreg.dat")
    lines = fidcostreg.readlines()
    line = lines[-1]
    p = line.split()
    nsim = float(p[0])
    costbed = float(p[1])  #/float(regpar)
    fidcostreg.close()

    costtot = costsur + float(regpar) * costbed

    fid_info = open(DIRR + "summary.dat", "a")
    fid_info.write('{} {} {} {} {}\n'.format(regpar, nsim + restartposition,
                                             costtot, costsur, costbed))
    fid_info.close()
    del fidcost, fidcostreg

    #######################################
    # Combine elmer results into one file #
    #######################################

    DIRR_lambda = DIRR + "lambda_" + regpar + "_" + date + "/"

    names = os.listdir(DIRM + "/mesh2d")
    if not os.path.exists(DIRR_lambda):
        os.makedirs(DIRR_lambda)
    for name in names:
        if name.endswith('pvtu') and name.startswith('adjoint'):
            os.rename(
                DIRM + "/mesh2d/" + name, DIRR_lambda + '{0}{1:04d}{2}'.format(
                    name[0:-9],
                    int(name[-9:-5]) + restartposition, '.pvtu'))
        elif name.endswith('vtu') and name.startswith('adjoint'):
            os.rename(
                DIRM + "/mesh2d/" + name, DIRR_lambda + '{0}{1:04d}{2}'.format(
                    name[0:-8],
                    int(name[-8:-4]) + restartposition, '.vtu'))
        elif name.startswith('adjoint') and 'result' in name:
            os.rename(DIRM + "/mesh2d/" + name, DIRR_lambda + name)

    bed = elmerreadlib.pvtu_file(DIRR_lambda + 'adjoint_beta_ssa0001.pvtu',
                                 ['ssavelocity', 'beta', 'vsurfini'])

    # Move outputs for optimization
    os.rename(DIRM + "M1QN3_adjoint_beta_ssa.out",
              DIRR_lambda + "M1QN3_adjoint_beta_ssa.out")
    os.rename(DIRM + "cost.dat", DIRR_lambda + "cost.dat")
    os.rename(DIRM + "costreg.dat", DIRR_lambda + "costreg.dat")
    os.rename(DIRM + "gradientnormadjoint_adjoint_beta_ssa.dat",
              DIRR_lambda + "gradientnormadjoint_adjoint_beta_ssa.dat")

    ################################
    # Output friction coefficients #
    ################################

    # Gridded linear beta square
    x, y, u = elmerreadlib.input_file(inputs + "udem.xy", dim=2)
    xx, yy = np.meshgrid(x, y)
    beta_linear = scipy.interpolate.griddata((bed['x'],bed['y']),bed['beta']**2,(xx,yy),\
        method='nearest')
    beta_linear_lin = scipy.interpolate.griddata((bed['x'],bed['y']),bed['beta']**2,(xx,yy),\
        method='linear')
    beta_weertman_lin = scipy.interpolate.griddata((bed['x'],bed['y']),\
        (bed['beta']**2)/(bed['ssavelocity']**(-2.0/3.0)), (xx,yy), method='linear')
    beta_weertman = scipy.interpolate.griddata((bed['x'],bed['y']),\
        (bed['beta']**2)*(bed['ssavelocity']**(-2.0/3.0)),(xx,yy),method='nearest')
    ind = np.where(~(np.isnan(beta_linear_lin)))
    beta_linear[ind] = beta_linear_lin[ind]
    ind = np.where(~(np.isnan(beta_weertman_lin)))
    beta_weertman[ind] = beta_weertman_lin[ind]
    del beta_linear_lin, beta_weertman_lin

    # Output original results
    fidr = open(inputs + "beta_linear_" + regpar + "_SSA_" + RES + ".dat", 'w')
    fidw = open(inputs + "beta_weertman_" + regpar + "_SSA_" + RES + ".dat",
                'w')
    fidt = open(inputs + "taub_" + regpar + "_SSA_" + RES + ".dat", 'w')
    fidr.write('{}\n'.format(len(bed['x'])))
    fidw.write('{}\n'.format(len(bed['x'])))
    fidt.write('{}\n'.format(len(bed['x'])))
    for i in range(0, len(bed['x'])):
        fidr.write('{0} {1} {2:.16f}\n'.format(bed['x'][i], bed['y'][i],
                                               bed['beta'][i]**2))
        fidw.write('{0} {1} {2:.16f}\n'.format(bed['x'][i],bed['y'][i],\
                (bed['beta'][i]**2)/(bed['ssavelocity'][i]**(-2.0/3.0))))
        fidt.write('{0} {1} {2:.16f}\n'.format(bed['x'][i], bed['y'][i],
                                               bed['taub'][i] * 1e3))
    fidr.close()
    fidw.close()
    fidt.close()
    del fidr, fidw, fidt

    fidl = open(inputs + "beta_linear.xy", 'w')
    fidw = open(inputs + "beta_weertman.xy", 'w')
    fidl.write('{}\n{}\n'.format(len(x), len(y)))
    fidw.write('{}\n{}\n'.format(len(x), len(y)))
    for i in range(0, len(x)):
        for j in range(0, len(y)):
            fidl.write('{0} {1} {2}\n'.format(x[i], y[j], beta_linear[j, i]))
            fidw.write('{0} {1} {2}\n'.format(x[i], y[j], beta_weertman[j, i]))
    fidl.close()
    fidw.close()
    del beta_linear, beta_weertman, u, x, y, fidl, fidw, xx, yy

    xgrid, ygrid, taubgrid = elmerreadlib.grid3d(bed, 'taub', holes, extent)
    xgrid, ygrid, vmodgrid = elmerreadlib.grid3d(bed, 'ssavelocity', holes,
                                                 extent)
    xgrid, ygrid, vmesgrid = elmerreadlib.grid3d(bed, 'vsurfini', holes,
                                                 extent)

    plt.figure(figsize=(6.5, 3))
    plt.subplot(121)
    plt.imshow(taubgrid * 1e3, origin='lower', clim=[0, 500])
    plt.xticks([])
    plt.yticks([])
    cb = plt.colorbar(ticks=np.arange(0, 600, 100))
    cb.ax.tick_params(labelsize=10)
    cb.set_label('Basal shear stress (kPa)')

    plt.subplot(122)
    plt.imshow(vmodgrid - vmesgrid,
               origin='lower',
               clim=[-200, 200],
               cmap='RdBu_r')
    plt.xticks([])
    plt.yticks([])
    cb = plt.colorbar(ticks=np.arange(-500, 600, 100))
    cb.ax.tick_params(labelsize=10)
    cb.set_label('Modeled-Measured (m/yr)')

    plt.tight_layout()

    plt.savefig(DIRR + 'lambda_' + regpar + '_' + date + '.pdf',
                format='PDF',
                dpi=400)
    plt.close()
Ejemplo n.º 5
0
#################################################################
# Calculate basal sliding speed using SIA for inflow boundaries #
#################################################################

print "Calculating basal sliding speed for inflow and ice divide boundaries and guessing a beta...\n"
if (temperature == 'model') and (ssa == True):
    xflowA, yflowA, flowA = elmerreadlib.input_file(dir + "ssa_flowA.xy")
    if (len(xflowA) != len(xT)) or (len(yflowA) != len(yT)):
        f = RegularGridInterpolator((yflowA, xflowA),
                                    flowA,
                                    bounds_error=False)
        flowA = np.reshape(f((yTgrid.flatten(), xTgrid.flatten())),
                           [len(yT), len(xT)])
        # If there are any nans
        ind = np.where(np.isnan(flowA))
        flowA[ind] = flowparameterlib.arrhenius(263.15)
    del dir
    ub_all, vb_all, beta_all = inverselib.guess_beta(xT,
                                                     yT,
                                                     zsT,
                                                     zbT,
                                                     uT,
                                                     vT,
                                                     frac=0.5,
                                                     A=flowA * yearinsec *
                                                     1e18)
elif (temperature == 'model') and (ssa != True):
    # Try to use depth-averaged modeled temperatures for guessing
    ub_all, vb_all, beta_all = inverselib.guess_beta(xT,
                                                     yT,
                                                     zsT,