Skip to content

Commit 023f7b5

Browse files
Merge pull request #228 from robbievanleeuwen/warping_lg
Use lagrangian multiplier for warping function
2 parents 8b0f07d + fc1e0bb commit 023f7b5

File tree

1 file changed

+20
-28
lines changed

1 file changed

+20
-28
lines changed

sectionproperties/analysis/section.py

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ def warping_analysis(progress=None):
371371
),
372372
total=len(warping_section.elements),
373373
)
374-
(k, k_lg, f_torsion) = warping_section.assemble_torsion(
374+
(k_lg, f_torsion) = warping_section.assemble_torsion(
375375
progress=progress, task=task
376376
)
377377

@@ -383,7 +383,7 @@ def warping_analysis(progress=None):
383383
)
384384
progress.update(0, advance=1)
385385
else:
386-
(k, k_lg, f_torsion) = warping_section.assemble_torsion()
386+
(k_lg, f_torsion) = warping_section.assemble_torsion()
387387

388388
# ILU decomposition of stiffness matrices
389389
def ilu_decomp(progress=None, task=None):
@@ -424,9 +424,9 @@ def ilu_decomp(progress=None, task=None):
424424
# solve for warping function
425425
def solve_warping():
426426
if solver_type == "cgs":
427-
omega = solver.solve_cgs(k, f_torsion, k_precond)
427+
omega = solver.solve_cgs_lagrange(k_lg, f_torsion, m=k_lg_precond)
428428
elif solver_type == "direct":
429-
omega = solver.solve_direct(k, f_torsion)
429+
omega = solver.solve_direct_lagrange(k_lg, f_torsion)
430430

431431
return omega
432432

@@ -457,7 +457,7 @@ def solve_warping():
457457
self.section_props.j = (
458458
self.section_props.ixx_c
459459
+ self.section_props.iyy_c
460-
- omega.dot(k.dot(np.transpose(omega)))
460+
- omega.dot(k_lg[:-1, :-1].dot(np.transpose(omega)))
461461
)
462462

463463
# assemble shear function load vectors
@@ -929,25 +929,25 @@ def calculate_frame_properties(self, solver_type="direct"):
929929
el.coords[0, :] -= self.section_props.cx
930930
el.coords[1, :] -= self.section_props.cy
931931

932-
(k, _, f) = warping_section.assemble_torsion(lg=False)
932+
(k_lg, f) = warping_section.assemble_torsion()
933933

934934
# if the cgs method is used, perform ILU decomposition
935935
if solver_type == "cgs":
936-
k_precond = linalg.LinearOperator(
937-
(self.num_nodes, self.num_nodes), linalg.spilu(k).solve
936+
k_lg_precond = linalg.LinearOperator(
937+
(self.num_nodes + 1, self.num_nodes + 1), linalg.spilu(k_lg).solve
938938
)
939939

940940
# solve for warping function
941941
if solver_type == "cgs":
942-
omega = solver.solve_cgs(k, f, k_precond)
942+
omega = solver.solve_cgs_lagrange(k_lg, f, m=k_lg_precond)
943943
elif solver_type == "direct":
944-
omega = solver.solve_direct(k, f)
944+
omega = solver.solve_direct_lagrange(k_lg, f)
945945

946946
# calculate the torsion constant
947947
self.section_props.j = (
948948
self.section_props.ixx_c
949949
+ self.section_props.iyy_c
950-
- omega.dot(k.dot(np.transpose(omega)))
950+
- omega.dot(k_lg[:-1, :-1].dot(np.transpose(omega)))
951951
)
952952

953953
return (
@@ -1223,18 +1223,15 @@ def calc_stress(progress=None):
12231223
# return the stress_post object
12241224
return stress_post
12251225

1226-
def assemble_torsion(self, lg=True, progress=None, task=None):
1227-
"""Assembles stiffness matrices to be used for the computation of warping properties and
1228-
the torsion load vector (f_torsion). Both a regular (k) and Lagrangian multiplier (k_lg)
1229-
stiffness matrix are returned. The stiffness matrices are assembled using the sparse COO
1230-
format and returned in the sparse CSC format.
1226+
def assemble_torsion(self, progress=None, task=None):
1227+
"""Assembles stiffness matrices to be used for the computation of warping
1228+
properties and the torsion load vector (f_torsion). A Lagrangian multiplier
1229+
(k_lg) stiffness matrix is returned. The stiffness matrix are assembled using
1230+
the sparse COO format and returned in the sparse CSC format.
12311231
1232-
:param bool lg: Whether or not to calculate the Lagrangian multiplier stiffness matrix
1233-
1234-
:return: Regular stiffness matrix, Lagrangian multiplier stiffness matrix and torsion load
1235-
vector *(k, k_lg, f_torsion)*
1236-
:rtype: tuple(:class:`scipy.sparse.csc_matrix`, :class:`scipy.sparse.csc_matrix`,
1237-
:class:`numpy.ndarray`)
1232+
:return: Lagrangian multiplier stiffness matrix and torsion load
1233+
vector *(k_lg, f_torsion)*
1234+
:rtype: tuple(:class:`scipy.sparse.csc_matrix`, :class:`numpy.ndarray`)
12381235
"""
12391236

12401237
# initialise variables
@@ -1272,11 +1269,6 @@ def assemble_torsion(self, lg=True, progress=None, task=None):
12721269
if progress is not None:
12731270
progress.update(task, advance=1)
12741271

1275-
k = coo_matrix((data, (row, col)), shape=(N, N))
1276-
1277-
if not lg:
1278-
return (csc_matrix(k), None, f_torsion)
1279-
12801272
# construct Lagrangian multiplier matrix:
12811273
# column vector of ones
12821274
row = np.hstack((row, range(N)))
@@ -1295,7 +1287,7 @@ def assemble_torsion(self, lg=True, progress=None, task=None):
12951287

12961288
k_lg = coo_matrix((data, (row, col)), shape=(N + 1, N + 1))
12971289

1298-
return (csc_matrix(k), csc_matrix(k_lg), f_torsion)
1290+
return (csc_matrix(k_lg), f_torsion)
12991291

13001292
def plot_mesh(
13011293
self,

0 commit comments

Comments
 (0)