def layercake_volume_ascii_regulargrid_mpiregularmap(filename=None,verticalsandwich=False,onlysurface=False): import sys import start as start # mpiflag,iproc,numproc,mpi = start.start_mpi() # numpy = start.start_numpy() cfg = start.start_cfg(filename=filename) from utilities import geo2utm, savegeometry,savesurf,cubit_command_check from math import sqrt # try: mpi.barrier() except: pass # # command = "comment '"+"PROC: "+str(iproc)+"/"+str(numproc)+" '" cubit_command_check(iproc,command,stop=True) if verticalsandwich: cubit.cmd("comment 'Starting Vertical Sandwich'") # #get icpuy,icpux values if mpiflag: icpux = iproc % cfg.nproc_xi icpuy = int(iproc / cfg.nproc_xi) else: icpuy=int(cfg.id_proc/cfg.nproc_xi) icpux=cfg.id_proc%cfg.nproc_xi # if cfg.geometry_format == 'ascii': #for the original surfaces #number of points in the files that describe the topography import local_volume if cfg.localdir_is_globaldir: if iproc == 0 or not mpiflag: coordx_0,coordy_0,elev_0,nx_0,ny_0=local_volume.read_grid(filename) print 'end of reading grd files '+str(nx_0*ny_0)+ ' points' else: pass if iproc == 0 or not mpiflag: coordx=mpi.bcast(coordx_0) else: coordx=mpi.bcast() if iproc == 0 or not mpiflag: coordy=mpi.bcast(coordy_0) else: coordy=mpi.bcast() if iproc == 0 or not mpiflag: elev=mpi.bcast(elev_0) else: elev=mpi.bcast() if iproc == 0 or not mpiflag: nx=mpi.bcast(nx_0) else: nx=mpi.bcast() if iproc == 0 or not mpiflag: ny=mpi.bcast(ny_0) else: ny=mpi.bcast() else: coordx,coordy,elev,nx,ny=local_volume.read_grid(filename) print str(iproc)+ ' end of receving grd files ' nx_segment=int(nx/cfg.nproc_xi)+1 ny_segment=int(ny/cfg.nproc_eta)+1 elif cfg.geometry_format=='regmesh': # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if cfg.depth_bottom != cfg.zdepth[0]: if iproc == 0: print 'the bottom of the block is at different depth than depth[0] in the configuration file' nx= cfg.nproc_xi+1 ny= cfg.nproc_eta+1 nx_segment=2 ny_segment=2 #if iproc == 0: print nx,ny,cfg.cpux,cfg.cpuy xp=(cfg.xmax-cfg.xmin)/float((nx-1)) yp=(cfg.ymax-cfg.ymin)/float((ny-1)) # elev=numpy.zeros([nx,ny,cfg.nz],float) coordx=numpy.zeros([nx,ny],float) coordy=numpy.zeros([nx,ny],float) # # xlength=(cfg.xmax-cfg.xmin)/float(cfg.nproc_xi) #length of x slide for chunk ylength=(cfg.ymax-cfg.ymin)/float(cfg.nproc_eta) #length of y slide for chunk nelem_chunk_x=1 nelem_chunk_y=1 ivxtot=nelem_chunk_x+1 ivytot=nelem_chunk_y+1 xstep=xlength #distance between vertex on x ystep=ylength for i in range(0,cfg.nz): elev[:,:,i] = cfg.zdepth[i] icoord=0 for iy in range(0,ny): for ix in range(0,nx): icoord=icoord+1 coordx[ix,iy]=cfg.xmin+xlength*(ix) coordy[ix,iy]=cfg.ymin+ylength*(iy) #print coordx,coordy,nx,ny # print 'end of building grid '+str(iproc) print 'number of point: ', len(coordx)*len(coordy) # #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #for each processor # nxmin_cpu=(nx_segment-1)*(icpux) nymin_cpu=(ny_segment-1)*(icpuy) nxmax_cpu=min(nx-1,(nx_segment-1)*(icpux+1)) nymax_cpu=min(ny-1,(ny_segment-1)*(icpuy+1)) #if iproc == 0: # print nx_segment,ny_segment,nx,ny # print icpux,icpuy,nxmin_cpu,nxmax_cpu # print icpux,icpuy,nymin_cpu,nymax_cpu # print coordx[0,0],coordx[nx-1,ny-1] # print coordy[0,0],coordy[nx-1,ny-1] # # icurve=0 isurf=0 ivertex=0 # #create vertex for inz in range(0,cfg.nz): if cfg.sea and inz==cfg.nz-1: #sea layer sealevel=True bathymetry=False elif cfg.sea and inz==cfg.nz-2: #bathymetry layer sealevel=False bathymetry=True else: sealevel=False bathymetry=False print sealevel,bathymetry if cfg.bottomflat and inz == 0: #bottom layer # if cfg.geometry_format == 'ascii': lv=cubit.get_last_id("vertex") x_current,y_current=(coordx[nxmin_cpu,nymin_cpu],coordy[nxmin_cpu,nymin_cpu]) cubitcommand= 'create vertex '+ str( x_current )+ ' ' + str( y_current) +' '+ str( cfg.depth_bottom ) cubit.cmd(cubitcommand) # x_current,y_current=(coordx[nxmin_cpu,nymax_cpu],coordy[nxmin_cpu,nymax_cpu]) cubitcommand= 'create vertex '+ str( x_current )+ ' ' + str( y_current) +' '+ str( cfg.depth_bottom ) cubit.cmd(cubitcommand) # x_current,y_current=(coordx[nxmax_cpu,nymax_cpu],coordy[nxmax_cpu,nymax_cpu]) cubitcommand= 'create vertex '+ str( x_current )+ ' ' + str( y_current) +' '+ str( cfg.depth_bottom ) cubit.cmd(cubitcommand) # x_current,y_current=(coordx[nxmax_cpu,nymin_cpu],coordy[nxmax_cpu,nymin_cpu]) cubitcommand= 'create vertex '+ str( x_current )+ ' ' + str( y_current) +' '+ str( cfg.depth_bottom ) cubit.cmd(cubitcommand) # lv2=cubit.get_last_id("vertex") cubitcommand= 'create surface vertex '+str(lv+1)+' to '+str(lv2) cubit.cmd(cubitcommand) # isurf = isurf + 1 else: lv=cubit.get_last_id("vertex") x_current,y_current=geo2utm(coordx[nxmin_cpu,nymin_cpu],coordy[nxmin_cpu,nymin_cpu],'utm') cubitcommand= 'create vertex '+ str( x_current )+ ' ' + str( y_current) +' '+ str( cfg.depth_bottom ) cubit.cmd(cubitcommand) # x_current,y_current=geo2utm(coordx[nxmin_cpu,nymax_cpu],coordy[nxmin_cpu,nymax_cpu],'utm') cubitcommand= 'create vertex '+ str( x_current )+ ' ' + str( y_current) +' '+ str( cfg.depth_bottom ) cubit.cmd(cubitcommand) # x_current,y_current=geo2utm(coordx[nxmax_cpu,nymax_cpu],coordy[nxmax_cpu,nymax_cpu],'utm') cubitcommand= 'create vertex '+ str( x_current )+ ' ' + str( y_current) +' '+ str( cfg.depth_bottom ) cubit.cmd(cubitcommand) # x_current,y_current=geo2utm(coordx[nxmax_cpu,nymin_cpu],coordy[nxmax_cpu,nymin_cpu],'utm') cubitcommand= 'create vertex '+ str( x_current )+ ' ' + str( y_current) +' '+ str( cfg.depth_bottom ) cubit.cmd(cubitcommand) # lv2=cubit.get_last_id("vertex") cubitcommand= 'create surface vertex '+str(lv+1)+' to '+str(lv2) cubit.cmd(cubitcommand) # isurf = isurf + 1 else: if cfg.geometry_format == 'regmesh': zvertex=cfg.zdepth[inz] lv=cubit.get_last_id("vertex") x_current,y_current=geo2utm(coordx[nxmin_cpu,nymin_cpu],coordy[nxmin_cpu,nymin_cpu],'utm') cubitcommand= 'create vertex '+ str( x_current )+ ' ' + str( y_current) +' '+ str( zvertex ) cubit.cmd(cubitcommand) # x_current,y_current=geo2utm(coordx[nxmin_cpu,nymax_cpu],coordy[nxmin_cpu,nymax_cpu],'utm') cubitcommand= 'create vertex '+ str( x_current )+ ' ' + str( y_current) +' '+ str( zvertex ) cubit.cmd(cubitcommand) # x_current,y_current=geo2utm(coordx[nxmax_cpu,nymax_cpu],coordy[nxmax_cpu,nymax_cpu],'utm') cubitcommand= 'create vertex '+ str( x_current )+ ' ' + str( y_current) +' '+ str( zvertex ) cubit.cmd(cubitcommand) # x_current,y_current=geo2utm(coordx[nxmax_cpu,nymin_cpu],coordy[nxmax_cpu,nymin_cpu],'utm') cubitcommand= 'create vertex '+ str( x_current )+ ' ' + str( y_current) +' '+ str( zvertex ) cubit.cmd(cubitcommand) # cubitcommand= 'create surface vertex '+str(lv+1)+' '+str(lv+2)+' '+str(lv+3)+' '+str(lv+4) cubit.cmd(cubitcommand) # isurf = isurf + 1 elif cfg.geometry_format == 'ascii': vertex=[] for iy in range(nymin_cpu,nymax_cpu+1): ivx=0 for ix in range(nxmin_cpu,nxmax_cpu+1): zvertex=elev[ix,iy,inz] #zvertex=adjust_sea_layers(zvertex,sealevel,bathymetry,cfg) x_current,y_current=(coordx[ix,iy],coordy[ix,iy]) # vertex.append(' Position '+ str( x_current ) +' '+ str( y_current )+' '+ str( zvertex ) ) # print 'proc',iproc, 'vertex list created....',len(vertex) n=max(nx,ny) uline=[] vline=[] iv=0 cubit.cmd("set info off") cubit.cmd("set echo off") cubit.cmd("set journal off") for iy in range(0,nymax_cpu-nymin_cpu+1): positionx='' for ix in range(0,nxmax_cpu-nxmin_cpu+1): positionx=positionx+vertex[iv] iv=iv+1 command='create curve spline '+positionx cubit.cmd(command) #print command uline.append( cubit.get_last_id("curve") ) for ix in range(0,nxmax_cpu-nxmin_cpu+1): positiony='' for iy in range(0,nymax_cpu-nymin_cpu+1): positiony=positiony+vertex[ix+iy*(nxmax_cpu-nxmin_cpu+1)] command='create curve spline '+positiony cubit.cmd(command) #print command vline.append( cubit.get_last_id("curve") ) # cubit.cmd("set info "+cfg.cubit_info) cubit.cmd("set echo "+cfg.echo_info) cubit.cmd("set journal "+cfg.jou_info) # # print 'proc',iproc, 'lines created....',len(uline),'*',len(vline) umax=max(uline) umin=min(uline) vmax=max(vline) vmin=min(vline) ner=cubit.get_error_count() cubitcommand= 'create surface net u curve '+ str( umin )+' to '+str( umax )+ ' v curve '+ str( vmin )+ ' to '+str( vmax )+' heal' cubit.cmd(cubitcommand) ner2=cubit.get_error_count() if ner == ner2: command = "del curve all" cubit.cmd(command) isurf=isurf+1 # else: raise NameError, 'error, check geometry_format, it should be ascii or regmesh' # # cubitcommand= 'del vertex all' cubit.cmd(cubitcommand) if cfg.save_surface_cubit: savegeometry(iproc=iproc,surf=True,filename=filename) # # #!create volume if not onlysurface: if cfg.nz == 1: nsurface=2 else: nsurface=cfg.nz for inz in range(1,nsurface): ner=cubit.get_error_count() create_volume(inz,inz+1,method=cfg.volumecreation_method) ner2=cubit.get_error_count() if ner == ner2 and not cfg.debug_geometry: #cubitcommand= 'del surface 1 to '+ str( cfg.nz ) cubitcommand= 'del surface all' cubit.cmd(cubitcommand) list_vol=cubit.parse_cubit_list("volume","all") if len(list_vol) > 1: cubitcommand= 'imprint volume all' cubit.cmd(cubitcommand) cubitcommand= 'merge all' cubit.cmd(cubitcommand) #ner=cubit.get_error_count() #cubitcommand= 'composite create curve in vol all' #cubit.cmd(cubitcommand) savegeometry(iproc,filename=filename) #if cfg.geological_imprint: # curvesname=[cfg.outlinebasin_curve,cfg.transition_curve,cfg.faulttrace_curve] # outdir=cfg.working_dir # imprint_topography_with_geological_outline(curvesname,outdir) # # cubit.cmd("set info "+cfg.cubit_info) cubit.cmd("set echo "+cfg.echo_info) cubit.cmd("set journal "+cfg.jou_info)
def layercake_volume_ascii_regulargrid_mpiregularmap(filename=None, verticalsandwich=False, onlysurface=False): import sys import start as start # mpiflag, iproc, numproc, mpi = start.start_mpi() # numpy = start.start_numpy() cfg = start.start_cfg(filename=filename) from utilities import geo2utm, savegeometry, savesurf, cubit_command_check from math import sqrt # try: mpi.barrier() except: pass # # command = "comment '" + "PROC: " + str(iproc) + "/" + str(numproc) + " '" cubit_command_check(iproc, command, stop=True) if verticalsandwich: cubit.cmd("comment 'Starting Vertical Sandwich'") # #get icpuy,icpux values if mpiflag: icpux = iproc % cfg.nproc_xi icpuy = int(iproc / cfg.nproc_xi) else: icpuy = int(cfg.id_proc / cfg.nproc_xi) icpux = cfg.id_proc % cfg.nproc_xi # if cfg.geometry_format == 'ascii': #for the original surfaces #number of points in the files that describe the topography import local_volume if cfg.localdir_is_globaldir: if iproc == 0 or not mpiflag: coordx_0, coordy_0, elev_0, nx_0, ny_0 = local_volume.read_grid( filename) print 'end of reading grd files ' + str( nx_0 * ny_0) + ' points' else: pass if iproc == 0 or not mpiflag: coordx = mpi.bcast(coordx_0) else: coordx = mpi.bcast() if iproc == 0 or not mpiflag: coordy = mpi.bcast(coordy_0) else: coordy = mpi.bcast() if iproc == 0 or not mpiflag: elev = mpi.bcast(elev_0) else: elev = mpi.bcast() if iproc == 0 or not mpiflag: nx = mpi.bcast(nx_0) else: nx = mpi.bcast() if iproc == 0 or not mpiflag: ny = mpi.bcast(ny_0) else: ny = mpi.bcast() else: coordx, coordy, elev, nx, ny = local_volume.read_grid(filename) print str(iproc) + ' end of receving grd files ' nx_segment = int(nx / cfg.nproc_xi) + 1 ny_segment = int(ny / cfg.nproc_eta) + 1 elif cfg.geometry_format == 'regmesh': # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if cfg.depth_bottom != cfg.zdepth[0]: if iproc == 0: print 'the bottom of the block is at different depth than depth[0] in the configuration file' nx = cfg.nproc_xi + 1 ny = cfg.nproc_eta + 1 nx_segment = 2 ny_segment = 2 #if iproc == 0: print nx,ny,cfg.cpux,cfg.cpuy xp = (cfg.xmax - cfg.xmin) / float((nx - 1)) yp = (cfg.ymax - cfg.ymin) / float((ny - 1)) # elev = numpy.zeros([nx, ny, cfg.nz], float) coordx = numpy.zeros([nx, ny], float) coordy = numpy.zeros([nx, ny], float) # # xlength = (cfg.xmax - cfg.xmin) / float( cfg.nproc_xi) #length of x slide for chunk ylength = (cfg.ymax - cfg.ymin) / float( cfg.nproc_eta) #length of y slide for chunk nelem_chunk_x = 1 nelem_chunk_y = 1 ivxtot = nelem_chunk_x + 1 ivytot = nelem_chunk_y + 1 xstep = xlength #distance between vertex on x ystep = ylength for i in range(0, cfg.nz): elev[:, :, i] = cfg.zdepth[i] icoord = 0 for iy in range(0, ny): for ix in range(0, nx): icoord = icoord + 1 coordx[ix, iy] = cfg.xmin + xlength * (ix) coordy[ix, iy] = cfg.ymin + ylength * (iy) #print coordx,coordy,nx,ny # print 'end of building grid ' + str(iproc) print 'number of point: ', len(coordx) * len(coordy) # #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #for each processor # nxmin_cpu = (nx_segment - 1) * (icpux) nymin_cpu = (ny_segment - 1) * (icpuy) nxmax_cpu = min(nx - 1, (nx_segment - 1) * (icpux + 1)) nymax_cpu = min(ny - 1, (ny_segment - 1) * (icpuy + 1)) #if iproc == 0: # print nx_segment,ny_segment,nx,ny # print icpux,icpuy,nxmin_cpu,nxmax_cpu # print icpux,icpuy,nymin_cpu,nymax_cpu # print coordx[0,0],coordx[nx-1,ny-1] # print coordy[0,0],coordy[nx-1,ny-1] # # icurve = 0 isurf = 0 ivertex = 0 # #create vertex for inz in range(0, cfg.nz): if cfg.sea and inz == cfg.nz - 1: #sea layer sealevel = True bathymetry = False elif cfg.sea and inz == cfg.nz - 2: #bathymetry layer sealevel = False bathymetry = True else: sealevel = False bathymetry = False print sealevel, bathymetry if cfg.bottomflat and inz == 0: #bottom layer # if cfg.geometry_format == 'ascii': lv = cubit.get_last_id("vertex") x_current, y_current = (coordx[nxmin_cpu, nymin_cpu], coordy[nxmin_cpu, nymin_cpu]) cubitcommand = 'create vertex ' + str(x_current) + ' ' + str( y_current) + ' ' + str(cfg.depth_bottom) cubit.cmd(cubitcommand) # x_current, y_current = (coordx[nxmin_cpu, nymax_cpu], coordy[nxmin_cpu, nymax_cpu]) cubitcommand = 'create vertex ' + str(x_current) + ' ' + str( y_current) + ' ' + str(cfg.depth_bottom) cubit.cmd(cubitcommand) # x_current, y_current = (coordx[nxmax_cpu, nymax_cpu], coordy[nxmax_cpu, nymax_cpu]) cubitcommand = 'create vertex ' + str(x_current) + ' ' + str( y_current) + ' ' + str(cfg.depth_bottom) cubit.cmd(cubitcommand) # x_current, y_current = (coordx[nxmax_cpu, nymin_cpu], coordy[nxmax_cpu, nymin_cpu]) cubitcommand = 'create vertex ' + str(x_current) + ' ' + str( y_current) + ' ' + str(cfg.depth_bottom) cubit.cmd(cubitcommand) # lv2 = cubit.get_last_id("vertex") cubitcommand = 'create surface vertex ' + str( lv + 1) + ' to ' + str(lv2) cubit.cmd(cubitcommand) # isurf = isurf + 1 else: lv = cubit.get_last_id("vertex") x_current, y_current = geo2utm(coordx[nxmin_cpu, nymin_cpu], coordy[nxmin_cpu, nymin_cpu], 'utm') cubitcommand = 'create vertex ' + str(x_current) + ' ' + str( y_current) + ' ' + str(cfg.depth_bottom) cubit.cmd(cubitcommand) # x_current, y_current = geo2utm(coordx[nxmin_cpu, nymax_cpu], coordy[nxmin_cpu, nymax_cpu], 'utm') cubitcommand = 'create vertex ' + str(x_current) + ' ' + str( y_current) + ' ' + str(cfg.depth_bottom) cubit.cmd(cubitcommand) # x_current, y_current = geo2utm(coordx[nxmax_cpu, nymax_cpu], coordy[nxmax_cpu, nymax_cpu], 'utm') cubitcommand = 'create vertex ' + str(x_current) + ' ' + str( y_current) + ' ' + str(cfg.depth_bottom) cubit.cmd(cubitcommand) # x_current, y_current = geo2utm(coordx[nxmax_cpu, nymin_cpu], coordy[nxmax_cpu, nymin_cpu], 'utm') cubitcommand = 'create vertex ' + str(x_current) + ' ' + str( y_current) + ' ' + str(cfg.depth_bottom) cubit.cmd(cubitcommand) # lv2 = cubit.get_last_id("vertex") cubitcommand = 'create surface vertex ' + str( lv + 1) + ' to ' + str(lv2) cubit.cmd(cubitcommand) # isurf = isurf + 1 else: if cfg.geometry_format == 'regmesh': zvertex = cfg.zdepth[inz] lv = cubit.get_last_id("vertex") x_current, y_current = geo2utm(coordx[nxmin_cpu, nymin_cpu], coordy[nxmin_cpu, nymin_cpu], 'utm') cubitcommand = 'create vertex ' + str(x_current) + ' ' + str( y_current) + ' ' + str(zvertex) cubit.cmd(cubitcommand) # x_current, y_current = geo2utm(coordx[nxmin_cpu, nymax_cpu], coordy[nxmin_cpu, nymax_cpu], 'utm') cubitcommand = 'create vertex ' + str(x_current) + ' ' + str( y_current) + ' ' + str(zvertex) cubit.cmd(cubitcommand) # x_current, y_current = geo2utm(coordx[nxmax_cpu, nymax_cpu], coordy[nxmax_cpu, nymax_cpu], 'utm') cubitcommand = 'create vertex ' + str(x_current) + ' ' + str( y_current) + ' ' + str(zvertex) cubit.cmd(cubitcommand) # x_current, y_current = geo2utm(coordx[nxmax_cpu, nymin_cpu], coordy[nxmax_cpu, nymin_cpu], 'utm') cubitcommand = 'create vertex ' + str(x_current) + ' ' + str( y_current) + ' ' + str(zvertex) cubit.cmd(cubitcommand) # cubitcommand = 'create surface vertex ' + str( lv + 1) + ' ' + str(lv + 2) + ' ' + str(lv + 3) + ' ' + str(lv + 4) cubit.cmd(cubitcommand) # isurf = isurf + 1 elif cfg.geometry_format == 'ascii': vertex = [] for iy in range(nymin_cpu, nymax_cpu + 1): ivx = 0 for ix in range(nxmin_cpu, nxmax_cpu + 1): zvertex = elev[ix, iy, inz] #zvertex=adjust_sea_layers(zvertex,sealevel,bathymetry,cfg) x_current, y_current = (coordx[ix, iy], coordy[ix, iy]) # vertex.append(' Position ' + str(x_current) + ' ' + str(y_current) + ' ' + str(zvertex)) # print 'proc', iproc, 'vertex list created....', len(vertex) n = max(nx, ny) uline = [] vline = [] iv = 0 cubit.cmd("set info off") cubit.cmd("set echo off") cubit.cmd("set journal off") for iy in range(0, nymax_cpu - nymin_cpu + 1): positionx = '' for ix in range(0, nxmax_cpu - nxmin_cpu + 1): positionx = positionx + vertex[iv] iv = iv + 1 command = 'create curve spline ' + positionx cubit.cmd(command) #print command uline.append(cubit.get_last_id("curve")) for ix in range(0, nxmax_cpu - nxmin_cpu + 1): positiony = '' for iy in range(0, nymax_cpu - nymin_cpu + 1): positiony = positiony + vertex[ ix + iy * (nxmax_cpu - nxmin_cpu + 1)] command = 'create curve spline ' + positiony cubit.cmd(command) #print command vline.append(cubit.get_last_id("curve")) # cubit.cmd("set info " + cfg.cubit_info) cubit.cmd("set echo " + cfg.echo_info) cubit.cmd("set journal " + cfg.jou_info) # # print 'proc', iproc, 'lines created....', len(uline), '*', len( vline) umax = max(uline) umin = min(uline) vmax = max(vline) vmin = min(vline) ner = cubit.get_error_count() cubitcommand = 'create surface net u curve ' + str( umin) + ' to ' + str(umax) + ' v curve ' + str( vmin) + ' to ' + str(vmax) + ' heal' cubit.cmd(cubitcommand) ner2 = cubit.get_error_count() if ner == ner2: command = "del curve all" cubit.cmd(command) isurf = isurf + 1 # else: raise NameError, 'error, check geometry_format, it should be ascii or regmesh' # # cubitcommand = 'del vertex all' cubit.cmd(cubitcommand) if cfg.save_surface_cubit: savegeometry(iproc=iproc, surf=True, filename=filename) # # #!create volume if not onlysurface: if cfg.nz == 1: nsurface = 2 else: nsurface = cfg.nz for inz in range(1, nsurface): ner = cubit.get_error_count() create_volume(inz, inz + 1, method=cfg.volumecreation_method) ner2 = cubit.get_error_count() if ner == ner2 and not cfg.debug_geometry: #cubitcommand= 'del surface 1 to '+ str( cfg.nz ) cubitcommand = 'del surface all' cubit.cmd(cubitcommand) list_vol = cubit.parse_cubit_list("volume", "all") if len(list_vol) > 1: cubitcommand = 'imprint volume all' cubit.cmd(cubitcommand) cubitcommand = 'merge all' cubit.cmd(cubitcommand) #ner=cubit.get_error_count() #cubitcommand= 'composite create curve in vol all' #cubit.cmd(cubitcommand) savegeometry(iproc, filename=filename) #if cfg.geological_imprint: # curvesname=[cfg.outlinebasin_curve,cfg.transition_curve,cfg.faulttrace_curve] # outdir=cfg.working_dir # imprint_topography_with_geological_outline(curvesname,outdir) # # cubit.cmd("set info " + cfg.cubit_info) cubit.cmd("set echo " + cfg.echo_info) cubit.cmd("set journal " + cfg.jou_info)
def mesh_layercake_regularmap(filename=None): import sys,os import start as start mpiflag,iproc,numproc,mpi = start.start_mpi() from utilities import importgeometry,savemesh,get_v_h_list,cubit_command_check # numpy = start.start_numpy() cfg = start.start_cfg(filename=filename) from math import sqrt from sets import Set # class cubitvolume: def __init__(self,ID,intervalv,centerpoint,dimension): self.ID=ID self.intervalv=intervalv self.centerpoint=centerpoint self.dim=dimension def __repr__(self): msg="(vol:%3i, vertical interval: %4i, centerpoint: %8.2f)" % (self.ID, self.intervalv,self.centerpoint) return msg # def by_z(x,y): return cmp(x.centerpoint,y.centerpoint) # # # list_vol=cubit.parse_cubit_list("volume","all") if len(list_vol) != 0: pass else: geometryfile='geometry_vol_'+str(iproc)+'.cub' importgeometry(geometryfile,iproc=iproc) # command = 'composite create curve all' cubit.cmd(command) print '###"No valid composites can be created from the specified curves." is NOT a critical ERROR.' # command = "compress all" cubit.cmd(command) list_vol=cubit.parse_cubit_list("volume","all") nvol=len(list_vol) vol=[] for id_vol in list_vol: p=cubit.get_center_point("volume",id_vol) vol.append(cubitvolume(id_vol,1,p[2],0)) vol.sort(by_z) # for id_vol in range(0,nvol): vol[id_vol].intervalv=cfg.iv_interval[id_vol] # # surf_vertical=[] surf_or=[] top_surface=0 top_surface_add='' bottom_surface=0 # zmin_box=cubit.get_total_bounding_box("volume",list_vol)[6] xmin_box=cubit.get_total_bounding_box("volume",list_vol)[0] xmax_box=cubit.get_total_bounding_box("volume",list_vol)[1] ymin_box=cubit.get_total_bounding_box("volume",list_vol)[3] ymax_box=cubit.get_total_bounding_box("volume",list_vol)[4] # # #interval assignement surf_or,surf_vertical,list_curve_or,list_curve_vertical,bottom,top = get_v_h_list(list_vol,chktop=cfg.chktop) print 'vertical surfaces: ',surf_vertical for k in surf_vertical: command = "surface "+str(k)+" scheme submap" cubit.cmd(command) for k in surf_or: command = "surface "+str(k)+" scheme "+cfg.or_mesh_scheme cubit.cmd(command) # ucurve,vcurve=get_uv_curve(list_curve_or) schemepave=False # ucurve_interval={} for k in ucurve: length=cubit.get_curve_length(k) interval=int(2*round(.5*length/cfg.size,0)) ucurve_interval[k]=interval command = "curve "+str(k)+" interval "+str(interval) cubit.cmd(command) #cubit_error_stop(iproc,command,ner) command = "curve "+str(k)+" scheme equal" cubit.cmd(command) #cubit_error_stop(iproc,command,ner) if max(ucurve_interval.values()) != min(ucurve_interval.values()): schemepave=True print 'mesh scheme is set to pave' for sk in surf_or: command = "surface "+str(sk)+" scheme pave" cubit.cmd(command) # vcurve_interval={} for k in vcurve: length=cubit.get_curve_length(k) interval=int(2*round(.5*length/cfg.size,0)) vcurve_interval[k]=interval command = "curve "+str(k)+" interval "+str(interval) cubit.cmd(command) #cubit_error_stop(iproc,command,ner) command = "curve "+str(k)+" scheme equal" cubit.cmd(command) #cubit_error_stop(iproc,command,ner) if max(vcurve_interval.values()) != min(vcurve_interval.values()): print 'mesh scheme is set to pave' schemepave=True for sk in surf_or: command = "surface "+str(sk)+" scheme pave" cubit.cmd(command) # for s in surf_vertical: lcurve=cubit.get_relatives("surface",s,"curve") interval_store=[] for k in lcurve: interval_curve=cubit.get_mesh_intervals('curve',k) if k in list_curve_vertical: volume_id = cubit.get_owning_volume("curve", k) for idv in range(0,nvol): if vol[idv].ID == volume_id: int_v=vol[idv].intervalv command = "curve "+str(k)+" interval "+str(int_v) cubit.cmd(command) #cubit_error_stop(iproc,command,ner) command = "curve "+str(k)+" scheme equal" cubit.cmd(command) #cubit_error_stop(iproc,command,ner) else: interval_store.append((k,interval_curve)) if len(interval_store) != 0: interval_min=min([iv[1] for iv in interval_store]) command = "curve "+' '.join(str(iv[0]) for iv in interval_store)+" interval "+str(interval_min) cubit.cmd(command) #cubit_error_stop(iproc,command,ner) command = "curve "+' '.join(str(iv[0]) for iv in interval_store)+" scheme equal" cubit.cmd(command) #cubit_error_stop(iproc,command,ner) command = "surface "+str(s)+" scheme submap" cubit.cmd(command) #cubit_error_stop(iproc,command,ner) # #meshing if cfg.or_mesh_scheme == 'pave' or schemepave: command='mesh surf '+' '.join(str(t) for t in top) status=cubit_command_check(iproc,command,stop=True) #cubit.cmd(command) elif cfg.or_mesh_scheme == 'map': command='mesh surf '+' '.join(str(t) for t in bottom) status=cubit_command_check(iproc,command,stop=True) #cubit.cmd(command) for id_volume in range(nvol-1,-1,-1): command = "mesh vol "+str(vol[id_volume].ID) status=cubit_command_check(iproc,command,stop=False) if not status: for s in surf_vertical: command_surf="mesh surf "+str(s) cubit.cmd(command_surf) command_set_meshvol='volume all redistribute nodes on\nvolume all autosmooth target off\nvolume all scheme Sweep Vector 0 0 -1\nvolume all sweep smooth Auto\n' status=cubit_command_check(iproc,command_set_meshvol,stop=False) status=cubit_command_check(iproc,command,stop=True) # #smoothing print iproc, 'untangling...' cmd="volume all smooth scheme untangle beta 0.02 cpu 10" cubit.cmd(cmd) cmd="smooth volume all" cubit.cmd(cmd) if cfg.smoothing: print 'smoothing .... '+str(cfg.smoothing) cubitcommand= 'surf all smooth scheme laplacian ' cubit.cmd(cubitcommand) cubitcommand= 'smooth surf all' cubit.cmd(cubitcommand) # cubitcommand= 'vol all smooth scheme laplacian ' cubit.cmd(cubitcommand) cubitcommand= 'smooth vol all' cubit.cmd(cubitcommand) # # ##vertical refinement ##for nvol = 3 ## ##___________________________ interface 4 ## ##vol 2 ##___________________________ interface 3 ## ##vol 1 ##___________________________ interface 2 ## ##vol 0 ##___________________________ interface 1 ## refinement(nvol,vol,filename=filename) # #top layer vertical coarsening print 'coarsening top layer... ',cfg.coarsening_top_layer if cfg.coarsening_top_layer: from sets import Set cubitcommand= 'del mesh vol '+str(vol[-1].ID)+ ' propagate' cubit.cmd(cubitcommand) s1=Set(list_curve_vertical) command = "group 'list_curve_tmp' add curve "+"in vol "+str(vol[-1].ID) cubit.cmd(command) group=cubit.get_id_from_name("list_curve_tmp") list_curve_tmp=cubit.get_group_curves(group) command = "delete group "+ str(group) cubit.cmd(command) s2=Set(list_curve_tmp) lc=list(s1 & s2) # cubitcommand= 'curve '+' '.join(str(x) for x in lc)+' interval '+str(cfg.actual_vertical_interval_top_layer) cubit.cmd(cubitcommand) cubitcommand= 'mesh vol '+str(vol[-1].ID) cubit.cmd(cubitcommand) # n=cubit.get_sideset_id_list() if len(n) != 0: command = "del sideset all" cubit.cmd(command) n=cubit.get_block_id_list() if len(n) != 0: command = "del block all" cubit.cmd(command) # import boundary_definition entities=['face'] print iproc, 'hex block definition...' boundary_definition.define_bc(entities,parallel=True,cpux=cfg.cpux,cpuy=cfg.cpuy,cpuxmin=0,cpuymin=0,optionsea=False) #save mesh print iproc, 'untangling...' cmd="volume all smooth scheme untangle beta 0.02 cpu 10" cubit.cmd(cmd) cmd="smooth volume all" cubit.cmd(cmd) print iproc, 'saving...' savemesh(mpiflag,iproc=iproc,filename=filename)
def mesh_layercake_regularmap(filename=None): import start as start mpiflag, iproc, numproc, mpi = start.start_mpi() from utilities import importgeometry, savemesh, get_v_h_list from utilities import cubit_command_check, get_cubit_version # # numpy = start.start_numpy() cfg = start.start_cfg(filename=filename) # from math import sqrt version_cubit = get_cubit_version() list_vol = cubit.parse_cubit_list("volume", "all") if len(list_vol) != 0: pass else: geometryfile = 'geometry_vol_' + str(iproc) + '.cub' importgeometry(geometryfile, iproc=iproc) command = 'composite create curve all' cubit.cmd(command) print('###"No valid composites can be created from the specified curves." \ is NOT a critical ERROR.') # command = "compress all" cubit.cmd(command) list_vol = cubit.parse_cubit_list("volume", "all") nvol = len(list_vol) vol = [] for id_vol in list_vol: p = cubit.get_center_point("volume", id_vol) vol.append(cubitvolume(id_vol, 1, p[2], 0)) vol.sort(by_z) # for id_vol in range(0, nvol): vol[id_vol].intervalv = cfg.iv_interval[id_vol] # # surf_vertical = [] surf_or = [] # top_surface = 0 # top_surface_add = '' # bottom_surface = 0 # # # zmin_box = cubit.get_total_bounding_box("volume", list_vol)[6] # xmin_box = cubit.get_total_bounding_box("volume", list_vol)[0] # xmax_box = cubit.get_total_bounding_box("volume", list_vol)[1] # ymin_box = cubit.get_total_bounding_box("volume", list_vol)[3] # ymax_box = cubit.get_total_bounding_box("volume", list_vol)[4] # # # interval assignement surf_or, surf_vertical, list_curve_or, list_curve_vertical, \ bottom, top = get_v_h_list(list_vol, chktop=cfg.chktop) print('vertical surfaces: ', surf_vertical) for k in surf_vertical: command = "surface " + str(k) + " scheme submap" cubit.cmd(command) for k in surf_or: command = "surface " + str(k) + " scheme " + cfg.or_mesh_scheme cubit.cmd(command) # ucurve, vcurve = get_uv_curve(list_curve_or) schemepave = False # ucurve_interval = {} for k in ucurve: length = cubit.get_curve_length(k) interval = int(2 * round(.5 * length / cfg.size, 0)) ucurve_interval[k] = interval command = "curve " + str(k) + " interval " + str(interval) cubit.cmd(command) # cubit_error_stop(iproc,command,ner) command = "curve " + str(k) + " scheme equal" cubit.cmd(command) # cubit_error_stop(iproc,command,ner) if max(ucurve_interval.values()) != min(ucurve_interval.values()): schemepave = True print('mesh scheme is set to pave') for sk in surf_or: command = "surface " + str(sk) + " scheme pave" cubit.cmd(command) # vcurve_interval = {} for k in vcurve: length = cubit.get_curve_length(k) interval = int(2 * round(.5 * length / cfg.size, 0)) vcurve_interval[k] = interval command = "curve " + str(k) + " interval " + str(interval) cubit.cmd(command) # cubit_error_stop(iproc,command,ner) command = "curve " + str(k) + " scheme equal" cubit.cmd(command) # cubit_error_stop(iproc,command,ner) if max(vcurve_interval.values()) != min(vcurve_interval.values()): print('mesh scheme is set to pave') schemepave = True for sk in surf_or: command = "surface " + str(sk) + " scheme pave" cubit.cmd(command) # for s in surf_vertical: lcurve = cubit.get_relatives("surface", s, "curve") interval_store = [] for k in lcurve: interval_curve = cubit.get_mesh_intervals('curve', k) if k in list_curve_vertical: volume_id = cubit.get_owning_volume("curve", k) for idv in range(0, nvol): if vol[idv].ID == volume_id: int_v = vol[idv].intervalv command = "curve " + str(k) + " interval " + str(int_v) cubit.cmd(command) # cubit_error_stop(iproc,command,ner) command = "curve " + str(k) + " scheme equal" cubit.cmd(command) # cubit_error_stop(iproc,command,ner) else: interval_store.append((k, interval_curve)) if len(interval_store) != 0: interval_min = min([iv[1] for iv in interval_store]) str_interval = [str(iv[0]) for iv in interval_store] cmd = "curve " + ' '.join(str_interval) + \ " interval " + str(interval_min) cubit.cmd(cmd) command = "curve " + \ ' '.join(str(iv[0]) for iv in interval_store) + " scheme equal" cubit.cmd(command) command = "surface " + str(s) + " scheme submap" cubit.cmd(command) # meshing if cfg.or_mesh_scheme == 'pave' or schemepave: command = 'mesh surf ' + ' '.join(str(t) for t in top) status = cubit_command_check(iproc, command, stop=True) # cubit.cmd(command) elif cfg.or_mesh_scheme == 'map': command = 'mesh surf ' + ' '.join(str(t) for t in bottom) status = cubit_command_check(iproc, command, stop=True) # cubit.cmd(command) for id_volume in range(nvol - 1, -1, -1): command = "mesh vol " + str(vol[id_volume].ID) status = cubit_command_check(iproc, command, stop=False) if not status: for s in surf_vertical: command_surf = "mesh surf " + str(s) cubit.cmd(command_surf) if version_cubit < 16: command_set_meshvol = '''volume all redistribute nodes on volume all autosmooth target off volume all scheme Sweep Vector 0 0 -1 volume all sweep smooth Auto ''' else: command_set_meshvol = '''volume all redistribute nodes on volume all autosmooth target off volume all scheme Sweep Vector 0 0 -1 ''' status2 = cubit_command_check( iproc, command_set_meshvol, stop=False) status2 = cubit_command_check(iproc, command, stop=False) if not status2: _surf = cubit.get_relatives( 'volume', vol[id_volume].ID, 'surface') local_o_surf = [x for x in _surf if x in surf_or] cubit.cmd('volume ' + str(vol[id_volume].ID) + ' redistribute nodes off') cubit.cmd('volume ' + str(vol[id_volume].ID) + ' scheme Sweep source surface ' + ' '.join(str(x) for x in local_o_surf[0:-1]) + ' target surface ' + str(local_o_surf[-1])) cubit.cmd('volume ' + str(vol[id_volume].ID) + ' autosmooth_target off') status = cubit_command_check(iproc, command, stop=True) # # smoothing print(iproc, 'untangling...') cmd = "volume all smooth scheme untangle beta 0.02 cpu 10" cubit.cmd(cmd) cmd = "smooth volume all" cubit.cmd(cmd) if cfg.smoothing: print('smoothing .... ' + str(cfg.smoothing)) cubitcommand = 'surf all smooth scheme laplacian ' cubit.cmd(cubitcommand) cubitcommand = 'smooth surf all' cubit.cmd(cubitcommand) # cubitcommand = 'vol all smooth scheme laplacian ' cubit.cmd(cubitcommand) cubitcommand = 'smooth vol all' cubit.cmd(cubitcommand) # # # vertical refinement # for nvol = 3 ## # ___________________________ interface 4 ## # vol 2 # ___________________________ interface 3 ## # vol 1 # ___________________________ interface 2 ## # vol 0 # ___________________________ interface 1 ## refinement(nvol, vol, filename=filename) # # top layer vertical coarsening print('coarsening top layer... ', cfg.coarsening_top_layer) if cfg.coarsening_top_layer: cubitcommand = 'del mesh vol ' + str(vol[-1].ID) + ' propagate' cubit.cmd(cubitcommand) s1 = set(list_curve_vertical) command = "group 'list_curve_tmp' add curve " + \ "in vol " + str(vol[-1].ID) cubit.cmd(command) group = cubit.get_id_from_name("list_curve_tmp") list_curve_tmp = cubit.get_group_curves(group) command = "delete group " + str(group) cubit.cmd(command) s2 = set(list_curve_tmp) lc = list(s1 & s2) # cubitcommand = 'curve ' + \ ' '.join(str(x) for x in lc) + ' interval ' + \ str(cfg.actual_vertical_interval_top_layer) cubit.cmd(cubitcommand) cubitcommand = 'mesh vol ' + str(vol[-1].ID) cubit.cmd(cubitcommand) # n = cubit.get_sideset_id_list() if len(n) != 0: command = "del sideset all" cubit.cmd(command) n = cubit.get_block_id_list() if len(n) != 0: command = "del block all" cubit.cmd(command) # import boundary_definition entities = ['face'] print(iproc, 'hex block definition...') boundary_definition.define_bc(entities, parallel=True, cpux=cfg.cpux, cpuy=cfg.cpuy, cpuxmin=0, cpuymin=0, optionsea=False) # save mesh print(iproc, 'untangling...') cmd = "volume all smooth scheme untangle beta 0.02 cpu 10" cubit.cmd(cmd) cmd = "smooth volume all" cubit.cmd(cmd) print(iproc, 'saving...') savemesh(mpiflag, iproc=iproc, filename=filename)