1
2 """Pseudo-Cases for Regions, built from symlinks"""
3
4 from SolutionDirectory import SolutionDirectory
5 from PyFoam.Error import error
6 from glob import glob
7
8 from os import path,mkdir,symlink,unlink,listdir,system,renames
9
11 """Builds pseudocases for the regions"""
12
13 - def __init__(self,sol,clean=False,processorDirs=True):
14 """@param sol: solution directory
15 @param clean: Remove old pseudo-cases"""
16
17 self.master=sol
18 regions=self.master.getRegions()
19 if len(regions)<=0:
20 error("No regions in",self.master.name)
21 if clean:
22 self.cleanAll()
23 else:
24 for r in regions:
25 rName=self.master.name+"."+r
26 if path.exists(rName):
27 error("Directory",rName,"alread existing. Did not clean up?")
28
29 for r in regions:
30 rName=self.master.name+"."+r
31 mkdir(rName)
32
33 mkdir(path.join(rName,"system"))
34 for f in listdir(self.master.systemDir(region=r)):
35 self._mklink(self.master.name,r,"system",prefix=path.pardir,postfix=f)
36 symlink(path.join(path.pardir,path.pardir,self.master.name,"system","controlDict"),
37 path.join(rName,"system","controlDict"))
38 symlink(path.join(path.pardir,path.pardir,self.master.name,"system","decomposeParDict"),
39 path.join(rName,"system","decomposeParDict"))
40
41 self._mklink(self.master.name,r,"constant")
42 for t in self.master.getTimes():
43 self._mklink(self.master.name,r,t)
44 if processorDirs:
45 for p in self.master.processorDirs():
46 pDir=path.join(self.master.name,p)
47 sDir=path.join(self.master.name+"."+r,p)
48 if not path.exists(sDir):
49 mkdir(sDir)
50 for f in listdir(pDir):
51 self._mklink(self.master.name,r,path.join(p,f),prefix=path.pardir)
52
54 """Update the master Case from all the region-cases"""
55
56 for r in self.master.getRegions():
57 self.resync(r)
58
60 """Update the master case from a region case
61 @param region: Name of the region"""
62 rCase=SolutionDirectory(self.master.name+"."+region)
63 rTimes=rCase.getTimes()
64 for t in rTimes+["constant"]:
65 if path.exists(path.join(rCase.name,t)):
66 if not path.exists(path.join(self.master.name,t,region)):
67 self._rename(self.master.name,region,t)
68 for p in rCase.processorDirs():
69 pDir=path.join(self.master.name,p)
70 if not path.exists(pDir):
71 mkdir(pDir)
72 symlink(path.join(path.pardir,"system"),path.join(pDir,"system"))
73
74 if path.exists(path.join(rCase.name,p,t)):
75 if not path.exists(path.join(pDir,region,t)):
76 self._rename(self.master.name,region,t,processor=p,prefix=path.pardir)
77 if t=="constant":
78 for f in listdir(path.join(self.master.name,t,region)):
79 if f!="polyMesh":
80
81
82 dest=path.join(pDir,"constant",region,f)
83 src=path.join(path.pardir,path.pardir,path.pardir,"constant",region,f)
84 if not path.exists(dest):
85 symlink(src,dest)
86
87 - def _mklink(self,master,region,name,prefix="",postfix=""):
88 """Makes a link from the master case to the pseudo-case
89 @param master: Name of the master directory
90 @param region: Name of one region
91 @param name: Name of the directory to link
92 @param prefix: A prefix to the path
93 @param postfix: An actual file to the path"""
94
95 destname=path.join(master+"."+region,name)
96 srcname=path.join(prefix,path.pardir,master,name,region,postfix)
97 if postfix!="":
98 destname=path.join(destname,postfix)
99
100
101
102 symlink(srcname,destname)
103
104 return path.exists(srcname)
105
106 - def _rename(self,master,region,name,prefix="",processor=""):
107 """Moves a directory from
108 @param master: Name of the master directory
109 @param region: Name of one region
110 @param name: Name of the directory to link
111 @param prefix: A prefix to the path"""
112
113 rName=master+"."+region
114
115 if processor=="":
116 destName=path.join(master,name,region)
117 srcName=path.join(rName,name)
118 prefix=path.pardir
119 else:
120 destName=path.join(master,processor,name,region)
121 srcName=path.join(rName,processor,name)
122 prefix=path.join(path.pardir,path.pardir)
123
124
125
126 if not path.exists(destName):
127 renames(srcName,destName)
128 symlink(path.join(prefix,destName),srcName)
129
133
135 system("rm -rf "+self.master.name+"."+region)
136