hole2 = np.loadtxt(maindir + dir + "/inputs/mesh_hole2.dat") holes = [hole1, hole2] except: holes = [] surf_misfit = np.zeros(surf.shape, dtype=np.dtype(surf.dtype.descr + [('misfit', np.float64)])) for name in surf.dtype.descr: surf_misfit[name[0]] = surf[name[0]] surf_misfit['misfit'] = (surf[vname] - surf['vsurfini']) / surf['vsurfini'] * 100 x, y, grid = elmerreadlib.grid3d(surf_misfit, 'misfit', holes, extent, dx=50) grid[ind_cutoff_grid] = np.float('NaN') grid[np.isnan(vsurfini_cutoff)] = np.float('NaN') plt.subplot(gs[n]) im=plt.imshow(grid,extent=[x[0],x[-1],y[0],y[-1]],origin='lower',\ vmin=vmin,vmax=vmax,cmap=cmap) plt.plot(np.r_[extent[:, 0], extent[0, 0]], np.r_[extent[:, 1], extent[0, 1]], 'k') if len(holes) > 0: for hole in holes: plt.plot(np.r_[hole[:, 0], hole[0, 0]], np.r_[hole[:, 1], hole[0, 1]], 'k') plt.contour(x_cutoff,
"/inputs/mesh_hole1.dat") hole2 = np.loadtxt(DIRR + "/" + dir + "/inputs/mesh_hole2.dat") holes = [hole1, hole2] except: holes = [] dirvtu = DIRR + "/" + dir + "/mesh2d/inversion_adjoint/" + dir_inv if ('ModelT' in DIRM) and not (SSA): vtufile = elmerreadlib.pvtu_file( dirvtu + "/adjoint_beta0001.pvtu", ['constant temperature']) depth_temp = elmerreadlib.depth_averaged_variables(vtufile) x, y, temp = elmerreadlib.grid3d(depth_temp, 'constant temperature', holes, extent) geotifflib.write_from_grid( x, y, np.flipud(temp), float('nan'), DIRO + "/" + dir[0:11] + "_depthT.tif") if n == 0: files = os.listdir(dirvtu) for file in files: if file.startswith('adjoint_beta') and file.endswith( 'vtu'): copy2(dirvtu + '/' + file, DIRO) if SSA: vtu = elmerreadlib.pvtu_file(
fs_mt = elmerreadlib.pvtu_file(file_fs_mt,[velocityname,'vsurfini']) fs_ct = elmerreadlib.pvtu_file(file_fs_ct,[velocityname,'vsurfini']) ssa_mt = elmerreadlib.pvtu_file(file_ssa_mt,[velocityname,'vsurfini']) ssa_ct = elmerreadlib.pvtu_file(file_ssa_ct,[velocityname,'vsurfini']) # Get values at the surface surf_fs_mt = elmerreadlib.values_in_layer(fs_mt,'surface') surf_fs_ct = elmerreadlib.values_in_layer(fs_ct,'surface') surf_ssa_mt = elmerreadlib.values_in_layer(ssa_mt,'surface') surf_ssa_ct = elmerreadlib.values_in_layer(ssa_ct,'surface') # Get taub for this model ax = plt.subplot(gs[i,0]) adjoint = elmerreadlib.pvtu_file(adjointfiles[i],[velocityname,'beta']) bed = elmerreadlib.values_in_layer(adjoint,'bed') x,y,taub = elmerreadlib.grid3d(bed,'taub',holes,extent) im1 = plt.imshow(taub*1e3,extent=[x[0],x[-1],y[0],y[-1]],origin='lower',vmin=0,vmax=400) plt.ylabel(r'$\bf{('+str(i+1)+') }$ '+modnames[i],fontname='Arial',fontsize=10) if glacier == 'Kanger': bot = 0.76 label_bot = 0.11 if glacier == 'Helheim': bot = 0.82 label_bot = 0.08 xmin,xmax = plt.xlim() ymin,ymax = plt.ylim() if i == 0: path = matplotlib.path.Path([[0.67*(xmax-xmin)+xmin,0.98*(ymax-ymin)+ymin], [0.97*(xmax-xmin)+xmin,0.98*(ymax-ymin)+ymin], [0.97*(xmax-xmin)+xmin,bot*(ymax-ymin)+ymin], [0.67*(xmax-xmin)+xmin,bot*(ymax-ymin)+ymin],
# Mesh boundaries extent = np.loadtxt(DIRM + "inputs/mesh_extent.dat") try: hole1 = np.loadtxt(DIRM + "inputs/mesh_hole1.dat") hole2 = np.loadtxt(DIRM + "inputs/mesh_hole2.dat") holes = [hole1, hole2] except: holes = [] # Load data for first regularization parameter bed_3D = elmerreadlib.saveline_boundary(DIRR + DIRREGPAR, method + "_beta.dat", bbed, ['velocity', 'beta']) surf_3D = elmerreadlib.saveline_boundary(DIRR + DIRREGPAR, method + "_beta.dat", bsur, ['velocity', 'vsurfini']) taub_3D = elmerreadlib.grid3d(bed_3D, 'taub', holes, extent) vel_3D = elmerreadlib.grid3d(surf_3D, 'velocity', holes, extent) velmes_3D = elmerreadlib.grid3d(surf_3D, 'vsurfini', holes, extent) if glacier == 'Kanger': xmin = 468000. xmax = 500800. ymin = -2300000. ymax = -2260200. elif glacier == 'Helheim': xmin = 280200. xmax = 313000. ymin = -2585100. ymax = -2545300. # Get satellite image for background; we want the satellite image captured on the closest date
def get_velocity_cutoff(glacier, velocity_cutoff=1000, temperature='model', model_dir='', SSA=True, sign='over'): ''' x_grid,y_grid,vsurfini_grid,ind_cutoff_grid,ind_cutoff = get_velocity_cutoff(glacier, velocity_cutoff=1000,temperature='model',model_dir='',SSA=True,sign='over') Find nodes and grid indices where the velocity remains above a particular cutoff value, since inversion results seem to be better for higher velocities. Inputs: glacier : glacier name velocity_cutoff : cutoff value for velocity (m/yr) temperature : model temperature model_dir : add directory if the model results are NOT located in $MODEL_HOME/glacier/3D/ SSA : if the model is SSA sign : find indices where values remain "over" or "under" the cutoff Outputs: x_grid : x values for vsurfini_grid y_grid : y values for vsurfini_grid vsurfini_grid : grid of minimum velocities through time ind_cutoff_grid : grid indices that are below the velocity cutoff ind_cutoff : node indices that remain above the velocity cutoff ''' import os, elmerreadlib import numpy as np import scipy.ndimage import matplotlib.pyplot as plt # Get model result directories maindir = os.path.join(os.getenv("MODEL_HOME"), glacier + "/3D/" + model_dir + '/') dirs = os.listdir(maindir) # Set up various parameters for pulling the correct model results if temperature == 'model': temperature_text = 'modelT' else: temperature_text = 'constantT' if SSA: model_text = '1e13_SSA' else: model_text = '1e12_FS' # Check to make sure we have an acceptable value for "sign". If not, exit code. if not (sign == 'under') and not (sign == 'over'): sys.exit("Unacceptable value for sign of " + sign) # Get indices where velocity is always greater than the cutoff value n = 0 for dir in dirs: if dir.startswith('DEM') and dir.endswith(temperature_text): beta_date = dir[3:11] beta_suffix = model_text + '_DEM' + beta_date + '_' + temperature_text + '_' data = elmerreadlib.pvtu_file(maindir+dir+'/mesh2d/steady_'+beta_suffix+'linear0001.pvtu',\ ['vsurfini']) surf = elmerreadlib.values_in_layer(data, 'surf') if n == 0: surf_min = np.zeros(surf.shape, dtype=np.dtype(surf.dtype.descr)) for name in surf.dtype.descr: surf_min[name[0]] = surf[name[0]] extent = np.loadtxt(maindir + dir + '/inputs/mesh_extent.dat') if glacier == 'Helheim': hole1 = np.loadtxt(maindir + dir + "/inputs/mesh_hole1.dat") hole2 = np.loadtxt(maindir + dir + "/inputs/mesh_hole2.dat") holes = [hole1, hole2] else: holes = [] # Save minimum velocity through time if sign == 'over': ind = np.where(surf_min['vsurfini'] >= surf['vsurfini'])[0] elif sign == 'under': ind = np.where(surf_min['vsurfini'] <= surf['vsurfini'])[0] if len(ind) > 0: surf_min['vsurfini'][ind] = surf['vsurfini'][ind] n = n + 1 # Grid and filter minimum velocity. Filtering removes some of the spurious single grid cells # that remain above the cutoff value. x_grid, y_grid, vsurfini_grid = elmerreadlib.grid3d(surf_min, 'vsurfini', extent=extent, holes=holes) vsurfini_grid_smooth = scipy.ndimage.filters.gaussian_filter(vsurfini_grid, sigma=2.5, truncate=4) # Find grid indices that are below the cutoff value if sign == 'over': ind_cutoff_grid = np.where((vsurfini_grid_smooth <= velocity_cutoff) | (np.isnan(vsurfini_grid_smooth))) elif sign == 'under': ind_cutoff_grid = np.where((vsurfini_grid_smooth >= velocity_cutoff) | (np.isnan(vsurfini_grid_smooth))) # Find nodes that remain above the cutoff value if sign == 'over': ind_cutoff = np.where(surf_min['vsurfini'] >= velocity_cutoff)[0] elif sign == 'under': ind_cutoff = np.where(surf_min['vsurfini'] <= velocity_cutoff)[0] return x_grid, y_grid, vsurfini_grid, ind_cutoff_grid, ind_cutoff
'/adjoint_beta_ssa0001.pvtu',['ssavelocity','beta','vsurfini']) else: data = elmerreadlib.pvtu_file(maindir+dir+'/mesh2d/inversion_adjoint/'+subdir+ '/adjoint_beta0001.pvtu',['velocity','beta','vsurfini']) bed = elmerreadlib.values_in_layer(data,'bed') if n == 0: # Mesh boundaries extent = np.loadtxt(maindir+dir+"/inputs/mesh_extent.dat") try: hole1 = np.loadtxt(maindir+dir+"/inputs/mesh_hole1.dat") hole2 = np.loadtxt(maindir+dir+"/inputs/mesh_hole2.dat") holes=[hole1,hole2] except: holes = [] x,y,grid = elmerreadlib.grid3d(bed,output,holes,extent,dx=50) plt.subplot(gs[n]) if output == 'taub': im=plt.imshow(grid*1e3,extent=[x[0],x[-1],y[0],y[-1]],origin='lower',\ vmin=vmin,vmax=vmax,cmap=cmap) else: im=plt.imshow(grid*1e3,extent=[x[0],x[-1],y[0],y[-1]],origin='lower',\ norm=matplotlib.colors.LogNorm(vmin=vmin,vmax=vmax),cmap=cmap) plt.axis('equal') xmin,xmax = plt.xlim() ymin,ymax = plt.ylim() plt.yticks([]) plt.xticks([]) if output == 'taub': if glacier == 'Kanger':
data = elmerreadlib.pvtu_file(DIRR+"/"+dir+"/mesh2d/steady"+modelname+beta_suffix+'0001.pvtu',[vname]) # Mesh boundaries extent = np.loadtxt(DIRR+"/"+dir+"/inputs/mesh_extent.dat") try: hole1 = np.loadtxt(DIRR+"/"+dir+"/inputs/mesh_hole1.dat") hole2 = np.loadtxt(DIRR+"/"+dir+"/inputs/mesh_hole2.dat") holes=[hole1,hole2] except: holes = [] bed = elmerreadlib.values_in_layer(data,'bed') surf = elmerreadlib.values_in_layer(data,'surf') # Get basal velocities x,y,bed_mod_ub = elmerreadlib.grid3d(bed,vname+' 1',holes,extent) x,y,bed_mod_vb = elmerreadlib.grid3d(bed,vname+' 2',holes,extent) x,y,bed_mod_mag = elmerreadlib.grid3d(bed,vname,holes,extent) # Get surface velocities x,y,surf_mod_us = elmerreadlib.grid3d(surf,vname+' 1',holes,extent) x,y,surf_mod_vs = elmerreadlib.grid3d(surf,vname+' 2',holes,extent) x,y,surf_mod_mag = elmerreadlib.grid3d(surf,vname,holes,extent) geotifflib.write_from_grid(x,y,np.flipud(bed_mod_ub),np.float('nan'),DIRO+"/"+dir[0:11]+"_"+beta_suffix+"_bed_mod_ub.tif") geotifflib.write_from_grid(x,y,np.flipud(bed_mod_vb),np.float('nan'),DIRO+"/"+dir[0:11]+"_"+beta_suffix+"_bed_mod_vb.tif") geotifflib.write_from_grid(x,y,np.flipud(bed_mod_mag),np.float('nan'),DIRO+"/"+dir[0:11]+"_"+beta_suffix+"_bed_mod_umag.tif") geotifflib.write_from_grid(x,y,np.flipud(surf_mod_us),float('nan'),DIRO+"/"+dir[0:11]+"_"+beta_suffix+"_surf_mod_us.tif") geotifflib.write_from_grid(x,y,np.flipud(surf_mod_vs),float('nan'),DIRO+"/"+dir[0:11]+"_"+beta_suffix+"_surf_mod_vs.tif") geotifflib.write_from_grid(x,y,np.flipud(surf_mod_mag),float('nan'),DIRO+"/"+dir[0:11]+"_"+beta_suffix+"_surf_mod_umag.tif")
inputs = DIRM+"inputs/" runname = "adjoint_beta" bsurf = 5 # Get glacier mesh 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=[] dx=500. surf = elmerreadlib.saveline_boundary(DIR,runname,bsurf,['stress','velocity','beta','eigenstress']) x,y,eigstress1 = elmerreadlib.grid3d(surf,'eigenstress 1',holes,extent,dx=dx) x,y,eigstress2 = elmerreadlib.grid3d(surf,'eigenstress 2',holes,extent,dx=dx) x,y,eigstress3 = elmerreadlib.grid3d(surf,'eigenstress 3',holes,extent,dx=dx) x,y,sigxx = elmerreadlib.grid3d(surf,'stress 1',holes,extent,dx=dx) x,y,sigyy = elmerreadlib.grid3d(surf,'stress 2',holes,extent,dx=dx) x,y,sigxy = elmerreadlib.grid3d(surf,'stress 4',holes,extent,dx=dx) x,y,taub = elmerreadlib.grid3d(surf,'taub',holes,extent,dx=dx) x,y,uu = elmerreadlib.grid3d(surf,'velocity 1',holes,extent,dx=dx) x,y,vv = elmerreadlib.grid3d(surf,'velocity 2',holes,extent,dx=dx) # Combine eigenstresses eigstress_all = np.zeros([len(y),len(x),3]) eigstress_all[:,:,0] = eigstress1 eigstress_all[:,:,1] = eigstress2 eigstress_all[:,:,2] = eigstress3
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()
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()
for name in surf.dtype.descr: surf_misfit[name[0]] = surf[name[0]] surf_misfit['misfit'] = (surf[vname] - surf['vsurfini']) / surf['vsurfini'] * 100 if i == 0: misfits_all = np.zeros([len(surf_misfit['misfit']), 3]) misfits_all[:, :] = np.float('NaN') misfits_all[:, i] = surf_misfit['misfit'] plt.subplot(gs[0, i]) plt.title(r'$\lambda$ = ' + regpars[i], fontsize=10, fontname='Arial', color='k') x, y, taub = elmerreadlib.grid3d(bed, 'taub', holes, extent) plt.imshow(image[:,:,0],extent=[ximage[0],ximage[-1],yimage[0],yimage[-1]],\ cmap='Greys_r',origin='lower',clim=[0,0.6]) im1 = plt.imshow(taub * 1e3, extent=[x[0], x[-1], y[0], y[-1]], origin='lower', vmin=0, vmax=400, cmap='viridis') xmin, xmax = plt.xlim() ymin, ymax = plt.ylim() plt.plot(np.r_[extent[:, 0], extent[0, 0]], np.r_[extent[:, 1], extent[0, 1]], 'k', lw=0.5) plt.xlim([xmin, xmax])