def test_hex_contact_3D_order2_onFace(self): file="hex_contact_3D_order2_onFace.msh" ms1=Brick(1,1,1,2,l2=0.5,useElementsOnFace=True) ms2=Brick(1,1,1,2,l2=0.5,useElementsOnFace=True) ms2.setX(ms2.getX()+[0,0,0.5]) my_dom=JoinFaces([ms1,ms2],optimize=False) self.checker(my_dom,file)
def test_hex_contact_3D_order2_onFace(self): file = "hex_contact_3D_order2_onFace.msh" ms1 = Brick(1, 1, 1, 2, l2=0.5, useElementsOnFace=True) ms2 = Brick(1, 1, 1, 2, l2=0.5, useElementsOnFace=True) ms2.setX(ms2.getX() + [0, 0, 0.5]) my_dom = JoinFaces([ms1, ms2], optimize=False) self.checker(my_dom, file)
def test_brickconstr(self): self.assertRaises(ValueError, Brick, 4,4, diracPoints=[(0,0,0)]) self.assertRaises(ValueError, Brick, 4,4, diracPoints=[(0,0,0), (1,1,1)], diracTags=[40]) self.assertRaises(ValueError, Brick, 4,4, diracPoints=[(0,0,0), (1,1,1)], diracTags=[40]) self.assertRaises(ValueError, Brick, 4,4, diracPoints=[(0,0,0), (1,1,1)], diracTags=["cows"]) self.assertRaises(ValueError, Brick, 4,4, diracPoints=[(0,0)], diracTags=["test"]) z=Brick(4,4, diracPoints=[(0,0,0), (0.25,0.25, 0.25)], diracTags=[40,51]) z=Brick(4,4, diracPoints=[(0.125,0.625,0), (0.5,1,0), (0.75, 0.25, 0.51), (0.89, 0.875,1)], diracTags=["A", "B", "A", "C"]) v=interpolate(z.getX(), DiracDeltaFunctions(z)) if mpisize==1: self.assertEqual(v.toListOfTuples(),[(0.0, 0.5, 0.0), (0.5, 1.0, 0.0), (0.75, 0.25, 1), (1.0, 0.75, 1.0)]) self.assertEqual(v.getNumberOfDataPoints(), 4) self.assertEqual(inf(v[0]), 0) self.assertEqual(inf(v[1]), 0.25) self.assertEqual(Lsup(v[0]), 1) self.assertEqual(Lsup(v[1]), 1) v.setTaggedValue("A",(-10,0.5,-500)) if mpisize==1: self.assertEqual(inf(v[0]), -10) self.assertEqual(inf(v[1]), 0.5) self.assertEqual(inf(v[2]),-500) v.setTaggedValue(500,(-100,-100, -100)) # non-existant tag if mpisize==1: self.assertEqual(inf(v[0]), -10) self.assertEqual(inf(v[1]), 0.5) self.assertEqual(z.showTagNames(), 'A, B, C, back, bottom, front, left, right, top') self.assertEqual(z.getTag("C"), 42)
def test_brickconstr(self): self.assertRaises(ValueError, Brick, 4,4, diracPoints=[(0,0,0)]) self.assertRaises(ValueError, Brick, 4,4, diracPoints=[(0,0,0), (1,1,1)], diracTags=[40]) self.assertRaises(ValueError, Brick, 4,4, diracPoints=[(0,0,0), (1,1,1)], diracTags=[40]) self.assertRaises(ValueError, Brick, 4,4, diracPoints=[(0,0,0), (1,1,1)], diracTags=["cows"]) self.assertRaises(ValueError, Brick, 4,4, diracPoints=[(0,0)], diracTags=["test"]) z=Brick(4,4, diracPoints=[(0,0,0), (0.25,0.25, 0.25)], diracTags=[40,51]) z=Brick(4,4, diracPoints=[(0.125,0.625,0), (0.5,1,0), (0.75, 0.25, 0.51), (0.89, 0.875,1)], diracTags=["A", "B", "A", "C"]) v=interpolate(z.getX(), DiracDeltaFunctions(z)) if mpisize==1: self.assertEqual(v.toListOfTuples(),[(0.0, 0.5, 0.0), (0.5, 1.0, 0.0), (0.75, 0.25, 1), (1.0, 0.75, 1.0)]) self.assertEqual(v.getNumberOfDataPoints(), 4) self.assertEqual(inf(v[0]), 0) self.assertEqual(inf(v[1]), 0.25) self.assertEqual(Lsup(v[0]), 1) self.assertEqual(Lsup(v[1]), 1) v.setTaggedValue("A",(-10,0.5,-500)) if mpisize==1: self.assertEqual(inf(v[0]), -10) self.assertEqual(inf(v[1]), 0.5) self.assertEqual(inf(v[2]),-500) v.setTaggedValue(500,(-100,-100, -100)) # non-existant tag if mpisize==1: self.assertEqual(inf(v[0]), -10) self.assertEqual(inf(v[1]), 0.5) self.assertEqual(z.showTagNames(), 'A, B, C, back, bottom, front, left, right, top') self.assertEqual(z.getTag("C"), 42)
def setUp(self): self.order = 2 d1 = Brick(n0=NE // 2, n1=NE, n2=NE, l0=0.5, order=2, useElementsOnFace=True) d2 = Brick(n0=NE // 2 + 1, n1=NE, n2=NE, l0=0.5, order=2, useElementsOnFace=True) d2.setX(d2.getX() + [0.5, 0.0, 0.0]) if getMPISizeWorld() > 1: with self.assertRaises(NotImplementedError) as pkg: self.domain = JoinFaces([d1, d2], optimize=False) e = pkg.exception if FINLEY_MERGE_ERROR not in str(e): raise e raise unittest.SkipTest(FINLEY_MERGE_ERROR) else: self.domain = JoinFaces([d1, d2], optimize=False)
def setUp(self): self.order = 2 d1 = Brick(n0=NE // 2, n1=NE, n2=NE, l0=0.5, order=2, useElementsOnFace=True) d2 = Brick(n0=NE // 2 + 1, n1=NE, n2=NE, l0=0.5, order=2, useElementsOnFace=True) d2.setX(d2.getX() + [0.5, 0., 0.]) if getMPISizeWorld() > 1: with self.assertRaises(NotImplementedError) as pkg: self.domain = JoinFaces([d1, d2], optimize=False) e = pkg.exception if FINLEY_MERGE_ERROR not in str(e): raise e raise unittest.SkipTest(FINLEY_MERGE_ERROR) else: self.domain = JoinFaces([d1, d2], optimize=False)
def getDomain(): """ this defines a dom as a brick of length and width l and hight h """ global netotal v_p = {} for tag in sorted(rho_tab.keys()): v_p[tag] = sqrt((2 * mu_tab[tag] + lmbd_tab[tag]) / rho_tab[tag]) v_p_ref = min(v_p.values()) print( "velocities: bedrock = %s, sand = %s, water =%s, absorber =%s, reference =%s" % (v_p[bedrock], v_p[sand], v_p[water], v_p[absorber], v_p_ref)) sections = {} sections["x"] = [ d_absorber, x_sand, l_sand, l_x_water, l_sand, l - x_sand - 2 * l_sand - l_x_water, d_absorber ] sections["y"] = [ d_absorber, y_sand, l_sand, l_y_water, l_sand, l - y_sand - 2 * l_sand - l_y_water, d_absorber ] sections["z"] = [d_absorber, h - h_water - h_sand, h_sand, h_water] if output: print("sections x = ", sections["x"]) print("sections y = ", sections["y"]) print("sections z = ", sections["z"]) mats = [[ [absorber, absorber, absorber, absorber, absorber, absorber, absorber], [absorber, absorber, absorber, absorber, absorber, absorber, absorber], [absorber, absorber, absorber, absorber, absorber, absorber, absorber], [absorber, absorber, absorber, absorber, absorber, absorber, absorber], [absorber, absorber, absorber, absorber, absorber, absorber, absorber], [absorber, absorber, absorber, absorber, absorber, absorber, absorber], [absorber, absorber, absorber, absorber, absorber, absorber, absorber] ], [[ absorber, absorber, absorber, absorber, absorber, absorber, absorber ], [absorber, bedrock, bedrock, bedrock, bedrock, bedrock, absorber], [absorber, bedrock, bedrock, bedrock, bedrock, bedrock, absorber], [absorber, bedrock, bedrock, bedrock, bedrock, bedrock, absorber], [absorber, bedrock, bedrock, bedrock, bedrock, bedrock, absorber], [absorber, bedrock, bedrock, bedrock, bedrock, bedrock, absorber], [ absorber, absorber, absorber, absorber, absorber, absorber, absorber ]], [[ absorber, absorber, absorber, absorber, absorber, absorber, absorber ], [absorber, bedrock, bedrock, bedrock, bedrock, bedrock, absorber], [absorber, bedrock, sand, sand, sand, bedrock, absorber], [absorber, bedrock, sand, sand, sand, bedrock, absorber], [absorber, bedrock, sand, sand, sand, bedrock, absorber], [absorber, bedrock, bedrock, bedrock, bedrock, bedrock, absorber], [ absorber, absorber, absorber, absorber, absorber, absorber, absorber ]], [[ absorber, absorber, absorber, absorber, absorber, absorber, absorber ], [absorber, bedrock, bedrock, bedrock, bedrock, bedrock, absorber], [absorber, bedrock, sand, sand, sand, bedrock, absorber], [absorber, bedrock, sand, water, sand, bedrock, absorber], [absorber, bedrock, sand, sand, sand, bedrock, absorber], [absorber, bedrock, bedrock, bedrock, bedrock, bedrock, absorber], [ absorber, absorber, absorber, absorber, absorber, absorber, absorber ]]] num_elem = {} for d in sections: num_elem[d] = [] for i in range(len(sections[d])): if d == "x": v_p_min = v_p[mats[0][0][i]] for q in range(len(sections["y"])): for r in range(len(sections["z"])): v_p_min = min(v_p[mats[r][q][i]], v_p_min) elif d == "y": v_p_min = v_p[mats[0][i][0]] for q in range(len(sections["x"])): for r in range(len(sections["z"])): v_p_min = min(v_p[mats[r][i][q]], v_p_min) elif d == "z": v_p_min = v_p[mats[i][0][0]] for q in range(len(sections["x"])): for r in range(len(sections["y"])): v_p_min = min(v_p[mats[i][r][q]], v_p_min) num_elem[d].append( max(1, int(sections[d][i] * v_p_ref / v_p_min / resolution + 0.5))) ne_x = sum(num_elem["x"]) ne_y = sum(num_elem["y"]) ne_z = sum(num_elem["z"]) netotal = ne_x * ne_y * ne_z if output: print("grid : %s x %s x %s (%s elements)" % (ne_x, ne_y, ne_z, netotal)) dom = Brick(ne_x, ne_y, ne_z, l0=o * ne_x, l1=o * ne_y, l2=o * ne_z, order=o) x_old = dom.getX() x_new = 0 for d in sections: if d == "x": i = 0 f = [1, 0, 0] if d == "y": i = 1 f = [0, 1, 0] if d == "z": i = 2 f = [0, 0, 1] x = x_old[i] p = origin[d] ne = 0 s = 0. for i in range(len(sections[d]) - 1): msk = whereNonPositive(x - o * ne + 0.5) s = s * msk + (sections[d][i] / (o * num_elem[d][i]) * (x - o * ne) + p) * (1. - msk) ne += num_elem[d][i] p += sections[d][i] x_new = x_new + s * f dom.setX(x_new) fs = Function(dom) x = Function(dom).getX() x0 = x[0] x1 = x[1] x2 = x[2] p_z = origin["z"] for i in range(len(mats)): f_z = wherePositive(x2 - p_z) * wherePositive(x2 - p_z + sections["z"][i]) p_y = origin["y"] for j in range(len(mats[i])): f_y = wherePositive(x1 - p_y) * wherePositive(x1 - p_z + sections["y"][j]) p_x = origin["x"] for k in range(len(mats[i][j])): f_x = wherePositive(x0 - p_x) * wherePositive(x0 - p_x + sections["x"][k]) fs.setTags(mats[i][j][k], f_x * f_y * f_z) p_x += sections["x"][k] p_y += sections["y"][j] p_z += sections["z"][i] return dom
# number of Gauss points packNo = range(0, numg, 8) prob = MultiScale(domain=mydomain, ng=numg, useMPI=True, rtol=1e-2) # mpi is activated disp = Vector(0., Solution(mydomain)) t = 0 stress = prob.getCurrentStress() proj = Projector(mydomain) sig = proj(stress) sig_bounda = interpolate(sig, FunctionOnBoundary(mydomain)) traction = matrix_mult(sig_bounda, mydomain.getNormal()) # traction on boundary x = mydomain.getX() bx = FunctionOnBoundary(mydomain).getX() topSurf = whereZero(bx[2] - lz) tractTop = traction * topSurf # traction on top surface forceTop = integrate(tractTop, where=FunctionOnBoundary(mydomain)) # force on top areaTop = integrate(topSurf, where=FunctionOnBoundary(mydomain)) fout = file('./result/resultant.dat', 'w') fout.write('0 ' + str(forceTop[2]) + ' ' + str(areaTop) + '\n') # Dirichlet BC, rough loading ends Dbc = whereZero(x[2]) * [1, 1, 1] + whereZero(x[2] - lz) * [1, 1, 1] Vbc = whereZero(x[2]) * [0, 0, 0] + whereZero(x[2] - lz) * [0, 0, vel] # Neumann BC, constant lateral confining Nbc = whereZero(bx[0]) * [-confining, 0, 0] + whereZero(bx[0] - sup(bx[0])) * [ confining, 0, 0
mydomain = Brick(l0=lx,l1=ly,l2=lz,n0=nx,n1=ny,n2=nz,order=2,integrationOrder=2) # 20-noded,8-Gauss hexahedral element dim = 3; k = kronecker(mydomain) numg = 8*nx*ny*nz; # number of Gauss points packNo=list(range(0,numg,8)) prob = MultiScale(domain=mydomain,ng=numg,useMPI=True,rtol=1e-2) # mpi is activated disp = Vector(0.,Solution(mydomain)) t=0 stress = prob.getCurrentStress() proj = Projector(mydomain) sig = proj(stress) sig_bounda = interpolate(sig,FunctionOnBoundary(mydomain)) traction = matrix_mult(sig_bounda,mydomain.getNormal()) # traction on boundary x = mydomain.getX() bx = FunctionOnBoundary(mydomain).getX() topSurf = whereZero(bx[2]-lz) tractTop = traction*topSurf # traction on top surface forceTop = integrate(tractTop,where=FunctionOnBoundary(mydomain)) # force on top areaTop = integrate(topSurf,where=FunctionOnBoundary(mydomain)) fout=file('./result/resultant.dat','w') fout.write('0 '+str(forceTop[2])+' '+str(areaTop)+'\n') # Dirichlet BC, rough loading ends Dbc = whereZero(x[2])*[1,1,1]+whereZero(x[2]-lz)*[1,1,1] Vbc = whereZero(x[2])*[0,0,0]+whereZero(x[2]-lz)*[0,0,vel] # Neumann BC, constant lateral confining Nbc = whereZero(bx[0])*[-confining,0,0]+whereZero(bx[0]-sup(bx[0]))*[confining,0,0]+whereZero(bx[1])*[0,-confining,0]+whereZero(bx[1]-sup(bx[1]))*[0,confining,0] time_start = time.time()
print("domain dimensions = [%dm x %dm x %dm]"%(Lx,Ly,Lz)) print("grid = [%d x %d x %d]"%(NEx, NEy, NEz)) # Create domain domain=Brick(n0=NEx, n1=NEy, n2=NEz, l0=Lx, l1=Ly, l2=Lz) # Define model using class MagneticModel3D # Assumes zero Dirichlet BC at bottom left front corner model=MagneticModel3D(domain) # Define susceptibility Z0=100 # vertical position of circle below transect [m] c=[Lx/2.,Ly/2., H0-Z0] # circle center R=20. # radius x=domain.getX() d=length(x-c) kC=ksi*whereNegative(d-R) # 0 for d>R and 1 for d<R model.setSusceptibility(kC) # Set background magnetic field [Bx, By] B_h=[-b_hx, -b_hy, -b_hz] model.setBackgroundMagneticField(B_h) # Solve for magnetic field anomaly B_a=model.getMagneticFieldAnomaly() print(B_a) b_a=length(B_a+B_h)-length(np.array(B_h)) #B_h=[0, -b_h] #model.setBackgroundMagneticField(B_h)
def getDomain(): """ this defines a dom as a brick of length and width l and hight h """ global netotal v_p={} for tag in sorted(rho_tab.keys()): v_p[tag]=sqrt((2*mu_tab[tag]+lmbd_tab[tag])/rho_tab[tag]) v_p_ref=min(v_p.values()) print("velocities: bedrock = %s, sand = %s, water =%s, absorber =%s, reference =%s"%(v_p[bedrock],v_p[sand],v_p[water],v_p[absorber],v_p_ref)) sections={} sections["x"]=[d_absorber, x_sand, l_sand, l_x_water, l_sand, l-x_sand-2*l_sand-l_x_water, d_absorber] sections["y"]=[d_absorber, y_sand, l_sand, l_y_water, l_sand, l-y_sand-2*l_sand-l_y_water, d_absorber] sections["z"]=[d_absorber,h-h_water-h_sand,h_sand,h_water] if output: print("sections x = ",sections["x"]) print("sections y = ",sections["y"]) print("sections z = ",sections["z"]) mats= [ [ [absorber, absorber, absorber, absorber, absorber, absorber, absorber], [absorber, absorber, absorber, absorber, absorber, absorber, absorber], [absorber, absorber, absorber, absorber, absorber, absorber, absorber], [absorber, absorber, absorber, absorber, absorber, absorber, absorber], [absorber, absorber, absorber, absorber, absorber, absorber, absorber], [absorber, absorber, absorber, absorber, absorber, absorber, absorber], [absorber, absorber, absorber, absorber, absorber, absorber, absorber] ], [ [absorber, absorber, absorber, absorber, absorber, absorber, absorber], [absorber, bedrock , bedrock , bedrock , bedrock , bedrock , absorber], [absorber, bedrock , bedrock , bedrock , bedrock , bedrock , absorber], [absorber, bedrock , bedrock , bedrock , bedrock , bedrock , absorber], [absorber, bedrock , bedrock , bedrock , bedrock , bedrock , absorber], [absorber, bedrock , bedrock , bedrock , bedrock , bedrock , absorber], [absorber, absorber, absorber, absorber, absorber, absorber, absorber] ], [ [absorber, absorber, absorber, absorber, absorber, absorber, absorber], [absorber, bedrock , bedrock , bedrock , bedrock , bedrock , absorber], [absorber, bedrock , sand , sand , sand , bedrock , absorber], [absorber, bedrock , sand , sand , sand , bedrock , absorber], [absorber, bedrock , sand , sand , sand , bedrock , absorber], [absorber, bedrock , bedrock , bedrock , bedrock , bedrock , absorber], [absorber, absorber, absorber, absorber, absorber, absorber, absorber] ], [ [absorber, absorber, absorber, absorber, absorber, absorber, absorber], [absorber, bedrock , bedrock , bedrock , bedrock , bedrock , absorber], [absorber, bedrock , sand , sand , sand , bedrock , absorber], [absorber, bedrock , sand , water , sand , bedrock , absorber], [absorber, bedrock , sand , sand , sand , bedrock , absorber], [absorber, bedrock , bedrock , bedrock , bedrock , bedrock , absorber], [absorber, absorber, absorber, absorber, absorber, absorber, absorber] ] ] num_elem={} for d in sections: num_elem[d]=[] for i in range(len(sections[d])): if d=="x": v_p_min=v_p[mats[0][0][i]] for q in range(len(sections["y"])): for r in range(len(sections["z"])): v_p_min=min(v_p[mats[r][q][i]],v_p_min) elif d=="y": v_p_min=v_p[mats[0][i][0]] for q in range(len(sections["x"])): for r in range(len(sections["z"])): v_p_min=min(v_p[mats[r][i][q]],v_p_min) elif d=="z": v_p_min=v_p[mats[i][0][0]] for q in range(len(sections["x"])): for r in range(len(sections["y"])): v_p_min=min(v_p[mats[i][r][q]],v_p_min) num_elem[d].append(max(1,int(sections[d][i] * v_p_ref/v_p_min /resolution+0.5))) ne_x=sum(num_elem["x"]) ne_y=sum(num_elem["y"]) ne_z=sum(num_elem["z"]) netotal=ne_x*ne_y*ne_z if output: print("grid : %s x %s x %s (%s elements)"%(ne_x,ne_y,ne_z,netotal)) dom=Brick(ne_x,ne_y,ne_z,l0=o*ne_x,l1=o*ne_y,l2=o*ne_z,order=o) x_old=dom.getX() x_new=0 for d in sections: if d=="x": i=0 f=[1,0,0] if d=="y": i=1 f=[0,1,0] if d=="z": i=2 f=[0,0,1] x=x_old[i] p=origin[d] ne=0 s=0. for i in range(len(sections[d])-1): msk=whereNonPositive(x-o*ne+0.5) s=s*msk + (sections[d][i]/(o*num_elem[d][i])*(x-o*ne)+p)*(1.-msk) ne+=num_elem[d][i] p+=sections[d][i] x_new=x_new + s * f dom.setX(x_new) fs=Function(dom) x=Function(dom).getX() x0=x[0] x1=x[1] x2=x[2] p_z=origin["z"] for i in range(len(mats)): f_z=wherePositive(x2-p_z)*wherePositive(x2-p_z+sections["z"][i]) p_y=origin["y"] for j in range(len(mats[i])): f_y=wherePositive(x1-p_y)*wherePositive(x1-p_z+sections["y"][j]) p_x=origin["x"] for k in range(len(mats[i][j])): f_x=wherePositive(x0-p_x)*wherePositive(x0-p_x+sections["x"][k]) fs.setTags(mats[i][j][k],f_x*f_y*f_z) p_x+=sections["x"][k] p_y+=sections["y"][j] p_z+=sections["z"][i] return dom