-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathsifWriter.py
130 lines (104 loc) · 5.02 KB
/
sifWriter.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import numpy as np
def writer(folderName, numberOfStripsPerSide, resistance):
# Parameters
numberOfStrips = 2 * numberOfStripsPerSide
peakVoltage = -25000
voltageDifference = peakVoltage / (numberOfStripsPerSide + 1)
resistances = (1 + np.random.normal(size=int(numberOfStripsPerSide) + 1) / 100) * 150*10**6 # 150 M Ohm resistors
totalRes = 0
for res in resistances:
totalRes += res
current = peakVoltage / totalRes
# Open files
sif = open('./' + folderName + '/case.sif', 'w')
templateSif1 = open('./sif1.txt', 'r')
templateSif2 = open('./sif2.txt', 'r')
boundary = open('./' + folderName + '/mesh.boundary', 'r')
# Copy template 1
templateSifText = templateSif1.read()
print("template 1 read")
# Write the template
sif.write(templateSifText)
print("template 1 copied")
# Body setup
LArBody = "Body 1\n Target Bodies(1) = 1\n Name = \"Body 1\"\n Equation = 1\n Material = 3\nEnd\n\n"
sif.write(LArBody)
for y in range(5):
boardBody = "Body " + str(y + 2) + "\n Target Bodies(1) = " + str(y + 2) + "\n Name = \"Body " + str(y + 2) + "\"\n Equation = 1\n Material = 2\nEnd\n\n"
sif.write(boardBody)
for x in range(numberOfStrips+4):
stripBody = "Body " + str(x + 7) + "\n Target Bodies(1) = " + str(x + 7) + "\n Name = \"Body " + str(x + 7) + "\"\n Equation = 1\n Material = 1\nEnd\n\n"
sif.write(stripBody)
# Copy template 2
templateSifText = templateSif2.read()
print("template 2 read")
# Write the template
sif.write(templateSifText)
print("template 2 copied")
# Calculate Potentials
potential = []
for x in range(int(numberOfStripsPerSide) + 2):
if x == 0 or x == int(numberOfStripsPerSide) + 1 or not resistance:
potential.append(x * voltageDifference)
else:
potential.append(current * resistances[x] + potential[x-1])
# Find number of boundaries
lines = boundary.readlines()
numberOfBoundaries = 0
for line in lines:
split = line.split(" ")
if int(split[1]) > numberOfBoundaries:
numberOfBoundaries = int(split[1])
# Calculate the boundary numbers
boundaryIndex = numberOfBoundaries - 16 - 4*numberOfStrips
side1 = boundaryIndex
side2 = boundaryIndex + numberOfStrips + 5
side3 = boundaryIndex + 2*numberOfStrips + 10
side4 = boundaryIndex + 3*numberOfStrips + 14
boundaries1Side1, boundaries1Side2, boundaries1Side3, boundaries1Side4 = [], [], [], []
boundaries2Side1, boundaries2Side2, boundaries2Side3, boundaries2Side4 = [], [], [], []
for y in range(int(numberOfStrips/2)):
boundaries1Side1.append(side1 + y)
boundaries2Side1.append(numberOfBoundaries - 15 - 3*numberOfStrips - y)
boundaries1Side2.append(side2 + y)
boundaries2Side2.append(numberOfBoundaries - 10 - 2*numberOfStrips - y)
boundaries1Side3.append(side3 + y)
boundaries2Side3.append(numberOfBoundaries - 5 - numberOfStrips - y)
boundaries1Side4.append(side4 + y)
boundaries2Side4.append(numberOfBoundaries - 1 - y)
# Write BC
BC0 = "Boundary Condition 1\n Target Boundaries(2) = " + str(boundaryIndex - 2) + " 17\n Name = \"0\"\n Potential = 0\nEnd\n\n"
sif.write(BC0)
for boundary in range(int(numberOfStrips/2)):
BC = "Boundary Condition " + str(boundary + 2) + "\n Target Boundaries(8) = " + str(boundaries1Side1[boundary]) +\
" " + str(boundaries1Side2[boundary]) + " " + str(boundaries1Side3[boundary]) + " " +\
str(boundaries1Side4[boundary]) + " " + str(boundaries2Side1[boundary]) +\
" " + str(boundaries2Side2[boundary]) + " " + str(boundaries2Side3[boundary]) + " " +\
str(boundaries2Side4[boundary]) + " " + "\n Name = \"" + str(potential[boundary + 1]) + "\"\n Potential = " +\
str(potential[boundary + 1]) + "\nEnd\n\n"
sif.write(BC)
last = boundaryIndex - 4*numberOfStrips - (numberOfStrips + 3)
BCLast = "Boundary Condition " + str(int(numberOfStrips/2) + 2) + "\n Target Boundaries(2) = " + str(last) + " " + str(last - 11) + "\n Name = \"" + str(potential[int(numberOfStrips/2) + 1]) + "\"\n Potential = " +\
str(potential[int(numberOfStrips/2) + 1]) + "\nEnd\n"
sif.write(BCLast)
print("BC written")
# Close files
sif.close()
templateSif1.close()
templateSif2.close()
def main(args):
res = True
if args.Resistance == "False":
res = False
writer(args.outFolderName, int(args.StripNumber), res)
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(description='Create ND LAr geometry and export mesh')
parser.add_argument('outFolderName',
help='output folder name (default: LArBox)')
parser.add_argument('StripNumber',
help='Set the number of strips')
parser.add_argument('Resistance',
help='Boolean for accurate resistance')
args = parser.parse_args()
main(args)