def test(**kwargs): # parameters prm = { # 'nproc3': [2, 1, 1], 'nproc3': [1, 1, 1], 'shape': [5, 4, 2, 2], 'delta': [100.0, 100.0, 100.0, 0.0075], 'rho': [2670.0], 'vp': [6000.0], 'vs': [3464.0], 'gam': [0.3], 'hourglass': [1.0, 1.0], 'bc1': ['free', 'free', 'free'], 'bc2': ['free', 'free', 'free'], 'itstats': 1, } # output fns = sord.fieldnames() fns = sorted(fns['node']) + sorted(fns['cell']) for k in fns: prm[k] += [([], '=>', k + '.bin')] # source prm['pxx'] += [([0, 0, 0, 0], '=', 1e10)] prm['pyy'] += [([0, 0, 0, 0], '=', 1e10)] prm['pzz'] += [([0, 0, 0, 0], '=', 1e10)] # master prm['diffop'] = i = 'exac' d0 = os.path.join('run', 'sord_%s' % i) + os.sep cwd = os.getcwd() os.makedirs(d0) os.chdir(d0) sord.run(prm, **kwargs) meta = open('meta.json') dtype = json.load(meta)['dtype'] os.chdir(cwd) # variations max_err_all_ = 0.0 for i in ['save']: prm['diffop'] = i prm['path'] = d = os.path.join('run', 'sord_%s' % i) + os.sep os.makedirs(d) os.chdir(d) sord.run(prm, **kwargs) os.chdir(cwd) max_err_ = 0.0 for k in fns: f1 = d0 + k + '.bin' f2 = d + k + '.bin' v1 = np.fromfile(f1, dtype) v2 = np.fromfile(f2, dtype) dv = v1 - v2 e = np.abs(dv).max() if e: e = 0.5 * e / (np.abs(v1).max() + np.abs(v2).max()) print('%s error: %s' % (k, e)) max_err_ = max(max_err_, e) print('max error: ', max_err_) max_err_all_ = max(max_err_all_, max_err_) assert max_err_all_ == 0.0
def test(**kwargs): prm = {} # dimensions dx, dt = 100.0, 0.0075 nx, ny, nz, nt = 51, 51, 24, 200 prm['delta'] = [dx, dx, dx, dt] prm['shape'] = [nx, ny, nz, nt] prm['nproc3'] = [1, 1, 2] prm['nproc3'] = [1, 1, 1] # material properties prm['rho'] = rho = [2670.0] prm['vp'] = vp = [6000.0] prm['vs'] = vs = [3464.0] prm['gam'] = 1.0 prm['hourglass'] = [1.0, 1.0] # boundary conditions prm['bc1'] = ['pml', 'pml', 'pml'] prm['bc2'] = ['-node', '+node', '-cell'] # rupture dtau = 10e6 prm['faultnormal'] = '+z' prm['hypocenter'] = [-1.0, -1.0, -1.5] prm['vrup'] = vr = 0.9 * vs prm['rcrit'] = 1e9 prm['trelax'] = 0.0 prm['mud'] = 1.0 prm['mus'] = 1e9 prm['dc'] = 1e9 prm['tn'] = -90e6 prm['ts'] = -90e6 - dtau # receivers prm['svm'] = [ ([-1, -21, -1], '=>', 'p20a.bin'), ([-13, -17, -1], '=>', 'p20b.bin'), ([-17, -13, -1], '=>', 'p20c.bin'), ([-21, -1, -1], '=>', 'p20d.bin'), ] # analytical solution r = 2000.0 t = (nt - 1.5) * dt - r / prm['vrup'] # v = kostrov.slip_rate(rho, vp, vs, vr, dtau, r, t, 0.82) v = kostrov.slip_rate(rho, vp, vs, vr, dtau, r, t) # run SORD cwd = os.getcwd() d = os.path.join('run', 'sord_kostrov') + os.sep os.makedirs(d) os.chdir(d) sord.run(prm, **kwargs) meta = open('meta.json') dtype = json.load(meta)['dtype'] os.chdir(cwd) # compare with analytical solution for p in 'abcd': f = d + 'p20%s.bin' % p dv = v - np.fromfile(f, dtype)[-1] err = dv / v print(v, err) assert abs(err) < 0.015