FrontISTR  6.0.0
Large-scale structural analysis program with finit element method
fstr_NodalKinematics.f90
Go to the documentation of this file.
1 !-------------------------------------------------------------------------------
2 ! Copyright (c) 2019 FrontISTR Commons
3 ! This software is released under the MIT License, see LICENSE.txt
4 !-------------------------------------------------------------------------------
15  use m_fstr
19  implicit none
20 
21  private
22 
27 
28 contains
29 
33  subroutine fstr_ensure_finite_rotation_state( hecMESH, fstrSOLID, ndof )
35  implicit none
36 
37  type (hecmwst_local_mesh), intent(in) :: hecmesh
38  type (fstr_solid), intent(inout) :: fstrsolid
39  integer(kind=kint), intent(in) :: ndof
40 
41  integer(kind=kint) :: itype, is, ie, ic_type, icel, iis, nn, j, node_id
42  integer(kind=kint) :: node_offset, rotation_mode, shell_nnode, triad_etype
43  integer(kind=kint), allocatable :: node_mode(:), node_count(:)
44  real(kind=kreal), allocatable :: director_sum(:,:), tangent_sum(:,:)
45  real(kind=kreal) :: ecoord(3, 8), triad(3, 3), trial(3, 3)
46  real(kind=kreal) :: director(3), tangent(3), ref_axis(3), normv, proj
47 
48  if( .not. fstrsolid%has_finite_rotation_kinematics ) return
49  if( fstrsolid%finite_rotation_state_ready ) return
50  if( .not. associated(fstrsolid%shell_rot_state) ) return
51 
52  allocate( director_sum(3, hecmesh%n_node) )
53  allocate( tangent_sum(3, hecmesh%n_node) )
54  allocate( node_mode(hecmesh%n_node) )
55  allocate( node_count(hecmesh%n_node) )
56  director_sum(:, :) = 0.0d0
57  tangent_sum(:, :) = 0.0d0
58  node_mode(:) = 0
59  node_count(:) = 0
60 
61  do itype = 1, hecmesh%n_elem_type
62  is = hecmesh%elem_type_index(itype-1) + 1
63  ie = hecmesh%elem_type_index(itype)
64  ic_type = hecmesh%elem_type_item(itype)
65  if( ic_type == fe_mitc3_shell ) then
66  shell_nnode = 3
67  node_offset = 0
68  rotation_mode = 1
69  triad_etype = fe_mitc3_shell
70  else if( ic_type == fe_mitc3_shell361 ) then
71  shell_nnode = 3
72  node_offset = 3
73  rotation_mode = 2
74  triad_etype = fe_mitc3_shell
75  else if( ic_type == fe_mitc4_shell ) then
76  shell_nnode = 4
77  node_offset = 0
78  rotation_mode = 1
79  triad_etype = fe_mitc4_shell
80  else if( ic_type == fe_mitc4_shell361 ) then
81  shell_nnode = 4
82  node_offset = 4
83  rotation_mode = 2
84  triad_etype = fe_mitc4_shell
85  else
86  cycle
87  endif
88  do icel = is, ie
89  iis = hecmesh%elem_node_index(icel-1)
90  nn = hecmesh%elem_node_index(icel) - iis
91  if( .not. fstr_is_finite_rotation_shell_element(ic_type, nn) ) cycle
92  if( .not. associated( fstrsolid%elements(icel)%gausses ) ) cycle
93  if( .not. fstr_uses_finite_rotation_kinematics( ic_type, nn, &
94  fstrsolid%elements(icel)%gausses(1)%pMaterial ) ) cycle
95 
96  do j = 1, shell_nnode
97  node_id = hecmesh%elem_node_item(iis+j)
98  ecoord(1:3, j) = hecmesh%node(3*node_id-2:3*node_id)
99  end do
100 
101  if( (rotation_mode == 1 .and. ndof >= 6) .or. rotation_mode == 2 ) then
102  do j = 1, shell_nnode
103  call fstr_reference_shell_triad( triad_etype, shell_nnode, ecoord(1:3, 1:shell_nnode), j, triad )
104  node_id = hecmesh%elem_node_item(iis+node_offset+j)
105  if( node_id <= 0 .or. node_id > hecmesh%n_node ) cycle
106  if( fstrsolid%shell_rot_state(node_id) /= 0 ) cycle
107  ! Accumulate contributions from adjacent local shell elements.
108  director_sum(1:3, node_id) = director_sum(1:3, node_id) + triad(1:3, 3)
109  tangent_sum(1:3, node_id) = tangent_sum(1:3, node_id) + triad(1:3, 1)
110  node_count(node_id) = node_count(node_id) + 1
111  node_mode(node_id) = rotation_mode
112  end do
113  endif
114  end do
115  end do
116 
117  do node_id = 1, hecmesh%n_node
118  if( node_count(node_id) <= 0 ) cycle
119  if( fstrsolid%shell_rot_state(node_id) /= 0 ) cycle
120 
121  director(1:3) = director_sum(1:3, node_id)
122  normv = dsqrt( dot_product( director(1:3), director(1:3) ) )
123  if( normv <= 1.0d-14 ) then
124  call fstr_set_identity_triad( triad )
125  call fstr_store_shell_triad_node( fstrsolid, node_id, triad, node_mode(node_id) )
126  cycle
127  endif
128  director(1:3) = director(1:3)/normv
129 
130  tangent(1:3) = tangent_sum(1:3, node_id)
131  proj = dot_product( tangent(1:3), director(1:3) )
132  tangent(1:3) = tangent(1:3) - proj*director(1:3)
133  normv = dsqrt( dot_product( tangent(1:3), tangent(1:3) ) )
134  if( normv <= 1.0d-14 ) then
135  ref_axis(1:3) = (/ 1.0d0, 0.0d0, 0.0d0 /)
136  if( dabs(director(1)) > 0.9d0 ) ref_axis(1:3) = (/ 0.0d0, 1.0d0, 0.0d0 /)
137  proj = dot_product( ref_axis(1:3), director(1:3) )
138  tangent(1:3) = ref_axis(1:3) - proj*director(1:3)
139  normv = dsqrt( dot_product( tangent(1:3), tangent(1:3) ) )
140  endif
141  tangent(1:3) = tangent(1:3)/normv
142 
143  call fstr_set_identity_triad( trial )
144  trial(1:3, 1) = tangent(1:3)
145  trial(1:3, 3) = director(1:3)
146  call shellorthonormalizetriad( trial, triad )
147  call fstr_store_shell_triad_node( fstrsolid, node_id, triad, node_mode(node_id) )
148  end do
149 
150  deallocate( director_sum )
151  deallocate( tangent_sum )
152  deallocate( node_mode )
153  deallocate( node_count )
154 
155  call fstr_update_initialized_finite_rotation_state( hecmesh, fstrsolid )
156  fstrsolid%finite_rotation_state_ready = .true.
157 
158  end subroutine fstr_ensure_finite_rotation_state
159 
162  subroutine fstr_begin_nodal_kinematics_step( hecMESH, fstrSOLID, ndof )
163  implicit none
164 
165  type (hecmwst_local_mesh), intent(in) :: hecmesh
166  type (fstr_solid), intent(inout) :: fstrsolid
167  integer(kind=kint), intent(in) :: ndof
168 
169  call fstr_ensure_finite_rotation_state( hecmesh, fstrsolid, ndof )
170  if( .not. associated(fstrsolid%shell_triad) ) return
171 
172  fstrsolid%shell_triad_bak(:) = fstrsolid%shell_triad(:)
173  fstrsolid%shell_drill_bak(:) = fstrsolid%shell_drill(:)
174  fstrsolid%shell_dtriad(:) = fstrsolid%shell_triad(:)
175  fstrsolid%shell_ddrill(:) = fstrsolid%shell_drill(:)
176 
177  end subroutine fstr_begin_nodal_kinematics_step
178 
184  subroutine fstr_apply_solution_increment( hecMESH, fstrSOLID, ndof, x )
185  implicit none
186 
187  type (hecmwst_local_mesh), intent(in) :: hecmesh
188  type (fstr_solid), intent(inout) :: fstrsolid
189  integer(kind=kint), intent(in) :: ndof
190  real(kind=kreal), intent(in) :: x(:)
191 
192  integer(kind=kint) :: node_id, idx, base
193  real(kind=kreal) :: theta_inc(3), theta_compat(3)
194  real(kind=kreal) :: triad_old(3, 3), triad_new(3, 3), drill_new
195 
196  if( .not. fstrsolid%has_finite_rotation_kinematics ) then
197  do node_id = 1, hecmesh%n_node
198  idx = ndof*(node_id-1)
199  fstrsolid%dunode(idx+1:idx+ndof) = fstrsolid%dunode(idx+1:idx+ndof) + x(idx+1:idx+ndof)
200  end do
201  return
202  endif
203  call fstr_ensure_finite_rotation_state( hecmesh, fstrsolid, ndof )
204  if( .not. associated(fstrsolid%shell_node_mode) ) then
205  do node_id = 1, hecmesh%n_node
206  idx = ndof*(node_id-1)
207  fstrsolid%dunode(idx+1:idx+ndof) = fstrsolid%dunode(idx+1:idx+ndof) + x(idx+1:idx+ndof)
208  end do
209  return
210  endif
211 
212  do node_id = 1, hecmesh%n_node
213  idx = ndof*(node_id-1)
214  if( fstrsolid%shell_node_mode(node_id) == 1 ) then
215  fstrsolid%dunode(idx+1:idx+3) = fstrsolid%dunode(idx+1:idx+3) + x(idx+1:idx+3)
216  theta_inc(1:3) = x(idx+4:idx+6)
217  base = 9*(node_id-1)
218  triad_old(1:3, 1) = fstrsolid%shell_dtriad(base+1:base+3)
219  triad_old(1:3, 2) = fstrsolid%shell_dtriad(base+4:base+6)
220  triad_old(1:3, 3) = fstrsolid%shell_dtriad(base+7:base+9)
221  call shellupdatetriadwithincrement( triad_old, fstrsolid%shell_ddrill(node_id), &
222  theta_inc, triad_new, drill_new )
223  fstrsolid%shell_dtriad(base+1:base+3) = triad_new(1:3, 1)
224  fstrsolid%shell_dtriad(base+4:base+6) = triad_new(1:3, 2)
225  fstrsolid%shell_dtriad(base+7:base+9) = triad_new(1:3, 3)
226  fstrsolid%shell_ddrill(node_id) = drill_new
227  ! update nodal rotation vector for output
228  call shellcomposerotationvector( fstrsolid%dunode(idx+4:idx+6), x(idx+4:idx+6), theta_compat )
229  fstrsolid%dunode(idx+4:idx+6) = theta_compat(1:3)
230  if( ndof > 6 ) then
231  fstrsolid%dunode(idx+7:idx+ndof) = fstrsolid%dunode(idx+7:idx+ndof) + x(idx+7:idx+ndof)
232  endif
233  else if( fstrsolid%shell_node_mode(node_id) == 2 ) then
234  theta_inc(1:3) = x(idx+1:idx+3)
235  base = 9*(node_id-1)
236  triad_old(1:3, 1) = fstrsolid%shell_dtriad(base+1:base+3)
237  triad_old(1:3, 2) = fstrsolid%shell_dtriad(base+4:base+6)
238  triad_old(1:3, 3) = fstrsolid%shell_dtriad(base+7:base+9)
239  call shellupdatetriadwithincrement( triad_old, fstrsolid%shell_ddrill(node_id), &
240  theta_inc, triad_new, drill_new )
241  fstrsolid%shell_dtriad(base+1:base+3) = triad_new(1:3, 1)
242  fstrsolid%shell_dtriad(base+4:base+6) = triad_new(1:3, 2)
243  fstrsolid%shell_dtriad(base+7:base+9) = triad_new(1:3, 3)
244  fstrsolid%shell_ddrill(node_id) = drill_new
245  call shellcomposerotationvector( fstrsolid%dunode(idx+1:idx+3), x(idx+1:idx+3), theta_compat )
246  fstrsolid%dunode(idx+1:idx+3) = theta_compat(1:3)
247  else
248  fstrsolid%dunode(idx+1:idx+ndof) = fstrsolid%dunode(idx+1:idx+ndof) + x(idx+1:idx+ndof)
249  endif
250  end do
251 
252  end subroutine fstr_apply_solution_increment
253 
258  subroutine fstr_commit_solution_increment( hecMESH, fstrSOLID, ndof )
259  implicit none
260 
261  type (hecmwst_local_mesh), intent(in) :: hecmesh
262  type (fstr_solid), intent(inout) :: fstrsolid
263  integer(kind=kint), intent(in) :: ndof
264 
265  integer(kind=kint) :: node_id, idx, base
266  real(kind=kreal) :: theta_compat(3)
267 
268  if( .not. fstrsolid%has_finite_rotation_kinematics ) then
269  do node_id = 1, hecmesh%n_node
270  idx = ndof*(node_id-1)
271  fstrsolid%unode(idx+1:idx+ndof) = fstrsolid%unode(idx+1:idx+ndof) + fstrsolid%dunode(idx+1:idx+ndof)
272  end do
273  return
274  endif
275  call fstr_ensure_finite_rotation_state( hecmesh, fstrsolid, ndof )
276  if( .not. associated(fstrsolid%shell_node_mode) ) then
277  do node_id = 1, hecmesh%n_node
278  idx = ndof*(node_id-1)
279  fstrsolid%unode(idx+1:idx+ndof) = fstrsolid%unode(idx+1:idx+ndof) + fstrsolid%dunode(idx+1:idx+ndof)
280  end do
281  return
282  endif
283 
284  do node_id = 1, hecmesh%n_node
285  idx = ndof*(node_id-1)
286  if( fstrsolid%shell_node_mode(node_id) == 1 ) then
287  fstrsolid%unode(idx+1:idx+3) = fstrsolid%unode(idx+1:idx+3) + fstrsolid%dunode(idx+1:idx+3)
288  base = 9*(node_id-1)
289  fstrsolid%shell_triad(base+1:base+9) = fstrsolid%shell_dtriad(base+1:base+9)
290  fstrsolid%shell_drill(node_id) = fstrsolid%shell_ddrill(node_id)
291  ! update nodal rotation vector for output
292  call shellcomposerotationvector( fstrsolid%unode(idx+4:idx+6), fstrsolid%dunode(idx+4:idx+6), theta_compat )
293  fstrsolid%unode(idx+4:idx+6) = theta_compat(1:3)
294  if( ndof > 6 ) then
295  fstrsolid%unode(idx+7:idx+ndof) = fstrsolid%unode(idx+7:idx+ndof) + fstrsolid%dunode(idx+7:idx+ndof)
296  endif
297  else if( fstrsolid%shell_node_mode(node_id) == 2 ) then
298  base = 9*(node_id-1)
299  fstrsolid%shell_triad(base+1:base+9) = fstrsolid%shell_dtriad(base+1:base+9)
300  fstrsolid%shell_drill(node_id) = fstrsolid%shell_ddrill(node_id)
301  call shellcomposerotationvector( fstrsolid%unode(idx+1:idx+3), fstrsolid%dunode(idx+1:idx+3), theta_compat )
302  fstrsolid%unode(idx+1:idx+3) = theta_compat(1:3)
303  else
304  fstrsolid%unode(idx+1:idx+ndof) = fstrsolid%unode(idx+1:idx+ndof) + fstrsolid%dunode(idx+1:idx+ndof)
305  endif
306  end do
307 
308  end subroutine fstr_commit_solution_increment
309 
310  ! ---------------------------------------------------------------------------
311  ! Private helpers: reference-frame construction at element nodes.
312  ! ---------------------------------------------------------------------------
313 
314  subroutine fstr_set_identity_triad( triad )
315  implicit none
316 
317  real(kind=kreal), intent(out) :: triad(3, 3)
318 
319  triad(:, :) = 0.0d0
320  triad(1, 1) = 1.0d0
321  triad(2, 2) = 1.0d0
322  triad(3, 3) = 1.0d0
323 
324  end subroutine fstr_set_identity_triad
325 
328  subroutine fstr_reference_shell_triad( etype, nn, ecoord, inode, triad )
330  implicit none
331 
332  integer(kind=kint), intent(in) :: etype
333  integer(kind=kint), intent(in) :: nn
334  integer(kind=kint), intent(in) :: inode
335  real(kind=kreal), intent(in) :: ecoord(3, nn)
336  real(kind=kreal), intent(out) :: triad(3, 3)
337 
338  real(kind=kreal) :: center(2), nncoord(nn, 2), shapederiv(nn, 2)
339  real(kind=kreal) :: g1(3), g2(3), e0(3), trial(3, 3), normv
340  integer(kind=kint) :: i
341 
342  call fstr_set_identity_triad( trial )
343  if( .not. ((etype == fe_mitc3_shell .and. nn == 3) .or. &
344  (etype == fe_mitc4_shell .and. nn == 4)) .or. &
345  inode < 1 .or. inode > nn ) then
346  triad(1:3, 1:3) = trial(1:3, 1:3)
347  return
348  endif
349 
350  center = 0.0d0
351  if( etype == fe_mitc3_shell ) center = 1.0d0/3.0d0
352  call getshapederiv( etype, center, shapederiv )
353  e0(1:3) = 0.0d0
354  do i = 1, nn
355  e0(1:3) = e0(1:3) + shapederiv(i, 1)*ecoord(1:3, i)
356  end do
357 
358  call getnodalnaturalcoord( etype, nncoord )
359  call getshapederiv( etype, nncoord(inode, 1:2), shapederiv )
360  g1(1:3) = 0.0d0
361  g2(1:3) = 0.0d0
362  do i = 1, nn
363  g1(1:3) = g1(1:3) + shapederiv(i, 1)*ecoord(1:3, i)
364  g2(1:3) = g2(1:3) + shapederiv(i, 2)*ecoord(1:3, i)
365  end do
366 
367  trial(1, 3) = g1(2)*g2(3) - g1(3)*g2(2)
368  trial(2, 3) = g1(3)*g2(1) - g1(1)*g2(3)
369  trial(3, 3) = g1(1)*g2(2) - g1(2)*g2(1)
370 
371  trial(1, 2) = trial(2, 3)*e0(3) - trial(3, 3)*e0(2)
372  trial(2, 2) = trial(3, 3)*e0(1) - trial(1, 3)*e0(3)
373  trial(3, 2) = trial(1, 3)*e0(2) - trial(2, 3)*e0(1)
374  normv = dsqrt( dot_product( trial(1:3, 2), trial(1:3, 2) ) )
375  if( normv > 1.0d-14 ) trial(1:3, 2) = trial(1:3, 2)/normv
376 
377  trial(1, 1) = trial(2, 2)*trial(3, 3) - trial(3, 2)*trial(2, 3)
378  trial(2, 1) = trial(3, 2)*trial(1, 3) - trial(1, 2)*trial(3, 3)
379  trial(3, 1) = trial(1, 2)*trial(2, 3) - trial(2, 2)*trial(1, 3)
380 
381  call shellorthonormalizetriad( trial, triad )
382 
383  end subroutine fstr_reference_shell_triad
384 
386  subroutine fstr_store_shell_triad_node( fstrSOLID, node_id, triad, mode )
387  implicit none
388 
389  type (fstr_solid), intent(inout) :: fstrSOLID
390  integer(kind=kint), intent(in) :: node_id, mode
391  real(kind=kreal), intent(in) :: triad(3, 3)
392 
393  integer(kind=kint) :: base
394 
395  if( node_id <= 0 ) return
396  if( node_id > size(fstrsolid%shell_rot_state) ) return
397  if( fstrsolid%shell_rot_state(node_id) /= 0 ) return
398 
399  base = 9*(node_id-1)
400  fstrsolid%shell_rot_state(node_id) = mode
401  ! initialize reference and current shell triads
402  fstrsolid%shell_ref_triad(base+1:base+3) = triad(1:3, 1)
403  fstrsolid%shell_ref_triad(base+4:base+6) = triad(1:3, 2)
404  fstrsolid%shell_ref_triad(base+7:base+9) = triad(1:3, 3)
405  fstrsolid%shell_triad(base+1:base+3) = triad(1:3, 1)
406  fstrsolid%shell_triad(base+4:base+6) = triad(1:3, 2)
407  fstrsolid%shell_triad(base+7:base+9) = triad(1:3, 3)
408  fstrsolid%shell_triad_bak(base+1:base+9) = fstrsolid%shell_triad(base+1:base+9)
409  fstrsolid%shell_dtriad(base+1:base+9) = fstrsolid%shell_triad(base+1:base+9)
410  fstrsolid%shell_drill(node_id) = 0.0d0
411  fstrsolid%shell_drill_bak(node_id) = 0.0d0
412  fstrsolid%shell_ddrill(node_id) = 0.0d0
413 
414  end subroutine fstr_store_shell_triad_node
415 
417  subroutine fstr_reset_shell_state_from_reference( fstrSOLID )
418  implicit none
419 
420  type (fstr_solid), intent(inout) :: fstrSOLID
421 
422  integer(kind=kint) :: node_id, base
423 
424  if( .not. fstrsolid%has_finite_rotation_kinematics ) return
425  if( .not. associated(fstrsolid%shell_rot_state) ) return
426  if( .not. associated(fstrsolid%shell_ref_triad) ) return
427 
428  do node_id = 1, size(fstrsolid%shell_rot_state)
429  if( fstrsolid%shell_rot_state(node_id) == 0 ) cycle
430  base = 9*(node_id-1)
431  if( associated(fstrsolid%shell_triad) ) &
432  fstrsolid%shell_triad(base+1:base+9) = fstrsolid%shell_ref_triad(base+1:base+9)
433  if( associated(fstrsolid%shell_triad_bak) ) &
434  fstrsolid%shell_triad_bak(base+1:base+9) = fstrsolid%shell_ref_triad(base+1:base+9)
435  if( associated(fstrsolid%shell_dtriad) ) &
436  fstrsolid%shell_dtriad(base+1:base+9) = fstrsolid%shell_ref_triad(base+1:base+9)
437  if( associated(fstrsolid%shell_drill) ) fstrsolid%shell_drill(node_id) = 0.0d0
438  if( associated(fstrsolid%shell_drill_bak) ) fstrsolid%shell_drill_bak(node_id) = 0.0d0
439  if( associated(fstrsolid%shell_ddrill) ) fstrsolid%shell_ddrill(node_id) = 0.0d0
440  end do
441 
442  end subroutine fstr_reset_shell_state_from_reference
443 
450  subroutine fstr_update_initialized_finite_rotation_state( hecMESH, fstrSOLID )
451  use m_hecmw_comm_f, only: hecmw_update_r
452  implicit none
453 
454  type (hecmwST_local_mesh), intent(in) :: hecMESH
455  type (fstr_solid), intent(inout) :: fstrSOLID
456 
457  if( .not. fstrsolid%has_finite_rotation_kinematics ) return
458 
459  if( associated(fstrsolid%shell_ref_triad) ) &
460  call hecmw_update_r( hecmesh, fstrsolid%shell_ref_triad, hecmesh%n_node, 9 )
461 
462  call fstr_reset_shell_state_from_reference( fstrsolid )
463 
464  end subroutine fstr_update_initialized_finite_rotation_state
465 
466 end module m_fstr_nodalkinematics
This module encapsulate the basic functions of all elements provide by this software.
Definition: element.f90:43
subroutine getshapederiv(fetype, localcoord, shapederiv)
Calculate derivatives of shape function in natural coordinate system.
Definition: element.f90:685
integer, parameter fe_mitc3_shell361
Definition: element.f90:99
integer, parameter fe_mitc4_shell
Definition: element.f90:95
integer, parameter fe_mitc4_shell361
Definition: element.f90:100
integer, parameter fe_mitc3_shell
Definition: element.f90:94
subroutine getnodalnaturalcoord(fetype, nncoord)
Definition: element.f90:806
Shared finite-rotation nodal kinematics and rotation algebra.
logical function, public fstr_is_finite_rotation_shell_element(etype, nn)
pure subroutine, public shellorthonormalizetriad(triad_in, triad_out)
pure subroutine, public shellupdatetriadwithincrement(triad_old, drill_old, theta_inc, triad_new, drill_new)
logical function, public fstr_uses_finite_rotation_kinematics(etype, nn, material)
pure subroutine, public shellcomposerotationvector(theta_old, theta_inc, theta_new)
Finite-rotation nodal kinematics for NLGEOM.
subroutine, public fstr_begin_nodal_kinematics_step(hecMESH, fstrSOLID, ndof)
Snapshot the converged rotation state at the start of a load step and reset the Newton trial state to...
subroutine fstr_store_shell_triad_node(fstrSOLID, node_id, triad, mode)
Store the reference frame into all rotation-state arrays for a fresh node.
subroutine, public fstr_ensure_finite_rotation_state(hecMESH, fstrSOLID, ndof)
Build the per-node reference frames once, by averaging the triads contributed by adjacent local shell...
subroutine, public fstr_apply_solution_increment(hecMESH, fstrSOLID, ndof, x)
Apply the linear-solver solution increment x to the step displacement dunode.
subroutine, public fstr_commit_solution_increment(hecMESH, fstrSOLID, ndof)
Commit the converged step increment dunode into the total displacement unode.
This module defines common data and basic structures for analysis.
Definition: m_fstr.F90:15
subroutine hecmw_update_r(hecMESH, val, n, m)