Ejemplo n.º 1
0
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])
Ejemplo n.º 2
0
    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)