@@ -37,35 +37,18 @@ def __init__(self,h,delta_factor,iter):
3737 self .delta = self .delta_factor * h
3838 n = int (15 / self .h ) + 1
3939 self .fix = []
40- # self.loadT = []
41- # self.loadB = []
40+ self .loadT = []
41+ self .loadB = []
4242 self .z = []
4343 self .iter = iter
4444
4545 #Generate grid
46- index = 0
46+ # index = 0
4747 for i in range (0 ,n ):
4848 for j in range (0 ,n + 2 * self .delta_factor ):
49- self .nodes .append ([i * h ,(j - self .delta_factor )* h ])
49+ self .nodes .append ([i * h ,(j - self .delta_factor )* h ])
50+ #index += 1
5051
51- #if j*h < self.delta and i * h < 13 * self.delta :
52- # self.loadB.append(index)
53- # #plt.scatter(i*h,j*h)
54-
55- #if j * h > 15 + h - self.delta and i * h < 13 * self.delta:
56- # self.loadT.append(index)
57- # #plt.scatter(i*h,j*h)
58-
59- #if j*h < s and i * h > 15 + h - self.delta:
60- # self.fix.append(index)
61- # #plt.scatter(i*h,j*h)
62-
63- #if j * h > 15 + h - self.delta and i * h > 15 + h - self.delta:
64- # self.fix.append(index)
65- # #plt.scatter(i*h,j*h)
66- #plt.scatter(i*h,(j-self.delta_factor)*h)
67-
68- index += 1
6952 self .nodes = np .array (self .nodes )
7053
7154 #plt.show()
@@ -86,7 +69,7 @@ def __init__(self,h,delta_factor,iter):
8669
8770 self .f = np .zeros (2 * len (self .nodes ))
8871
89- # self.b = np.full (2*len(self.nodes),1 )
72+ self .b = np .zeros (2 * len (self .nodes ))
9073
9174 if self .iter == 0 :
9275
@@ -101,22 +84,48 @@ def __init__(self,h,delta_factor,iter):
10184
10285
10386 for i in range (0 ,len (self .nodes )):
104- if self .nodes [i ][1 ] < 0 and self .nodes [i ][0 ] < 13 * self .delta :
105- self .wCurrent [i ][1 ] = - .25
87+ if self .nodes [i ][1 ] <= 0 : # and self.nodes[i][0] < 2.4 :
88+ self .wCurrent [i ][1 ] = 0.125
89+ self .loadB .append (i )
90+
91+ elif self .nodes [i ][1 ] >= 15 : # and self.nodes[i][0] < 2.4 :
92+ self .wCurrent [i ][1 ] = - 0.125
93+ self .loadT .append (i )
10694
107- if self .nodes [i ][1 ] > 15 and self .nodes [i ][0 ] < 13 * self . delta :
108- self .wCurrent [i ][1 ] = .25
95+ elif self .nodes [i ][1 ] > 0 and self .nodes [i ][1 ] <= 7.5 :
96+ self .wCurrent [i ][1 ] = ( .125 / 7.5 ) * ( 7.5 - self . nodes [ i ][ 1 ])
10997
110- if self .nodes [i ][1 ] > 15 and self .nodes [i ][0 ] >= 15 * h - self .delta :
111- self .fix .append (i )
98+ elif self .nodes [i ][1 ] < 15 and self .nodes [i ][1 ] >= 7.5 :
99+ self .wCurrent [i ][1 ] = (- .125 / 7.5 ) * (self .nodes [i ][1 ]- 7.5 )
100+
101+
102+ if self .nodes [i ][0 ] > 15 - h and self .nodes [i ][1 ] >= 7.5 and self .nodes [i ][1 ] < 7.5 + 1 * h :
103+ self .fix .append (i )
104+ self .wCurrent [i ][1 ] = 0
105+ print ("d" )
112106
113- if self .nodes [i ][1 ] < 0 and self .nodes [i ][0 ] >= 15 * h - self . delta :
107+ elif self .nodes [i ][0 ] > 15 - h and self . nodes [ i ][ 1 ] < 7.5 and self .nodes [i ][1 ] >= 7.5 - 1 * h :
114108 self .fix .append (i )
109+ self .wCurrent [i ][1 ] = 0
110+ print ("d2" )
111+
112+ #elif self.nodes[i][1] >= 15 and self.nodes[i][0] > 2.4 and self.nodes[i][0] <= 15 :
113+ # self.wCurrent[i][1] = -.125 / 5
115114
115+ #elif self.nodes[i][1] <= 0 and self.nodes[i][0] > 2.4 and self.nodes[i][0] <= 15 :
116+ # self.wCurrent[i][1] = .125 / 5
117+
118+ #else:
119+ #plt.scatter(self.nodes[i][0],self.nodes[i][1],color="red")
120+
116121 self .fix = np .sort (self .fix )
122+ print (self .fix )
123+
124+ #self.remove = np.concatenate([self.fix,self.loadT,self.loadB])
125+ #self.remove = np.sort(self.remove)
117126
118127
119- #plt.scatter(self.nodes[:,0],self.nodes[:,1],c=self.wCurrent[:,1])
128+ #plt.scatter(self.nodes[:,0],self.nodes[:,1],c=self.wCurrent[:,1],cmap="seismic" )
120129 #plt.colorbar()
121130 #plt.show()
122131 #sys.exit(1)
@@ -127,39 +136,6 @@ def __init__(self,h,delta_factor,iter):
127136 #self.nodes += np.load(filehandler)
128137 #self.uCurrent = np.load(filehandler)
129138
130-
131-
132- #Apply the load to the body force vector
133- #self.b = np.zeros(2*len(self.nodes))
134- #self.b2 = np.zeros(2*len(self.nodes))
135- #self.b3 = np.zeros(2*len(self.nodes))
136-
137- #self.b = np.zeros(2*len(self.nodes))
138-
139- #self.uCurrent += self.wCurrent
140-
141- #for i in range(0,len(self.nodes)):
142- # for j in self.neighbors[i]:
143- #
144- # tmp = self.L(i,j)
145- # self.b[2*i] += tmp[0]
146- # self.b[2*i+1] += tmp[1]
147-
148- #self.uCurrent -= self.wCurrent
149-
150- #print(self.b)
151-
152- #sys.exit(1)
153- #for i in range(0,len(self.nodes)):
154- # if i in self.loadT:
155- # self.b[2*i+1] = 4e3 / (2*self.delta*self.delta)
156- # self.b2[2*i+1] = 4e5 / (2*self.delta*self.delta)
157- # self.b3[2*i+1] = 4e6 / (2*self.delta*self.delta)
158- # if i in self.loadB:
159- # self.b[2*i+1] = -(4e3) / (2*self.delta*self.delta)
160- # self.b2[2*i+1] = -(4e5) / (2*self.delta*self.delta)
161- # self.b3[2*i+1] = -(4e6) / (2*self.delta*self.delta)
162-
163139 print ("Matrix size " + str (2 * len (self .nodes ))+ "x" + str (2 * len (self .nodes )))
164140
165141
@@ -193,20 +169,36 @@ def L(self,i,j):
193169 r = np .sqrt (self .length (i ,j )) * self .S (i ,j )
194170 return (2. / self .VB ) * self .w (self .length (i ,j ))/ self .delta * self .f1 (r ) / self .length (i ,j ) * self .e (i ,j ) * self .V [j ]
195171
172+ def computeLoad (self ,iter ):
173+ self .b .fill (0 )
174+
175+ #uCurrentCopy = np.copy(self.uCurrent)
176+
177+ self .uCurrent += iter * self .wCurrent
178+
179+ for i in range (0 ,len (self .nodes )):
180+ for j in self .neighbors [i ]:
181+
182+ tmp = self .L (i ,j )
183+ self .b [2 * i ] += tmp [0 ]
184+ self .b [2 * i + 1 ] += tmp [1 ]
185+
186+ self .uCurrent -= iter * self .wCurrent #np.copy(uCurrentCopy)
187+
196188
197189 def residual (self ,iter ):
198190 self .f .fill (0 )
199191
200- self .uCurrent += iter * self .wCurrent
201-
192+ # self.uCurrent =+ iter * self.wCurrent
193+
202194 for i in range (0 ,len (self .nodes )):
203195 for j in self .neighbors [i ]:
204196
205197 tmp = self .L (i ,j )
206198 self .f [2 * i ] += tmp [0 ]
207199 self .f [2 * i + 1 ] += tmp [1 ]
208200
209- self .uCurrent -= iter * self .wCurrent
201+ # self.uCurrent =- iter * self.wCurrent
210202
211203
212204 def computeDamage (self ):
@@ -220,8 +212,6 @@ def computeDamage(self):
220212
221213 self .damage (i ,j )
222214
223-
224-
225215 def damage (self ,i ,j ):
226216 z = self .d [i ]
227217 sr = 0
@@ -292,22 +282,25 @@ def solve(self,maxIt,epsilion):
292282
293283 print (" ##### Load step: " + str (iter + self .iter ) + " #####" )
294284 self .residual (iter )
295- print ("Residual with intial guess" ,np .linalg .norm (self .wCurrent )- np .linalg .norm (self .uCurrent ))
296285
286+ print ("Residual with intial guess" ,np .linalg .norm (self .f ))
287+
288+
289+ residual = np .finfo (float ).max
297290
298- residual = np . finfo ( np . float ). max
291+ self . computeLoad ( iter )
299292
300293 it = 1
301294 while (residual > epsilion ):
302295
303296 self .assemblymatrix ()
304297
305298
306- b = np .copy (self .f )
299+ b = np .copy (self .f + self . b )
307300
308301 for i in range (0 ,len (self .fix )):
309-
310- index = 2 * self .fix [len (self .fix )- 1 - i ]
302+
303+ index = int ( 2 * self .fix [len (self .fix )- 1 - i ])
311304 b = np .delete (b ,index + 1 )
312305 b = np .delete (b ,index )
313306 self .matrix = np .delete (self .matrix ,index + 1 ,1 )
@@ -325,6 +318,10 @@ def solve(self,maxIt,epsilion):
325318 if not i in self .fix :
326319 unew [i ] = np .array ([res [2 * j ],res [2 * j + 1 ]])
327320 j += 1
321+ #elif i in self.loadT:
322+ # unew[i] = iter* np.array([0,0.125])
323+ #elif i in self.loadB:
324+ # unew[i] = iter * np.array([0,-.125])
328325
329326 #plt.scatter(self.nodes[:,0],self.nodes[:,1],c=self.uCurrent[:,1])
330327 #plt.colorbar()
@@ -336,9 +333,21 @@ def solve(self,maxIt,epsilion):
336333
337334 self .uCurrent += unew
338335
339- self .residual (iter )
336+ #self.residual(iter)
337+ self .computeLoad (iter )
338+
339+ extension = []
340+
341+
342+ for i in range (0 ,len (self .nodes )):
343+ if i in self .loadT or i in self .loadB :
344+ #extension.append(abs(iter*self.wCurrent[i])-abs(self.uCurrent[i]))
345+ extension .append (self .b [i ])
340346
341- residual = np .linalg .norm (iter * self .wCurrent ) - np .linalg .norm (self .uCurrent )
347+ #residual = np.linalg.norm(iter * self.wCurrent) - np.linalg.norm(extension)
348+ #residual = np.linalg.norm(iter * self.wCurrent-extension)
349+ residual = np .linalg .norm (extension )
350+ #residual = np.linalg.norm(b)
342351 print ("Iteration " ,it ," Residual: " ,residual )
343352 it += 1
344353
@@ -398,4 +407,4 @@ def dump(self,iter):
398407if __name__ == "__main__" :
399408
400409 c = Compute (float (sys .argv [1 ]),int (sys .argv [2 ]),int (sys .argv [3 ]))
401- c .solve (1 ,1e-5 )
410+ c .solve (500 ,1e-5 )
0 commit comments