def run_analysis(filename,mode,method): click.echo('Reading file : %s'%filename) data = IOfile.parsing_input_file(filename) click.echo('Creating class...') theclass = TFC(data) click.echo('Calculating transfer function using %s method'%method) if method=='tf_kramer286_sh': theclass.tf_kramer286_sh() elif method=='tf_knopoff_sh': theclass.tf_knopoff_sh() elif method=='tf_knopoff_sh_adv': theclass.tf_knopoff_sh_adv() plt.plot(theclass.freq,np.abs(theclass.tf[0]),label=method) plt.xlabel('frequency (Hz)') plt.ylabel('Amplification') plt.yscale('log') plt.xscale('log') plt.grid(True,which='both') plt.legend(loc='best',fancybox=True,framealpha=0.5) #plt.axis('tight') plt.autoscale(True,axis='x',tight=True) plt.tight_layout() plt.savefig('test.png', format='png') click.echo(click.style('Calculation has been finished!',fg='green'))
def sensitivityTools(fname,sensitivity='incidence angle',senslinspace=[0.,90.,91],method='tf_kramer286_sh',yscale='lin'): import IOfile import numpy as np import pylab as plt from TFCalculator import TFCalculator as TFC from TFDisplayTools import SpectroPlot # timing module import time data = IOfile.parsing_input_file(fname) data['sensitivity'] = True elapsed = [] x = np.array([]) y = np.array([]) z = np.array([]) if yscale == 'log': ianglist = np.logspace(np.log10(senslinspace[0]),np.log10(senslinspace[1]),senslinspace[2]) else: ianglist = np.linspace(senslinspace[0],senslinspace[1],senslinspace[2]) if sensitivity=='incidence angle': for i in range(len(ianglist)): data['iang'] = np.deg2rad(ianglist[i]) theclass = TFC(data) start = time.clock() tf = eval('theclass.'+method+'()') elapsed.append(time.clock()-start) x = np.concatenate((x,theclass.freq+theclass.freq[1])) z = np.concatenate((z,np.abs(tf[0]))) y = np.concatenate((y,np.zeros_like(theclass.freq)+ianglist[i])) ylabel = 'Incidence angle' #print np.min(theclass.freq),np.min(np.abs(tf[0])) data['iang']=ianglist elif sensitivity=='incidence angle phase': for i in range(len(ianglist)): data['iang'] = np.deg2rad(ianglist[i]) theclass = TFC(data) start = time.clock() tf = eval('theclass.'+method+'()') elapsed.append(time.clock()-start) x = np.concatenate((x,theclass.freq+theclass.freq[1])) z = np.concatenate((z,np.rad2deg(np.angle(tf[0])))) y = np.concatenate((y,np.zeros_like(theclass.freq)+ianglist[i])) ylabel = 'Incidence angle' data['iang']=ianglist elif sensitivity=='incidence angle vectorial': for i in range(len(ianglist)): data['iang'] = np.deg2rad(ianglist[i]) theclass = TFC(data) start = time.clock() tf = eval('theclass.'+method+'()') elapsed.append(time.clock()-start) x = np.concatenate((x,theclass.freq+theclass.freq[1])) z = np.concatenate((z,np.sqrt(np.abs(tf[0])**2+np.abs(tf[1])**2))) y = np.concatenate((y,np.zeros_like(theclass.freq)+ianglist[i])) ylabel = 'Incidence angle' data['iang']=ianglist elif sensitivity=='thickness': for i in range(len(ianglist)): data['hl'] = [ianglist[i],0.] theclass = TFC(data) start = time.clock() tf = eval('theclass.'+method+'()') elapsed.append(time.clock()-start) x = np.concatenate((x,theclass.freq+theclass.freq[1])) z = np.concatenate((z,np.abs(tf[0]))) y = np.concatenate((y,np.zeros_like(theclass.freq)+ianglist[i])) ylabel = 'Thickness (m)' data['hl'][0]=ianglist.tolist() elif sensitivity[:2]=='vp': tmp = sensitivity.split() for i in range(len(ianglist)): data['vp'][int(tmp[1])-1] = ianglist[i] data['comp']='p' theclass = TFC(data) start = time.clock() tf = eval('theclass.'+method+'()') elapsed.append(time.clock()-start) x = np.concatenate((x,theclass.freq+theclass.freq[1])) z = np.concatenate((z,np.abs(tf[1]))) y = np.concatenate((y,np.zeros_like(theclass.freq)+ianglist[i])) ylabel = 'Vp (m/s)' data['vp'][int(tmp[1])-1]=ianglist.tolist() elif sensitivity[:2]=='vs': tmp = sensitivity.split() for i in range(len(ianglist)): data['vs'][int(tmp[1])-1] = ianglist[i] theclass = TFC(data) start = time.clock() tf = eval('theclass.'+method+'()') elapsed.append(time.clock()-start) x = np.concatenate((x,theclass.freq+theclass.freq[1])) z = np.concatenate((z,np.abs(tf[0]))) y = np.concatenate((y,np.zeros_like(theclass.freq)+ianglist[i])) ylabel = 'Vs (m/s)' data['vs'][int(tmp[1])-1]=ianglist.tolist() elif sensitivity[:2]=='qp': tmp = sensitivity.split() for i in range(len(ianglist)): data['qp'][int(tmp[1])-1] = ianglist[i] data['comp']='p' theclass = TFC(data) start = time.clock() tf = eval('theclass.'+method+'()') elapsed.append(time.clock()-start) x = np.concatenate((x,theclass.freq+theclass.freq[1])) z = np.concatenate((z,np.abs(tf[1]))) y = np.concatenate((y,np.zeros_like(theclass.freq)+ianglist[i])) ylabel = '$Q_{P}$' data['qp'][int(tmp[1])-1]=ianglist.tolist() elif sensitivity[:2]=='qs': tmp = sensitivity.split() for i in range(len(ianglist)): data['qs'][int(tmp[1])-1] = ianglist[i] theclass = TFC(data) start = time.clock() tf = eval('theclass.'+method+'()') elapsed.append(time.clock()-start) x = np.concatenate((x,theclass.freq+theclass.freq[1])) z = np.concatenate((z,np.abs(tf[0]))) y = np.concatenate((y,np.zeros_like(theclass.freq)+ianglist[i])) ylabel = '$Q_{S}$' data['qs'][int(tmp[1])-1]=ianglist.tolist() elif sensitivity[:2]=='dn': tmp = sensitivity.split() for i in range(len(ianglist)): data['dn'][int(tmp[1])-1] = ianglist[i] theclass = TFC(data) start = time.clock() tf = eval('theclass.'+method+'()') elapsed.append(time.clock()-start) x = np.concatenate((x,theclass.freq+theclass.freq[1])) z = np.concatenate((z,np.abs(tf[0]))) y = np.concatenate((y,np.zeros_like(theclass.freq)+ianglist[i])) ylabel = '$\\rho (kg/m^3)$' data['dn'][int(tmp[1])-1]=ianglist.tolist() data['x'] = x data['y'] = y data['z'] = z print('method : %s; average elapsed time : %.6f with standard deviation : %.6f'%(method,np.mean(elapsed),np.std(elapsed))) if yscale=='log': SpectroPlot(data,nx=100,ny=100,ylabel=ylabel,cmap='rainbow',yscale='log') else: SpectroPlot(data,nx=100,ny=100,ylabel=ylabel,cmap='rainbow')
import IOfile from TFCalculator import TFCalculator as TFC import TFDisplayTools from TSCalculator import TSCalculator as TSC # single layer test case # filename basedir = 'Example/Input' fname = os.path.join(basedir,'sampleinput_linear_elastic_1layer_halfspace.dat') fname2 = os.path.join(basedir,'sampleinput_psv_s_linear_elastic_1layer_halfspace.dat') fname3 = os.path.join(basedir,'sampleinput_psv_p_linear_elastic_1layer_halfspace.dat') fname4 = os.path.join(basedir,'GoverGmax.dat') # input file reading datash = IOfile.parsing_input_file(fname) datapsvs = IOfile.parsing_input_file(fname2) # datapsvp = IOfile.parsing_input_file(fname3) datanonlin = IOfile.parsing_nonlinear_parameter(fname4,True) def modnlayer(data,nlayer): nl = nlayer data['sourceloc']=nl data['nlayer']=nl+1 data['tfPair'][0][1]=nl newhl = []; newvs = []; newdn = []; newqs = []; newvp = []; newqp = [] newsoiltype = [] for j in range(nl): newhl.append(data['hl'][0]/nl) newvs.append(data['vs'][0]) newqs.append(data['qs'][0])
def __init__(self,parfile,method='auto',sublayercriteria = 5.,numiter = 10,conv_level = 0.01,verbose=False): # parameter file initialization self.parfile = parfile # read file parameter self.parameters = IOfile.parsing_input_file(parfile) # method is automatically defined # if method=='auto': # if self.parameters['type']=='PSV': # self.method = 'knopoff_psv_adv' # else: # if self.parameters['nlayer']<=5: # if self.parameters['iang']==0.: # self.method='knopoff_sh' # else: # self.method='knopoff_sh_adv' # else: # self.method = 'kennet_sh' # checking input file if self.parameters['inputmotion'][1]=='ascii': self.inp_time,self.inp_signal = IOfile.read_ascii_seismogram(self.parameters['inputmotion'][0]) else: raise KeyError('Input motion other than ascii format is not yet supported! Please convert it to displacement on another software first!') self.inp_signal = [i/100. for i in self.inp_signal] self.fs = 1/(self.inp_time[1]-self.inp_time[0]) self.dt = self.inp_time[1]-self.inp_time[0] self.df = 1./((len(self.inp_signal)-1)*self.dt) # baseline correction for input signal self.inp_signal = self.inp_signal-np.mean(self.inp_signal) # if self.parameters['inputmotion'][2]=='vel': # self.inp_signal = GT.vel2disp(self.inp_signal,self.dt) # self.inp_signal = self.cosine_tapering(self.inp_signal) # self.inp_signal = self.butter_highpass_filter(self.inp_signal,2.*self.df,self.fs) # elif self.parameters['inputmotion'][2]=='acc': # self.inp_signal = GT.acc2disp(self.inp_signal,self.dt) # self.inp_signal = self.cosine_tapering(self.inp_signal) # self.inp_signal = self.butter_highpass_filter(self.inp_signal,2.*self.df,self.fs) if self.parameters['modeID']==11 or self.parameters['modeID']==12: # method is automatically defined if method=='auto': if self.parameters['type']=='PSV': self.method = 'knopoff_psv_adv' else: if self.parameters['iang']==0.: self.method = 'kramer286_sh' else: self.method = 'knopoff_sh_adv' else: self.method = method self.linear_equivalent_TF2TS(sublayercriteria,numiter,conv_level,verbose) else: # method is automatically defined if method=='auto': if self.parameters['type']=='PSV': self.method = 'knopoff_psv_adv' else: if self.parameters['iang']==0.: self.method = 'knopoff_sh' else: self.method = 'knopoff_sh_adv' else: self.method = method self.linear_TF2TS() self.lastiter = 1 if self.parameters['inputmotion'][2]=='acc': for i in range(len(self.time_series)): self.time_series[i] = GT.disp2acc(self.time_series[i],self.dt) elif self.parameters['inputmotion'][2]=='vel': for i in range(len(self.time_series)): self.time_series[i] = GT.disp2vel(self.time_series[i],self.dt)