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]) newdn.append(data['dn'][0]) newhl.append(data['hl'][-1]) newvs.append(data['vs'][-1])
def linear_equivalent_TF2TS(self,sublayercriteria = 5.,numiter = 10,conv_level = 0.01,verbose=False): """ Calculation of linear equivalent method for transfer function """ # set up linear equivalent parameters #sublayercriteria = 5. # maximum thickness of layer #numiter = 10 # maximum number of iteration #conv_level = 0.01 # convergence limit # read G/Gmax and Damping Ratio try: self.nonlinpar = IOfile.parsing_nonlinear_parameter(self.parameters['GoverGmaxfile'][0]) except: raise KeyError('GoveGmaxfile is not detected! Unable to run linear equivalent calculation!') # perform sublayer addition newhl = []; newvs = []; newqs = []; newvp = []; newqp = []; newdn = []; newst = []; nli = [] for i in range(len(self.parameters['hl'])-1): if self.parameters['hl'][i]>sublayercriteria: nlayer = np.ceil(self.parameters['hl'][i]/sublayercriteria) newhl = np.concatenate((newhl,[self.parameters['hl'][i]/nlayer for j in range(int(nlayer))])) newvs = np.concatenate((newvs,[self.parameters['vs'][i] for j in range(int(nlayer))])) newqs = np.concatenate((newqs,[self.parameters['qs'][i] for j in range(int(nlayer))])) newdn = np.concatenate((newdn,[self.parameters['dn'][i] for j in range(int(nlayer))])) newst = np.concatenate((newst,[self.parameters['soiltype'][i] for j in range(int(nlayer))])) nli.append(nlayer) if self.parameters['modeID']==12: newvp = np.concatenate((newvp,[self.parameters['vp'][i] for j in range(int(nlayer))])) newqp = np.concatenate((newqp,[self.parameters['qp'][i] for j in range(int(nlayer))])) else: newhl = np.concatenate((newhl,[self.parameters['hl'][i]])) newvs = np.concatenate((newvs,[self.parameters['vs'][i]])) newqs = np.concatenate((newqs,[self.parameters['qs'][i]])) newdn = np.concatenate((newdn,[self.parameters['dn'][i]])) nli.append(1.) newst = np.concatenate((newst,[self.parameters['soiltype'][i]])) if self.parameters['modeID']==12: newvp = np.concatenate((newvp,[self.parameters['vp'][i]])) newqp = np.concatenate((newqp,[self.parameters['qp'][i]])) # for the last layer newhl = np.concatenate((newhl,[0])) newvs = np.concatenate((newvs,[self.parameters['vs'][-1]])) newqs = np.concatenate((newqs,[self.parameters['qs'][-1]])) newdn = np.concatenate((newdn,[self.parameters['dn'][-1]])) newst = np.concatenate((newst,[self.parameters['soiltype'][-1]])) nli.append(1.) if self.parameters['modeID']==12: newvp = np.concatenate((newvp,[self.parameters['vp'][-1]])) newqp = np.concatenate((newqp,[self.parameters['qp'][-1]])) # assign sublayer to parameter self.parameters['nlayer']=len(newhl) self.parameters['hl']=newhl.tolist() self.parameters['vs']=newvs.tolist() self.parameters['qs']=newqs.tolist() self.parameters['dn']=newdn.tolist() self.parameters['soiltype']=newst.tolist() if self.parameters['modeID']==12: self.parameters['vp']=newvp.tolist() self.parameters['qp']=newqp.tolist() # correction of tfpair oldpair = self.parameters['tfPair'] for i in range(len(oldpair)): oldpair[i][0] = int(np.sum(nli[:oldpair[i][0]])) oldpair[i][1] = int(np.sum(nli[:oldpair[i][1]])) # correction of source location self.parameters['sourceloc']=int(np.sum(nli[:self.parameters['sourceloc']])) # modification of tfpair newpair = [[i,i+1] for i in range(self.parameters['nlayer']-1)] self.parameters['tfPair'] = newpair self.parameters['ntf'] = len(newpair) # initial calculation G/Gmax = 1, damping ratio = 1st value Gmax = [self.parameters['dn'][i]*self.parameters['vs'][i]**2 for i in range(len(newpair))] Gerr = np.zeros((len(newpair))) Derr = np.zeros((len(newpair))) # print original model information if verbose: print 'iteration %3d'%0 print 'Thickness\tVs\t Qs\t convG\t convD' for i in range(len(newpair)): print '%.2f\t\t%.2f\t%.2f\tn/a\tn/a'%(self.parameters['hl'][i],self.parameters['vs'][i],self.parameters['qs'][i]) for j in range(numiter): if verbose: print 'iteration %3d'%(j+1) print 'Thickness\tVs\t Qs\t convG\t convD' self.linear_TF2TS(parameters=self.parameters) # check non linearity and update parameter for i in range(len(newpair)): # retrieve old G and D oldG = self.parameters['dn'][i]*self.parameters['vs'][i]**2 oldD = 1./(2.*self.parameters['qs'][i]) # update G and D parameter if int(self.parameters['soiltype'][i])>=0: val,idx = self.find_nearest(self.nonlinpar['nonlin strain'][int(self.parameters['soiltype'][i])-1],np.max(self.time_series[i*2])) self.parameters['vs'][i]=np.sqrt((Gmax[i]*self.nonlinpar['nonlin G/Gmax'][int(self.parameters['soiltype'][i])-1][idx])/self.parameters['dn'][i]) self.parameters['qs'][i]=1./(2.*self.nonlinpar['nonlin damping'][int(self.parameters['soiltype'][i]-1)][idx]/100.) # retrieve new G and D newG = self.parameters['dn'][i]*self.parameters['vs'][i]**2 newD = 1./(2.*self.parameters['qs'][i]) # calculate rate of change as the convergence level Gerr[i] = np.abs(newG-oldG)/oldG Derr[i] = np.abs(newD-oldD)/oldD if verbose: print '%.2f\t\t%.2f\t%.2f\t%.4f\t%.4f'%(self.parameters['hl'][i],self.parameters['vs'][i],self.parameters['qs'][i],Gerr[i],Derr[i]) if np.max(Gerr)<=conv_level and np.max(Derr)<=conv_level: if verbose: print('convergence has been reached! Calculation is stopped!') break self.lastiter = deepcopy(j)+1 # correction of tfpair self.parameters['tfPair']=oldpair self.parameters['ntf']=len(oldpair) self.linear_TF2TS(parameters=self.parameters)