if topo is not None: F = interpolation.NearestNDInterpolator(np.c_[topo[:, 0], topo[:, 1]], topo[:, 2]) topo2D = F(mesh2d.vectorCCx, id_lbe) # Export topography file with file(inv_dir + dsep + 'topofile.dat', 'w') as fid: fid.write('%i %e\n' % (topo2D.shape[0], np.max(topo2D))) np.savetxt(fid, np.c_[mesh2d.vectorCCx, topo2D], fmt='%e', delimiter=' ', newline='\n') # Export data file DC.writeUBC_DCobs(inv_dir + dsep + obsfile2d, DC2D, '2D', 'SIMPLE') # Write input file fid = open(inv_dir + dsep + inp_file, 'w') fid.write('OBS LOC_X %s \n' % obsfile2d) fid.write('MESH FILE %s \n' % mshfile2d) fid.write('CHIFACT 1 \n') fid.write('TOPO FILE topofile.dat \n') fid.write('INIT_MOD VALUE %e\n' % ini_mod) fid.write('REF_MOD VALUE %e\n' % ref_mod) fid.write('ALPHA DEFAULT\n') fid.write('WEIGHT DEFAULT\n') fid.write('STORE_ALL_MODELS FALSE\n') fid.write('INVMODE SVD\n') fid.write('USE_MREF TRUE\n') fid.close()
def animate(ii): removeFrame() # Grab current line and indx = np.where(lineID == ii)[0] srcLeft = [] obs_l = [] srcRight = [] obs_r = [] obs = [] srcList = [] # Split the obs file into left and right for jj in range(len(indx)): # Grab corresponding data obs = np.hstack([obs, dobs2D.dobs[dataID == indx[jj]]]) #std = dobs2D.std[dataID==indx[jj]] srcList.append(dobs2D.srcList[indx[jj]]) Tx = dobs2D.srcList[indx[jj]].loc Rx = dobs2D.srcList[indx[jj]].rxList[0].locs # Create mid-point location Cmid = (Tx[0][0] + Tx[1][0]) / 2 Pmid = (Rx[0][:, 0] + Rx[1][:, 0]) / 2 ileft = Pmid < Cmid iright = Pmid >= Cmid temp = np.zeros(len(ileft)) temp[ileft] = 1 obs_l = np.hstack([obs_l, temp]) temp = np.zeros(len(iright)) temp[iright] = 1 obs_r = np.hstack([obs_r, temp]) if np.any(ileft): rx = DC.RxDipole(Rx[0][ileft, :], Rx[1][ileft, :]) srcLeft.append(DC.SrcDipole([rx], Tx[0], Tx[1])) #std_l = np.hstack([std_l,std[ileft]]) if np.any(iright): rx = DC.RxDipole(Rx[0][iright, :], Rx[1][iright, :]) srcRight.append(DC.SrcDipole([rx], Tx[0], Tx[1])) #obs_r = np.hstack([obs_r,iright]) #std_r = np.hstack([std_r,std[iright]]) DC2D_full = DC.SurveyDC(srcList) DC2D_full.dobs = np.asarray(obs) DC2D_full.std = DC2D_full.dobs * 0. DC2D_full.std[obs_l == 1] = np.abs(DC2D_full.dobs[obs_l == 1]) * 0.02 + 2e-5 DC2D_full.std[obs_r == 1] = np.abs(DC2D_full.dobs[obs_r == 1]) * 0.06 + 4e-5 DC2D_l = DC.SurveyDC(srcLeft) DC2D_l.dobs = np.asarray(obs[obs_l == 1]) DC2D_l.std = np.abs(np.asarray(DC2D_l.dobs)) * 0.05 + 2e-5 DC2D_r = DC.SurveyDC(srcRight) DC2D_r.dobs = np.asarray(obs[obs_r == 1]) DC2D_r.std = np.abs(np.asarray(DC2D_r.dobs)) * 0.05 + 2e-5 #DC.plot_pseudoSection(dobs2D,lineID, np.r_[0,1],'pdp') id_lbe = int(DCsurvey.srcList[indx[jj]].loc[0][1]) mesh3d = Mesh.TensorMesh([hx, 1, hz], x0=(-np.sum(padx) + np.min(srcMat[0][:, 0]), id_lbe, np.max(srcMat[0][0, 2]) - np.sum(hz))) Mesh.TensorMesh.writeUBC(mesh3d, home_dir + dsep + 'Mesh' + str(id_lbe) + '.msh') global ax1, ax2, ax3, ax5, ax6, fig ax2 = plt.subplot(3, 2, 2) ph = DC.plot_pseudoSection(DC2D_r, ax2, stype='pdp', colorbar=False) ax2.set_title('Observed P-DP', fontsize=10) plt.xlim([xmin, xmax]) plt.ylim([zmin, zmax]) plt.gca().set_aspect('equal', adjustable='box') ax2.set_xticklabels([]) ax2.set_yticklabels([]) ax1 = plt.subplot(3, 2, 1) DC.plot_pseudoSection(DC2D_l, ax1, stype='pdp', clim=(ph[0].get_clim()[0], ph[0].get_clim()[1]), colorbar=False) ax1.set_title('Observed DP-P', fontsize=10) plt.xlim([xmin, xmax]) plt.ylim([zmin, zmax]) plt.gca().set_aspect('equal', adjustable='box') ax1.set_xticklabels([]) z = np.linspace(np.min(ph[2]), np.max(ph[2]), 5) z_label = np.linspace(20, 1, 5) ax1.set_yticks(map(int, z)) ax1.set_yticklabels(map(str, map(int, z_label)), size=8) ax1.set_ylabel('n-spacing', fontsize=8) #%% Add labels bbox_props = dict(boxstyle="circle,pad=0.3", fc="r", ec="k", lw=1) ax2.text(0.00, 1, 'A', transform=ax2.transAxes, ha="left", va="center", size=6, bbox=bbox_props) bbox_props = dict(boxstyle="circle,pad=0.3", fc="y", ec="k", lw=1) ax2.text(0.1, 1, 'M', transform=ax2.transAxes, ha="left", va="center", size=6, bbox=bbox_props) bbox_props = dict(boxstyle="circle,pad=0.3", fc="g", ec="k", lw=1) ax2.text(0.2, 1, 'N', transform=ax2.transAxes, ha="left", va="center", size=6, bbox=bbox_props) bbox_props = dict(boxstyle="circle,pad=0.3", fc="g", ec="k", lw=1) ax1.text(0.00, 1, 'N', transform=ax1.transAxes, ha="left", va="center", size=6, bbox=bbox_props) bbox_props = dict(boxstyle="circle,pad=0.3", fc="y", ec="k", lw=1) ax1.text(0.1, 1, 'M', transform=ax1.transAxes, ha="left", va="center", size=6, bbox=bbox_props) bbox_props = dict(boxstyle="circle,pad=0.3", fc="r", ec="k", lw=1) ax1.text(0.2, 1, 'A', transform=ax1.transAxes, ha="left", va="center", size=6, bbox=bbox_props) # Run both left and right survey seperately survey = DC2D_full # Export data file DC.writeUBC_DCobs(inv_dir + dsep + obsfile2d, survey, '2D', 'SIMPLE') # Write input file fid = open(inv_dir + dsep + inp_file, 'w') fid.write('OBS LOC_X %s \n' % obsfile2d) fid.write('MESH FILE %s \n' % mshfile2d) fid.write('CHIFACT 1 \n') fid.write('TOPO DEFAULT \n') fid.write('INIT_MOD VALUE %e\n' % ini_mod) fid.write('REF_MOD VALUE %e\n' % ref_mod) fid.write('ALPHA VALUE %f %f %F\n' % (1. / dx**4., 1, 1)) fid.write('WEIGHT DEFAULT\n') fid.write('STORE_ALL_MODELS FALSE\n') fid.write('INVMODE SVD\n') #fid.write('CG_PARAM 200 1e-4\n') fid.write('USE_MREF FALSE\n') #fid.write('BOUNDS VALUE 1e-4 1e+2\n') fid.close() os.chdir(inv_dir) os.system('dcinv2d ' + inp_file) #%% Load model and predicted data minv = DC.readUBC_DC2DModel(inv_dir + dsep + 'dcinv2d.con') minv = np.reshape(minv, (mesh2d.nCy, mesh2d.nCx)) Mesh.TensorMesh.writeModelUBC( mesh3d, home_dir + dsep + 'Model' + str(id_lbe) + '.con', minv.T) dpre = DC.readUBC_DC2Dpre(inv_dir + dsep + 'dcinv2d.pre') DCpre = dpre['DCsurvey'] DCtemp = DC2D_l DCtemp.dobs = DCpre.dobs[obs_l == 1] ax5 = plt.subplot(3, 2, 3) DC.plot_pseudoSection(DCtemp, ax5, stype='pdp', clim=(ph[0].get_clim()[0], ph[0].get_clim()[1]), colorbar=False) ax5.set_title('Predicted', fontsize=10) plt.xlim([xmin, xmax]) plt.ylim([zmin, zmax]) plt.gca().set_aspect('equal', adjustable='box') ax5.set_xticklabels([]) z = np.linspace(np.min(ph[2]), np.max(ph[2]), 5) z_label = np.linspace(20, 1, 5) ax5.set_yticks(map(int, z)) ax5.set_yticklabels(map(str, map(int, z_label)), size=8) ax5.set_ylabel('n-spacing', fontsize=8) DCtemp = DC2D_r DCtemp.dobs = DCpre.dobs[obs_r == 1] ax6 = plt.subplot(3, 2, 4) DC.plot_pseudoSection(DCtemp, ax6, stype='pdp', clim=(ph[0].get_clim()[0], ph[0].get_clim()[1]), colorbar=False) ax6.set_title('Predicted', fontsize=10) plt.xlim([xmin, xmax]) plt.ylim([zmin, zmax]) plt.gca().set_aspect('equal', adjustable='box') ax6.set_xticklabels([]) ax6.set_yticklabels([]) pos = ax6.get_position() cbarax = fig.add_axes([ pos.x0 + 0.325, pos.y0 + 0.2, pos.width * 0.1, pos.height * 0.5 ]) ## the parameters are the specified position you set cb = fig.colorbar(ph[0], cax=cbarax, orientation="vertical", ax=ax6, ticks=np.linspace(ph[0].get_clim()[0], ph[0].get_clim()[1], 4), format="$10^{%.1f}$") cb.set_label("App. Cond. (S/m)", size=8) ax3 = plt.subplot(3, 1, 3) ax3.set_title('2-D Model (S/m)', fontsize=10) ax3.set_xticks(map(int, x)) ax3.set_xticklabels(map(str, map(int, x))) ax3.set_xlabel('Easting (m)', fontsize=8) ax3.set_yticks(map(int, z)) ax3.set_yticklabels(map(str, map(int, z)), rotation='vertical') ax3.set_ylabel('Depth (m)', fontsize=8) plt.xlim([xmin, xmax]) plt.ylim([zmin / 2, zmax]) plt.gca().set_aspect('equal', adjustable='box') ph2 = plt.pcolormesh(mesh2d.vectorNx, mesh2d.vectorNy, np.log10(minv), vmin=vmin, vmax=vmax) plt.gca().tick_params(axis='both', which='major', labelsize=8) plt.draw() for ss in range(survey.nSrc): Tx = survey.srcList[ss].loc[0] plt.scatter(Tx[0], mesh2d.vectorNy[-1] + 10, s=10) pos = ax3.get_position() ax3.set_position([pos.x0 + 0.025, pos.y0, pos.width, pos.height]) pos = ax3.get_position() cbarax = fig.add_axes([ pos.x0 + 0.65, pos.y0 + 0.01, pos.width * 0.05, pos.height * 0.75 ]) ## the parameters are the specified position you set cb = fig.colorbar(ph2, cax=cbarax, orientation="vertical", ax=ax4, ticks=np.linspace(vmin, vmax, 4), format="$10^{%.1f}$") cb.set_label("Conductivity (S/m)", size=8) pos = ax1.get_position() ax1.set_position([pos.x0 + 0.03, pos.y0, pos.width, pos.height]) pos = ax5.get_position() ax5.set_position([pos.x0 + 0.03, pos.y0, pos.width, pos.height]) pos = ax2.get_position() ax2.set_position([pos.x0 - 0.03, pos.y0, pos.width, pos.height]) pos = ax6.get_position() ax6.set_position([pos.x0 - 0.03, pos.y0, pos.width, pos.height]) #%% Add the extra bbox_props = dict(boxstyle="rarrow,pad=0.3", fc="w", ec="k", lw=2) ax2.text(0.01, (float(ii) + 1.) / (len(uniqueID) + 2), 'N: ' + str(id_lbe), transform=fig.transFigure, ha="left", va="center", size=8, bbox=bbox_props) mrk_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=2) ax2.text(0.01, 0.9, 'Line ID#', transform=fig.transFigure, ha="left", va="center", size=8, bbox=mrk_props) mrk_props = dict(boxstyle="square,pad=0.3", fc="b", ec="k", lw=2) for jj in range(len(uniqueID)): ax2.text(0.1, (float(jj) + 1.) / (len(uniqueID) + 2), ".", transform=fig.transFigure, ha="right", va="center", size=8, bbox=mrk_props) mrk_props = dict(boxstyle="square,pad=0.3", fc="r", ec="k", lw=2) ax2.text(0.1, (float(ii) + 1.) / (len(uniqueID) + 2), ".", transform=fig.transFigure, ha="right", va="center", size=8, bbox=mrk_props)
# Compute potential at each electrode dtemp = (P1 * phi - P2 * phi) * np.pi data.append(dtemp) unct.append(np.abs(dtemp) * pct + flr) print("--- %s seconds ---" % (time.time() - start_time)) survey.dobs = np.hstack(data) survey.std = np.hstack(unct) #%% Run 2D inversion if pdp or dpdp survey # Otherwise just plot and apparent susceptibility map #if not re.match(stype,'gradient'): #%% Write data file in UBC-DCIP3D format DC.writeUBC_DCobs(home_dir + '\FWR_data3D.dat', survey, '3D', 'SURFACE') #%% Load 3D data #[Tx, Rx, data, wd] = DC.readUBC_DC3Dobs(home_dir + '\FWR_data3D.dat') #%% Convert 3D obs to 2D and write to file survey2D = DC.convertObs_DC3D_to_2D(survey, np.ones(survey.nSrc), flag='Xloc') DC.writeUBC_DCobs(home_dir + '\FWR_3D_2_2D.dat', survey2D, '2D', 'SURFACE') #%% Create a 2D mesh along axis of Tx end points and keep z-discretization dx = np.min([np.min(mesh.hx), np.min(mesh.hy)]) nc = np.ceil(dl_len / dx) + 3
rmin = np.argmin( (gin[jj][0] - midx)**2. + (gin[jj][1] - midz)**2. ) keeper[indx[rmin]] = 0 #%% Reconstruct the 3D survey minus the discarted data srcList = [] for ii in range(DCsurvey.nSrc): Tx = DCsurvey.srcList[ii].loc indx = np.where(keeper[dataID==ii]==1)[0] rx = [] # Make sure that transmitter is not empty if len(indx)!=0: # Construct a list of receivers rx = DC.RxDipole(DCsurvey.srcList[ii].rxList[0].locs[0][indx,:], DCsurvey.srcList[ii].rxList[0].locs[1][indx,:]) srcList.append( DC.SrcDipole( [rx], Tx[0],Tx[1] ) ) DCsurvey_out = DC.SurveyDC(srcList) DCsurvey_out.dobs = DCsurvey.dobs[np.where(keeper==1)[0]] DCsurvey_out.std = DCsurvey.std[np.where(keeper==1)[0]] # Replace the uncertainties on the orginal survey #DCsurvey.uncert = uncert # Write new obsfile out DC.writeUBC_DCobs(home_dir+dsep+outfile,DCsurvey_out,'3D', surveyType='GENERAL', iptype=1)
for jj in range(len(indx)): # Grab corresponding data src_obs = dobs2D.dobs[dataID == indx[jj]] src_uncert = src_obs * 0. Tx = dobs2D.srcList[indx[jj]].loc Rx = dobs2D.srcList[indx[jj]].rxList[0].locs # Create mid-point location Cmid = (Tx[0][0] + Tx[1][0]) / 2 Pmid = (Rx[0][:, 0] + Rx[1][:, 0]) / 2 ileft = Pmid < Cmid iright = Pmid >= Cmid # src_uncert[iright] = np.abs(np.asarray(src_obs[iright]))*0.02 + 2e-5 # src_uncert[ileft] = np.abs(np.asarray(src_obs[ileft]))*0.06 + 4e-5 src_uncert[iright] = np.abs(np.asarray(src_obs[iright])) * 0.1 + 2e+0 src_uncert[ileft] = np.abs(np.asarray(src_obs[ileft])) * 0.1 + 2e+0 uncert = np.hstack([uncert, src_uncert]) # Replace the uncertainties on the orginal survey DCsurvey.std = uncert # Write new obsfile out DC.writeUBC_DCobs(home_dir + dsep + 'IP3D_Obs_Data_Uncert.dat', DCsurvey, stype='GENERAL', iptype=1)