[docs]defnetwork_to_pergeos(network,filename=''):# avoid printing truncated arraynp.set_printoptions(threshold=np.inf)# Ensure network has PerGeos' expected propertiesif'pore.EqRadius'notinnetwork.props():try:network['pore.EqRadius']=network['pore.diameter']/2exceptKeyError:network['pore.EqRadius']=np.ones([network.Np,])s=["# Avizo 3D ASCII 3.0\n\n"]s.append("define VERTEX "+str(network.Np)+'\n')s.append("define EDGE "+str(network.Nt)+'\n')s.append("define POINT "+str(2*network.Nt)+'\n\n')s.append("Parameters {\n\tContentType \"HxPoreNetworkModel\"\n}\n\n")types={'b':'int','i':'int','f':'float'}typemap={}namemap={}shapemap={}propmap={}i=1NumEdgePoints=1foriteminnetwork.keys():typemap[item]=types[str(network[item].dtype)[0]]ncols=int(network[item].size/network[item].shape[0])ifncols>1:shapemap[item]='['+str(ncols)+']'else:shapemap[item]=''ifitem.startswith('pore'):element='pore','VERTEX'ifitem.startswith('throat'):element='throat','EDGE'n=item.replace(element[0]+'.','').replace('.','_').split('_')n=''.join([i[0].upper()+i[1:]foriinniflen(i)])namemap[item]=ntemp=element[1]+" { "+typemap[item]+shapemap[item]+" " \
+namemap[item]+" } @"+str(i)+'\n'iftemp.find('EdgeConnectivity')==-1:# replaces openpnm tags with the mandatory am file's tagsif"Conns"intemp:temp=temp.replace("Conns","EdgeConnectivity")elif"Coords"intemp:temp=temp.replace("Coords","VertexCoordinates")s.append(temp)propmap[item]=str(i)if"NumEdgePoints"intemp:NumEdgePoints=0i+=1ifNumEdgePoints:temp="EDGE { int NumEdgePoints"+" } @"+str(i)+'\n's.append(temp)tempat="@"+str(i)+'\n'i+=1# Add POINT datas.append("POINT { float[3] EdgePointCoordinates } @"+str(i))s.append("\n\n# Data section follows")foriteminnetwork.keys():data=network[item]ifitem!='throat.EdgeConnectivity':s.append('\n\n@'+propmap[item]+'\n')ifshapemap[item]=='':data=np.atleast_2d(data).Tiftypemap[item]=='float':formatter={'float_kind':lambdax:"%.15E"%x}else:formatter=Noneifdata.dtype=='bool':data=data.astype(int)d=np.array2string(data,formatter=formatter)s.append(d.replace('[','').replace(']','').replace('\n ','\n'))# Add POINT datas.append('\n\n@'+str(i)+'\n')formatter={'float_kind':lambdax:"%.15E"%x}conns=network['throat.conns']d=np.array2string(network['pore.coords'][conns],formatter=formatter)forrin(('[',''),(']',''),('\n\n','\n'),('\n ','\n'),('\n ','\n')):d=d.replace(*r)d+='\n's.append(d)# Add NumEdgePointsifNumEdgePoints:s.append('\n\n'+tempat)s.append(''.join(['2'+'\n']*network.Nt))# Write to fileiffilename=='':filename=network.namefname=_parse_filename(filename=filename,ext='am')withopen(fname,'w')asf:f.write(''.join(s))
[docs]defnetwork_from_pergeos(filename):r""" Loads a network from a PerGeos file. Notes ----- PerGeos is the format used by the Avizo software. See `here for more details <https://cases.pergeos.com/>`_. """net={}# ---------------------------------------------------------------------# Parse the link1 filefilename=_parse_filename(filename=filename,ext='am')withopen(filename,mode='r')asf:Np=NoneNt=Nonewhile(NpisNone)or(NtisNone):s=f.readline()[:-1].split(' ')ifs[0]=='define':ifs[1]=='VERTEX':Np=int(s[2])ifs[1]=='EDGE':Nt=int(s[2])net={}propmap={}typemap={}shapemap={}whileTrue:s=f.readline()[:-1].split(' ')ifs[0]=='VERTEX':dshape=[Np]ifs[2].endswith(']'):ncols=int(s[2].split('[',1)[1].split(']')[0])dshape.append(ncols)dtype=s[2].split('[')[0]temp=np.zeros(dshape,dtype=dtype)net['pore.'+s[3]]=tempkey=int(s[-1].replace('@',''))propmap[key]='pore.'+s[3]typemap[key]=dtypeshapemap[key]=dshapeelifs[0]=='EDGE':dshape=[Nt]ifs[2].endswith(']'):ncols=int(s[2].split('[',1)[1].split(']')[0])dshape.append(ncols)dtype=s[2].split('[')[0]temp=np.zeros(dshape,dtype=dtype)net['throat.'+s[3]]=tempkey=int(s[-1].replace('@',''))propmap[key]='throat.'+s[3]typemap[key]=dtypeshapemap[key]=dshapeelifs[0]=='#':breaks=f.read().split('@')forkeyinpropmap.keys():ifkeyins:data=s[key].split('\n')[1:]data=' '.join(data)arr=np.fromstring(data,dtype=typemap[key],sep=' ')arr=np.reshape(arr,newshape=shapemap[key])net[propmap[key]]=arr# End file parsingnet['pore.coords']=net['pore.VertexCoordinates']net['throat.conns']=np.sort(net['throat.EdgeConnectivity'],axis=1)network=Network()network.update(net)returnnetwork