FrontISTR  5.7.1
Large-scale structural analysis program with finit element method
fstr_dynamic_nlimplicit.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 !-------------------------------------------------------------------------------
6 
8  use m_fstr
16  use m_fstr_update
17  use m_fstr_restart
19  use m_fstr_residual
20  use mcontact
24 
25  !-------- for couple -------
27  use m_fstr_rcap_io
28 
29 contains
30 
32 
33  subroutine fstr_solve_dynamic_nlimplicit(cstep, hecMESH,hecMAT,fstrSOLID,fstrEIG, &
34  fstrDYNAMIC,fstrRESULT,fstrPARAM,fstrCPL, restrt_step_num )
35  implicit none
36  !C-- global variable
37  integer, intent(in) :: cstep
38  type(hecmwst_local_mesh) :: hecMESH
39  type(hecmwst_matrix) :: hecMAT
40  type(fstr_eigen) :: fstrEIG
41  type(fstr_solid) :: fstrSOLID
42  type(hecmwst_result_data) :: fstrRESULT
43  type(fstr_param) :: fstrPARAM
44  type(fstr_dynamic) :: fstrDYNAMIC
45  type(hecmwst_matrix_lagrange) :: hecLagMAT
46  type(fstr_couple) :: fstrCPL !for COUPLE
47 
48  !C-- local variable
49  type(hecmwst_local_mesh), pointer :: hecMESHmpc
50  type(hecmwst_matrix), pointer :: hecMATmpc
51  type(hecmwst_matrix), pointer :: hecMAT0
52  integer(kind=kint) :: nnod, ndof, numnp, nn
53  integer(kind=kint) :: i, j, ids, ide, ims, ime, kk, idm, imm
54  integer(kind=kint) :: iter
55  integer(kind=kint) :: iiii5, iexit
56  integer(kind=kint) :: revocap_flag
57  integer(kind=kint) :: kkk0, kkk1
58  integer(kind=kint) :: restrt_step_num
59  integer(kind=kint) :: n_node_global
60  integer(kind=kint) :: ierr
61 
62  real(kind=kreal) :: a1, a2, a3, b1, b2, b3, c1, c2
63  real(kind=kreal) :: bsize, res, resb
64  real(kind=kreal) :: time_1, time_2
65  real(kind=kreal), parameter :: pi = 3.14159265358979323846d0
66  real(kind=kreal), allocatable :: coord(:)
67 
68  logical :: is_cycle
69 
70  iexit = 0
71  resb = 0.0d0
72 
73  call hecmw_mpc_mat_init(hecmesh, hecmat, hecmeshmpc, hecmatmpc)
74  nullify(hecmat0)
75 
76  ! sum of n_node among all subdomains (to be used to calc res)
77  n_node_global = hecmesh%nn_internal
78  call hecmw_allreduce_i1(hecmesh,n_node_global,hecmw_sum)
79 
80  hecmat%NDOF=hecmesh%n_dof
81  nnod=hecmesh%n_node
82  ndof=hecmat%NDOF
83  nn =ndof*ndof
84 
85  allocate(coord(hecmesh%n_node*ndof))
86 
87  !!-- initial value
88  time_1 = hecmw_wtime()
89 
90  !C-- check parameters
91  if(dabs(fstrdynamic%beta) < 1.0e-20) then
92  if( hecmesh%my_rank == 0 ) then
93  write(imsg,*) 'stop due to Newmark-beta = 0'
94  endif
95  call hecmw_abort( hecmw_comm_get_comm())
96  endif
97 
98  !C-- matrix [M] lumped mass matrix
99  if(fstrdynamic%idx_mas == 1) then
100  call setmass(fstrsolid,hecmesh,hecmat,fstreig)
101 
102  !C-- consistent mass matrix
103  else if(fstrdynamic%idx_mas == 2) then
104  if( hecmesh%my_rank .eq. 0 ) then
105  write(imsg,*) 'stop: consistent mass matrix is not yet available !'
106  endif
107  call hecmw_abort( hecmw_comm_get_comm())
108  endif
109 
110  hecmat%Iarray(98) = 1 !Assembly complete
111  hecmat%Iarray(97) = 1 !Need numerical factorization
112 
113  !C-- time step loop
114  a1 = 0.5d0/fstrdynamic%beta - 1.0d0
115  a2 = 1.0d0/(fstrdynamic%beta*fstrdynamic%t_delta)
116  a3 = 1.0d0/(fstrdynamic%beta*fstrdynamic%t_delta*fstrdynamic%t_delta)
117  b1 = (0.5d0*fstrdynamic%gamma/fstrdynamic%beta - 1.0d0 )*fstrdynamic%t_delta
118  b2 = fstrdynamic%gamma/fstrdynamic%beta - 1.0d0
119  b3 = fstrdynamic%gamma/(fstrdynamic%beta*fstrdynamic%t_delta)
120  c1 = 1.0d0 + fstrdynamic%ray_k*b3
121  c2 = a3 + fstrdynamic%ray_m*b3
122 
123  !C-- output of initial state
124  if( restrt_step_num == 1 ) then
125  call fstr_dynamic_output(hecmesh, fstrsolid, fstrdynamic, fstrparam)
126  call dynamic_output_monit(hecmesh, fstrparam, fstrdynamic, fstreig, fstrsolid)
127  endif
128 
129  fstrdynamic%VEC3(:) =0.0d0
130  hecmat%X(:) =0.0d0
131 
132  !! step = 1,2,....,fstrDYNAMIC%n_step
133  do i = restrt_step_num, fstrdynamic%n_step
134  if(ndof == 4 .and. hecmesh%my_rank==0) write(*,'(a,i5)')"iter: ",i
135 
136  fstrdynamic%i_step = i
137  fstrdynamic%t_curr = fstrdynamic%t_delta * i
138 
139  if(hecmesh%my_rank==0) then
140  !write(*,'('' time step='',i10,'' time='',1pe13.4e3)') i,fstrDYNAMIC%t_curr
141  write(ista,'('' time step='',i10,'' time='',1pe13.4e3)') i,fstrdynamic%t_curr
142  endif
143 
144  do j = 1 ,ndof*nnod
145  fstrdynamic%VEC1(j) = a1*fstrdynamic%ACC(j,1) + a2*fstrdynamic%VEL(j,1)
146  fstrdynamic%VEC2(j) = b1*fstrdynamic%ACC(j,1) + b2*fstrdynamic%VEL(j,1)
147  enddo
148 
149  !C ********************************************************************************
150  !C for couple analysis
151  do
152  fstrsolid%dunode(:) =0.d0
153  ! call fstr_UpdateEPState( hecMESH, fstrSOLID )
154  call fstr_solve_dynamic_nlimplicit_couple_init(fstrparam, fstrcpl)
155 
156  do iter = 1, fstrsolid%step_ctrl(cstep)%max_iter
157  if (fstrparam%nlgeom) then
158  call fstr_stiffmatrix( hecmesh, hecmat, fstrsolid, fstrdynamic%t_curr, fstrdynamic%t_delta )
159  else
160  if (.not. associated(hecmat0)) then
161  call fstr_stiffmatrix( hecmesh, hecmat, fstrsolid, fstrdynamic%t_curr, fstrdynamic%t_delta )
162  allocate(hecmat0)
163  call hecmw_mat_init(hecmat0)
164  call hecmw_mat_copy_profile(hecmat, hecmat0)
165  call hecmw_mat_copy_val(hecmat, hecmat0)
166  else
167  call hecmw_mat_copy_val(hecmat0, hecmat)
168  endif
169  endif
170 
171  if( fstrdynamic%ray_k/=0.d0 .or. fstrdynamic%ray_m/=0.d0 ) then
172  do j = 1 ,ndof*nnod
173  hecmat%X(j) = fstrdynamic%VEC2(j) - b3*fstrsolid%dunode(j)
174  enddo
175  endif
176  if( fstrdynamic%ray_k/=0.d0 ) then
177  if( hecmesh%n_dof == 3 ) then
178  call hecmw_matvec (hecmesh, hecmat, hecmat%X, fstrdynamic%VEC3)
179  else if( hecmesh%n_dof == 2 ) then
180  call hecmw_matvec (hecmesh, hecmat, hecmat%X, fstrdynamic%VEC3)
181  else if( hecmesh%n_dof == 6 ) then
182  call matvec(fstrdynamic%VEC3, hecmat%X, hecmat, ndof, hecmat%D, hecmat%AU, hecmat%AL)
183  endif
184  endif
185 
186  !C-- mechanical boundary condition
187  call dynamic_mat_ass_load (hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam, iter)
188  do j=1, hecmesh%n_node* hecmesh%n_dof
189  hecmat%B(j) = hecmat%B(j)- fstrsolid%QFORCE(j) + fstreig%mass(j)*( fstrdynamic%VEC1(j)-a3*fstrsolid%dunode(j) &
190  + fstrdynamic%ray_m* hecmat%X(j) ) + fstrdynamic%ray_k*fstrdynamic%VEC3(j)
191  enddo
192 
193  !C ********************************************************************************
194  !C for couple analysis
195  call fstr_solve_dynamic_nlimplicit_couple_pre(hecmesh, hecmat, fstrsolid, &
196  & fstrparam, fstrdynamic, fstrcpl, restrt_step_num, pi, i)
197 
198  do j = 1 ,nn*hecmat%NP
199  hecmat%D(j) = c1* hecmat%D(j)
200  enddo
201  do j = 1 ,nn*hecmat%NPU
202  hecmat%AU(j) = c1* hecmat%AU(j)
203  enddo
204  do j = 1 ,nn*hecmat%NPL
205  hecmat%AL(j) = c1*hecmat%AL(j)
206  enddo
207  do j=1,nnod
208  do kk=1,ndof
209  idm = nn*(j-1)+1 + (ndof+1)*(kk-1)
210  imm = ndof*(j-1) + kk
211  hecmat%D(idm) = hecmat%D(idm) + c2*fstreig%mass(imm)
212  enddo
213  enddo
214 
215  !C-- geometrical boundary condition
216  call dynamic_mat_ass_bc (hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam, heclagmat, iter)
217  call dynamic_mat_ass_bc_vl(hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam, heclagmat, iter)
218  call dynamic_mat_ass_bc_ac(hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam, heclagmat, iter)
219  call hecmw_mpc_mat_ass(hecmesh, hecmat, hecmeshmpc, hecmatmpc)
220  call hecmw_mpc_trans_rhs(hecmesh, hecmat, hecmatmpc)
221 
222  !C-- RHS LOAD VECTOR CHECK
223  numnp=hecmatmpc%NP
224  call hecmw_innerproduct_r(hecmesh, ndof, hecmatmpc%B, hecmatmpc%B, bsize)
225 
226  if(iter == 1)then
227  resb = bsize
228  endif
229 
230  !res = dsqrt(bsize)/n_node_global
231  res = dsqrt(bsize/resb)
232  if( fstrparam%nlgeom .and. ndof /= 4 ) then
233  if(hecmesh%my_rank==0) write(*,'(a,i5,a,1pe12.4)')"iter: ",iter,", res: ",res
234  if(hecmesh%my_rank==0) write(ista,'(''iter='',I5,''- Residual'',E15.7)')iter,res
235  if( res<fstrsolid%step_ctrl(cstep)%converg ) exit
236  endif
237 
238  !C-- linear solver [A]{X} = {B}
239  hecmatmpc%X = 0.0d0
240  if( iexit .ne. 1 ) then
241  if( fstrparam%nlgeom ) then
242  if( iter == 1 ) then
243  hecmatmpc%Iarray(97) = 2 !Force numerical factorization
244  else
245  hecmatmpc%Iarray(97) = 1 !Need numerical factorization
246  endif
247  call fstr_set_current_config_to_mesh(hecmeshmpc,fstrsolid,coord)
248  endif
249  call solve_lineq(hecmeshmpc,hecmatmpc)
250  if( fstrparam%nlgeom ) then
251  call fstr_recover_initial_config_to_mesh(hecmeshmpc,fstrsolid,coord)
252  endif
253  endif
254  call hecmw_mpc_tback_sol(hecmesh, hecmat, hecmatmpc)
255 
256  do j=1,hecmesh%n_node*ndof
257  fstrsolid%dunode(j) = fstrsolid%dunode(j)+hecmat%X(j)
258  enddo
259  ! ----- update the strain, stress, and internal force
260  call fstr_updatenewton( hecmesh, hecmat, fstrsolid, fstrdynamic%t_curr, &
261  & fstrdynamic%t_delta, iter, fstrdynamic%strainEnergy )
262 
263  if(.not. fstrparam%nlgeom) exit
264  if(ndof == 4) exit
265  enddo
266 
267  ! ----- not convergence
268  if( iter>fstrsolid%step_ctrl(cstep)%max_iter ) then
269  if( hecmesh%my_rank==0) then
270  write(ilog,*) '### Fail to Converge : at step=', i
271  write(ista,*) '### Fail to Converge : at step=', i
272  write( *,*) ' ### Fail to Converge : at step=', i
273  endif
274  stop
275  endif
276 
277  !C *****************************************************
278  !C for couple analysis
279  call fstr_solve_dynamic_nlimplicit_couple_post(hecmesh, hecmat, fstrsolid, &
280  & fstrparam, fstrdynamic, fstrcpl, a1, a2, a3, b1, b2, b3, i, is_cycle)
281  if(is_cycle) cycle
282  exit
283  enddo
284  !C *****************************************************
285 
286  !C-- new displacement, velocity and acceleration
287  fstrdynamic%kineticEnergy = 0.0d0
288  do j = 1 ,ndof*nnod
289  fstrdynamic%ACC (j,2) = -a1*fstrdynamic%ACC(j,1) - a2*fstrdynamic%VEL(j,1) + &
290  a3*fstrsolid%dunode(j)
291  fstrdynamic%VEL (j,2) = -b1*fstrdynamic%ACC(j,1) - b2*fstrdynamic%VEL(j,1) + &
292  b3*fstrsolid%dunode(j)
293  fstrdynamic%ACC (j,1) = fstrdynamic%ACC (j,2)
294  fstrdynamic%VEL (j,1) = fstrdynamic%VEL (j,2)
295 
296  fstrsolid%unode(j) = fstrsolid%unode(j)+fstrsolid%dunode(j)
297  fstrdynamic%DISP(j,2) = fstrsolid%unode(j)
298 
299  fstrdynamic%kineticEnergy = fstrdynamic%kineticEnergy + &
300  0.5d0*fstreig%mass(j)*fstrdynamic%VEL(j,2)*fstrdynamic%VEL(j,2)
301  enddo
302 
303  !C-- output new displacement, velocity and acceleration
304  call fstr_dynamic_output(hecmesh, fstrsolid, fstrdynamic, fstrparam)
305 
306  !C-- output result of monitoring node
307  call dynamic_output_monit(hecmesh, fstrparam, fstrdynamic, fstreig, fstrsolid)
308  call fstr_updatestate( hecmesh, fstrsolid, fstrdynamic%t_delta )
309 
310  !--- Restart info
311  if( fstrdynamic%restart_nout > 0 ) then
312  if( mod(i,fstrdynamic%restart_nout).eq.0 .or. i.eq.fstrdynamic%n_step) then
313  call fstr_write_restart_dyna_nl(i,hecmesh,fstrsolid,fstrdynamic,fstrparam)
314  endif
315  endif
316 
317  enddo
318  !C-- end of time step loop
319  time_2 = hecmw_wtime()
320 
321  if( hecmesh%my_rank == 0 ) then
322  write(ista,'(a,f10.2,a)') ' solve (sec) :', time_2 - time_1, 's'
323  endif
324 
325  deallocate(coord)
326  call hecmw_mpc_mat_finalize(hecmesh, hecmat, hecmeshmpc, hecmatmpc)
327  if (associated(hecmat0)) then
328  call hecmw_mat_finalize(hecmat0)
329  deallocate(hecmat0)
330  endif
331  end subroutine fstr_solve_dynamic_nlimplicit
332 
335  subroutine fstr_solve_dynamic_nlimplicit_contactslag(cstep, hecMESH,hecMAT,fstrSOLID,fstrEIG &
336  ,fstrDYNAMIC,fstrRESULT,fstrPARAM &
337  ,fstrCPL,hecLagMAT,restrt_step_num,infoCTChange &
338  ,conMAT )
339  implicit none
340  !C-- global variable
341  integer, intent(in) :: cstep
342  type(hecmwst_local_mesh) :: hecMESH
343  type(hecmwst_matrix) :: hecMAT
344  type(hecmwst_matrix), pointer :: hecMAT0
345  type(fstr_eigen) :: fstrEIG
346  type(fstr_solid) :: fstrSOLID
347  type(hecmwst_result_data) :: fstrRESULT
348  type(fstr_param) :: fstrPARAM
349  type(fstr_dynamic) :: fstrDYNAMIC
350  type(fstr_couple) :: fstrCPL !for COUPLE
351  type(hecmwst_matrix_lagrange) :: hecLagMAT
352  type(fstr_info_contactchange) :: infoCTChange
353  type(hecmwst_matrix) :: conMAT
354 
355  !C-- local variable
356  integer(kind=kint) :: nnod, ndof, numnp, nn
357  integer(kind=kint) :: i, j, ids, ide, ims, ime, kk, idm, imm
358  integer(kind=kint) :: iter
359  real(kind=kreal) :: a1, a2, a3, b1, b2, b3, c1, c2
360  real(kind=kreal) :: bsize, res, res1, rf
361  real(kind=kreal) :: res0, relres
362  real :: time_1, time_2
363  real(kind=kreal), parameter :: pi = 3.14159265358979323846d0
364 
365  integer(kind=kint) :: restrt_step_num
366  integer(kind=kint) :: ctAlgo
367  integer(kind=kint) :: max_iter_contact, count_step
368  integer(kind=kint) :: stepcnt
369  real(kind=kreal) :: maxdlag, converg_dlag
370 
371  integer(kind=kint) :: n_node_global
372  integer(kind=kint) :: contact_changed_global
373  integer(kind=kint) :: nndof,npdof
374  logical :: is_mat_symmetric
375  integer :: istat
376  logical :: is_cycle
377  real(kind=kreal),allocatable :: tmp_conb(:)
378  real(kind=kreal), allocatable :: coord(:)
379 
380  nullify(hecmat0)
381 
382  ! sum of n_node among all subdomains (to be used to calc res)
383  n_node_global = hecmesh%nn_internal
384  call hecmw_allreduce_i1(hecmesh,n_node_global,hecmw_sum)
385 
386  ctalgo = fstrparam%contact_algo
387 
388  if( hecmat%Iarray(99)==4 .and. .not.fstr_is_matrixstruct_symmetric(fstrsolid,hecmesh) ) then
389  write(*,*) ' This type of direct solver is not yet available in such case ! '
390  write(*,*) ' Please use intel MKL direct solver !'
391  call hecmw_abort(hecmw_comm_get_comm())
392  endif
393 
394  hecmat%NDOF=hecmesh%n_dof
395 
396  nnod=hecmesh%n_node
397  ndof=hecmat%NDOF
398  nn=ndof*ndof
399 
400  allocate(coord(hecmesh%n_node*ndof))
401  if( associated( fstrsolid%contacts ) ) call initialize_contact_output_vectors(fstrsolid,hecmat)
402 
403  !!-- initial value
404  time_1 = hecmw_wtime()
405 
406  !C-- check parameters
407  if(dabs(fstrdynamic%beta) < 1.0e-20) then
408  if( hecmesh%my_rank == 0 ) then
409  write(imsg,*) 'stop due to Newmark-beta = 0'
410  endif
411  call hecmw_abort( hecmw_comm_get_comm())
412  endif
413 
414  !C-- matrix [M] lumped mass matrix
415  if(fstrdynamic%idx_mas == 1) then
416  call setmass(fstrsolid,hecmesh,hecmat,fstreig)
417 
418  !C-- consistent mass matrix
419  else if(fstrdynamic%idx_mas == 2) then
420  if( hecmesh%my_rank .eq. 0 ) then
421  write(imsg,*) 'stop: consistent mass matrix is not yet available !'
422  endif
423  call hecmw_abort( hecmw_comm_get_comm())
424  endif
425 
426  hecmat%Iarray(98) = 1 !Assembly complete
427  hecmat%Iarray(97) = 1 !Need numerical factorization
428 
429  !C-- initialize variables
430  if( restrt_step_num == 1 .and. fstrdynamic%VarInitialize .and. fstrdynamic%ray_m /= 0.0d0 ) &
431  call dynamic_init_varibles( hecmesh, hecmat, fstrsolid, fstreig, fstrdynamic, fstrparam )
432 
433  !C-- time step loop
434  a1 = .5d0/fstrdynamic%beta - 1.d0
435  a2 = 1.d0/(fstrdynamic%beta*fstrdynamic%t_delta)
436  a3 = 1.d0/(fstrdynamic%beta*fstrdynamic%t_delta*fstrdynamic%t_delta)
437  b1 = ( .5d0*fstrdynamic%gamma/fstrdynamic%beta - 1.d0 )*fstrdynamic%t_delta
438  b2 = fstrdynamic%gamma/fstrdynamic%beta - 1.d0
439  b3 = fstrdynamic%gamma/(fstrdynamic%beta*fstrdynamic%t_delta)
440  c1 = 1.d0 + fstrdynamic%ray_k*b3
441  c2 = a3 + fstrdynamic%ray_m*b3
442 
443  !C-- output of initial state
444  if( restrt_step_num == 1 ) then
445  call fstr_dynamic_output(hecmesh, fstrsolid, fstrdynamic, fstrparam)
446  call dynamic_output_monit(hecmesh, fstrparam, fstrdynamic, fstreig, fstrsolid)
447  endif
448 
449  fstrdynamic%VEC3(:) =0.d0
450  hecmat%X(:) =0.d0
451 
453  call fstr_scan_contact_state(cstep, restrt_step_num, 0, fstrdynamic%t_delta, ctalgo, hecmesh, fstrsolid, infoctchange, hecmat%B)
454 
455  call hecmw_mat_copy_profile( hecmat, conmat )
456 
457  if ( fstr_is_contact_active() ) then
458  call fstr_mat_con_contact( cstep, ctalgo, hecmat, fstrsolid, heclagmat, infoctchange, conmat, fstr_is_contact_active())
459  elseif( hecmat%Iarray(99)==4 ) then
460  write(*,*) ' This type of direct solver is not yet available in such case ! '
461  write(*,*) ' Please change solver type to intel MKL direct solver !'
462  call hecmw_abort(hecmw_comm_get_comm())
463  endif
464  is_mat_symmetric = fstr_is_matrixstruct_symmetric(fstrsolid,hecmesh)
465  call solve_lineq_contact_init(hecmesh,hecmat,heclagmat,is_mat_symmetric)
466 
467  max_iter_contact = fstrsolid%step_ctrl(cstep)%max_contiter
468  converg_dlag = fstrsolid%step_ctrl(cstep)%converg_lag
469 
470  !! step = 1,2,....,fstrDYNAMIC%n_step
471  do i = restrt_step_num, fstrdynamic%n_step
472 
473  fstrdynamic%i_step = i
474  fstrdynamic%t_curr = fstrdynamic%t_delta * i
475 
476  if(hecmesh%my_rank==0) then
477  write(ista,'('' time step='',i10,'' time='',1pe13.4e3)') i,fstrdynamic%t_curr
478  write(*,'(A)')'-------------------------------------------------'
479  write(*,'('' time step='',i10,'' time='',1pe13.4e3)') i,fstrdynamic%t_curr
480  endif
481 
482  do j = 1 ,ndof*nnod
483  fstrdynamic%VEC1(j) = a1*fstrdynamic%ACC(j,1) + a2*fstrdynamic%VEL(j,1)
484  fstrdynamic%VEC2(j) = b1*fstrdynamic%ACC(j,1) + b2*fstrdynamic%VEL(j,1)
485  enddo
486 
487  count_step = 0
488  stepcnt = 0
489 
490  !C for couple analysis
491  do
492  fstrsolid%dunode(:) =0.d0
493  ! call fstr_UpdateEPState( hecMESH, fstrSOLID )
494  call fstr_solve_dynamic_nlimplicit_couple_init(fstrparam, fstrcpl)
495 
496  loopforcontactanalysis: do while( .true. )
497  count_step = count_step + 1
498 
499  ! ----- Inner Iteration
500  res0 = 0.d0
501  res1 = 0.d0
502  relres = 1.d0
503 
504  do iter = 1, fstrsolid%step_ctrl(cstep)%max_iter
505  stepcnt=stepcnt+1
506  if (fstrparam%nlgeom) then
507  call fstr_stiffmatrix( hecmesh, hecmat, fstrsolid, fstrdynamic%t_curr, fstrdynamic%t_delta )
508  else
509  if (.not. associated(hecmat0)) then
510  call fstr_stiffmatrix( hecmesh, hecmat, fstrsolid, fstrdynamic%t_curr, fstrdynamic%t_delta )
511  allocate(hecmat0)
512  call hecmw_mat_init(hecmat0)
513  call hecmw_mat_copy_profile(hecmat, hecmat0)
514  call hecmw_mat_copy_val(hecmat, hecmat0)
515  else
516  call hecmw_mat_copy_val(hecmat0, hecmat)
517  endif
518  endif
519 
520  if( fstrdynamic%ray_k/=0.d0 .or. fstrdynamic%ray_m/=0.d0 ) then
521  do j = 1 ,ndof*nnod
522  hecmat%X(j) = fstrdynamic%VEC2(j) - b3*fstrsolid%dunode(j)
523  enddo
524  endif
525  if( fstrdynamic%ray_k/=0.d0 ) then
526  if( hecmesh%n_dof == 3 ) then
527  call hecmw_matvec (hecmesh, hecmat, hecmat%X, fstrdynamic%VEC3)
528  else if( hecmesh%n_dof == 2 ) then
529  call hecmw_matvec (hecmesh, hecmat, hecmat%X, fstrdynamic%VEC3)
530  else if( hecmesh%n_dof == 6 ) then
531  call matvec(fstrdynamic%VEC3, hecmat%X, hecmat, ndof, hecmat%D, hecmat%AU, hecmat%AL)
532  endif
533  endif
534 
535  !C-- mechanical boundary condition
536  call dynamic_mat_ass_load (hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam)
537  do j=1, hecmesh%n_node* hecmesh%n_dof
538  hecmat%B(j)=hecmat%B(j)- fstrsolid%QFORCE(j) + fstreig%mass(j)*( fstrdynamic%VEC1(j)-a3*fstrsolid%dunode(j) &
539  + fstrdynamic%ray_m* hecmat%X(j) ) + fstrdynamic%ray_k*fstrdynamic%VEC3(j)
540  enddo
541 
542  !C for couple analysis
543  call fstr_solve_dynamic_nlimplicit_couple_pre(hecmesh, hecmat, fstrsolid, &
544  & fstrparam, fstrdynamic, fstrcpl, restrt_step_num, pi, i)
545 
546  do j = 1 ,nn*hecmat%NP
547  hecmat%D(j) = c1* hecmat%D(j)
548  enddo
549  do j = 1 ,nn*hecmat%NPU
550  hecmat%AU(j) = c1* hecmat%AU(j)
551  enddo
552  do j = 1 ,nn*hecmat%NPL
553  hecmat%AL(j) = c1*hecmat%AL(j)
554  enddo
555  do j=1,nnod
556  do kk=1,ndof
557  idm = nn*(j-1)+1 + (ndof+1)*(kk-1)
558  imm = ndof*(j-1) + kk
559  hecmat%D(idm) = hecmat%D(idm) + c2*fstreig%mass(imm)
560  enddo
561  enddo
562 
563  call hecmw_mat_clear( conmat )
564  call hecmw_mat_clear_b( conmat )
565  conmat%X = 0.0d0
566 
567  if( fstr_is_contact_active() ) then
568  call fstr_update_ndforce_contact(cstep,hecmesh,hecmat,heclagmat,fstrsolid,conmat)
569  call fstr_addcontactstiffness(cstep,iter,conmat,heclagmat,fstrsolid)
570  endif
571 
572  !C-- geometrical boundary condition
573  call dynamic_mat_ass_bc (hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam, heclagmat, stepcnt, conmat=conmat)
574  call dynamic_mat_ass_bc_vl(hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam, heclagmat, stepcnt, conmat=conmat)
575  call dynamic_mat_ass_bc_ac(hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam, heclagmat, stepcnt, conmat=conmat)
576 
577  ! ----- check convergence
578  res = fstr_get_norm_para_contact(hecmat,heclagmat,conmat,hecmesh)
579 
580  if(iter == 1)then
581  res0 = res
582  endif
583 
584  ! ----- check convergence
585  if( .not.fstr_is_contact_active() ) then
586  maxdlag = 0.0d0
587  elseif( maxdlag == 0.0d0) then
588  maxdlag = 1.0d0
589  endif
590  call hecmw_allreduce_r1(hecmesh, maxdlag, hecmw_max)
591 
592  res = dsqrt(res/res0)
593  if( hecmesh%my_rank==0 ) then
594  if(hecmesh%my_rank==0) write(*,'(a,i5,a,1pe12.4)')"iter: ",iter,", res: ",res
595  if(hecmesh%my_rank==0) write(ista,'(''iter='',I5,''- Residual'',E15.7)')iter,res
596  write(*,'(a,1e15.7)') ' - MaxDLag =',maxdlag
597  write(ista,'(a,1e15.7)') ' - MaxDLag =',maxdlag
598  endif
599  if( res<fstrsolid%step_ctrl(cstep)%converg .and. maxdlag < converg_dlag ) exit
600 
601  ! ---- For Parallel Contact with Multi-Partition Domains
602  hecmat%X = 0.0d0
603  call fstr_set_current_config_to_mesh(hecmesh,fstrsolid,coord)
604  call solve_lineq_contact(hecmesh,hecmat,heclagmat,conmat,istat,1.0d0,fstr_is_contact_active())
605  call fstr_recover_initial_config_to_mesh(hecmesh,fstrsolid,coord)
606 
607  ! ----- update external nodal displacement increments
608  call hecmw_update_r (hecmesh, hecmat%X, hecmat%NP, hecmat%NDOF)
609 
610  ! ----- update the strain, stress, and internal force
611  do j=1,hecmesh%n_node*ndof
612  fstrsolid%dunode(j) = fstrsolid%dunode(j)+hecmat%X(j)
613  enddo
614  call fstr_updatenewton( hecmesh, hecmat, fstrsolid, fstrdynamic%t_curr, &
615  & fstrdynamic%t_delta,iter, fstrdynamic%strainEnergy )
616 
617  if(.not. fstrparam%nlgeom) exit
618 
619  ! ----- update the Lagrange multipliers
620  if( fstr_is_contact_active() ) then
621  maxdlag = 0.0d0
622  do j=1,heclagmat%num_lagrange
623  heclagmat%lagrange(j) = heclagmat%lagrange(j) + hecmat%X(hecmesh%n_node*ndof+j)
624  if(dabs(hecmat%X(hecmesh%n_node*ndof+j))>maxdlag) maxdlag=dabs(hecmat%X(hecmesh%n_node*ndof+j))
625  ! write(*,*)'Lagrange:', j,hecLagMAT%lagrange(j),hecMAT%X(hecMESH%n_node*ndof+j)
626  enddo
627  endif
628  enddo
629 
630  ! ----- not convergence
631  if( iter>fstrsolid%step_ctrl(cstep)%max_iter ) then
632  if( hecmesh%my_rank==0) then
633  write(ilog,*) '### Fail to Converge : at step=', i
634  write(ista,*) '### Fail to Converge : at step=', i
635  write( *,*) ' ### Fail to Converge : at step=', i
636  endif
637  stop
638  endif
639 
640  call fstr_scan_contact_state(cstep, i, count_step, fstrdynamic%t_delta, ctalgo, hecmesh, fstrsolid, infoctchange, hecmat%B)
641 
642  if( hecmat%Iarray(99)==4 .and. .not. fstr_is_contact_active() ) then
643  write(*,*) ' This type of direct solver is not yet available in such case ! '
644  write(*,*) ' Please use intel MKL direct solver !'
645  call hecmw_abort(hecmw_comm_get_comm())
646  endif
647 
648  is_mat_symmetric = fstr_is_matrixstruct_symmetric(fstrsolid,hecmesh)
649  contact_changed_global=0
650  if( fstr_is_contact_conv(ctalgo,infoctchange,hecmesh) ) then
651  exit loopforcontactanalysis
652  elseif( fstr_is_matrixstructure_changed(infoctchange) ) then
653  call fstr_mat_con_contact( cstep, ctalgo, hecmat, fstrsolid, heclagmat, infoctchange, conmat, fstr_is_contact_active())
654  contact_changed_global=1
655  endif
656  call hecmw_allreduce_i1(hecmesh,contact_changed_global,hecmw_max)
657  if (contact_changed_global > 0) then
658  call hecmw_mat_clear_b( hecmat )
659  call hecmw_mat_clear_b( conmat )
660  call solve_lineq_contact_init(hecmesh,hecmat,heclagmat,is_mat_symmetric)
661  endif
662 
663  if( count_step > max_iter_contact ) exit loopforcontactanalysis
664 
665  enddo loopforcontactanalysis
666 
667  !C for couple analysis
668  call fstr_solve_dynamic_nlimplicit_couple_post(hecmesh, hecmat, fstrsolid, &
669  & fstrparam, fstrdynamic, fstrcpl, a1, a2, a3, b1, b2, b3, i, is_cycle)
670  if(is_cycle) cycle
671  exit
672  enddo
673 
674  !C-- new displacement, velocity and acceleration
675  fstrdynamic%kineticEnergy = 0.0d0
676  do j = 1 ,ndof*nnod
677  fstrdynamic%ACC (j,2) = -a1*fstrdynamic%ACC(j,1) - a2*fstrdynamic%VEL(j,1) + &
678  a3*fstrsolid%dunode(j)
679  fstrdynamic%VEL (j,2) = -b1*fstrdynamic%ACC(j,1) - b2*fstrdynamic%VEL(j,1) + &
680  b3*fstrsolid%dunode(j)
681  fstrdynamic%ACC (j,1) = fstrdynamic%ACC (j,2)
682  fstrdynamic%VEL (j,1) = fstrdynamic%VEL (j,2)
683 
684  fstrsolid%unode(j) = fstrsolid%unode(j)+fstrsolid%dunode(j)
685  fstrdynamic%DISP(j,2) = fstrsolid%unode(j)
686 
687  fstrdynamic%kineticEnergy = fstrdynamic%kineticEnergy + &
688  0.5d0*fstreig%mass(j)*fstrdynamic%VEL(j,2)*fstrdynamic%VEL(j,2)
689  enddo
690 
691  !C-- output new displacement, velocity and acceleration
692  call fstr_dynamic_output(hecmesh, fstrsolid, fstrdynamic, fstrparam)
693 
694  !C-- output result of monitoring node
695  call dynamic_output_monit(hecmesh, fstrparam, fstrdynamic, fstreig, fstrsolid)
696 
697  call fstr_updatestate( hecmesh, fstrsolid, fstrdynamic%t_delta )
698 
699  !--- Restart info
700  if( fstrdynamic%restart_nout > 0 ) then
701  if( mod(i,fstrdynamic%restart_nout).eq.0 .or. i.eq.fstrdynamic%n_step ) then
702  call fstr_write_restart_dyna_nl(i,hecmesh,fstrsolid,fstrdynamic,fstrparam,&
703  infoctchange%contactNode_current)
704  endif
705  endif
706 
707  enddo
708  !C-- end of time step loop
709 
710  if (associated(hecmat0)) then
711  call hecmw_mat_finalize(hecmat0)
712  deallocate(hecmat0)
713  endif
714 
715  time_2 = hecmw_wtime()
716  if( hecmesh%my_rank == 0 ) then
717  write(ista,'(a,f10.2,a)') ' solve (sec) :', time_2 - time_1, 's'
718  endif
719 
720  deallocate(coord)
722 
723  subroutine fstr_solve_dynamic_nlimplicit_couple_init(fstrPARAM, fstrCPL)
724  implicit none
725  type(fstr_param) :: fstrparam
726  type(fstr_couple) :: fstrCPL
727  if( fstrparam%fg_couple == 1) then
728  if( fstrparam%fg_couple_type==1 .or. &
729  fstrparam%fg_couple_type==3 .or. &
730  fstrparam%fg_couple_type==5 ) call fstr_rcap_get( fstrcpl )
731  endif
733 
734  subroutine fstr_solve_dynamic_nlimplicit_couple_pre(hecMESH, hecMAT, fstrSOLID, &
735  & fstrPARAM, fstrDYNAMIC, fstrCPL, restrt_step_num, PI, i)
736  implicit none
737  type(hecmwst_local_mesh) :: hecMESH
738  type(hecmwst_matrix) :: hecMAT
739  type(fstr_solid) :: fstrSOLID
740  type(fstr_param) :: fstrPARAM
741  type(fstr_dynamic) :: fstrDYNAMIC
742  type(fstr_couple) :: fstrCPL
743  integer(kint) :: kkk0, kkk1, j, kk, i, restrt_step_num
744  real(kreal) :: bsize, PI
745 
746  if( fstrparam%fg_couple == 1) then
747  if( fstrparam%fg_couple_first /= 0 ) then
748  bsize = dfloat( i ) / dfloat( fstrparam%fg_couple_first )
749  if( bsize > 1.0 ) bsize = 1.0
750  do kkk0 = 1, fstrcpl%coupled_node_n
751  kkk1 = 3 * kkk0
752  fstrcpl%trac(kkk1-2) = bsize * fstrcpl%trac(kkk1-2)
753  fstrcpl%trac(kkk1-1) = bsize * fstrcpl%trac(kkk1-1)
754  fstrcpl%trac(kkk1 ) = bsize * fstrcpl%trac(kkk1 )
755  enddo
756  endif
757  if( fstrparam%fg_couple_window > 0 ) then
758  j = i - restrt_step_num + 1
759  kk = fstrdynamic%n_step - restrt_step_num + 1
760  bsize = 0.5*(1.0-cos(2.0*pi*dfloat(j)/dfloat(kk)))
761  do kkk0 = 1, fstrcpl%coupled_node_n
762  kkk1 = 3 * kkk0
763  fstrcpl%trac(kkk1-2) = bsize * fstrcpl%trac(kkk1-2)
764  fstrcpl%trac(kkk1-1) = bsize * fstrcpl%trac(kkk1-1)
765  fstrcpl%trac(kkk1 ) = bsize * fstrcpl%trac(kkk1 )
766  enddo
767  endif
768  call dynamic_mat_ass_couple( hecmesh, hecmat, fstrsolid, fstrcpl )
769  endif
771 
772  subroutine fstr_solve_dynamic_nlimplicit_couple_post(hecMESH, hecMAT, fstrSOLID, &
773  & fstrPARAM, fstrDYNAMIC, fstrCPL, a1, a2, a3, b1, b2, b3, i, is_cycle)
774  implicit none
775  type(hecmwst_local_mesh) :: hecMESH
776  type(hecmwst_matrix) :: hecMAT
777  type(fstr_solid) :: fstrSOLID
778  type(fstr_param) :: fstrPARAM
779  type(fstr_dynamic) :: fstrDYNAMIC
780  type(fstr_couple) :: fstrCPL
781  integer(kint) :: kkk0, kkk1, j, i, revocap_flag
782  real(kreal) :: bsize, a1, a2, a3, b1, b2, b3
783  logical :: is_cycle
784 
785  is_cycle = .false.
786 
787  if( fstrparam%fg_couple == 1 ) then
788  if( fstrparam%fg_couple_type>1 ) then
789  do j=1, fstrcpl%coupled_node_n
790  if( fstrcpl%dof == 3 ) then
791  kkk0 = j*3
792  kkk1 = fstrcpl%coupled_node(j)*3
793 
794  fstrcpl%disp (kkk0-2) = fstrsolid%unode(kkk1-2) + fstrsolid%dunode(kkk1-2)
795  fstrcpl%disp (kkk0-1) = fstrsolid%unode(kkk1-1) + fstrsolid%dunode(kkk1-1)
796  fstrcpl%disp (kkk0 ) = fstrsolid%unode(kkk1 ) + fstrsolid%dunode(kkk1 )
797 
798  fstrcpl%velo (kkk0-2) = -b1*fstrdynamic%ACC(kkk1-2,1) - b2*fstrdynamic%VEL(kkk1-2,1) + &
799  b3*fstrsolid%dunode(kkk1-2)
800  fstrcpl%velo (kkk0-1) = -b1*fstrdynamic%ACC(kkk1-1,1) - b2*fstrdynamic%VEL(kkk1-1,1) + &
801  b3*fstrsolid%dunode(kkk1-1)
802  fstrcpl%velo (kkk0 ) = -b1*fstrdynamic%ACC(kkk1,1) - b2*fstrdynamic%VEL(kkk1,1) + &
803  b3*fstrsolid%dunode(kkk1)
804  fstrcpl%accel(kkk0-2) = -a1*fstrdynamic%ACC(kkk1-2,1) - a2*fstrdynamic%VEL(kkk1-2,1) + &
805  a3*fstrsolid%dunode(kkk1-2)
806  fstrcpl%accel(kkk0-1) = -a1*fstrdynamic%ACC(kkk1-1,1) - a2*fstrdynamic%VEL(kkk1-1,1) + &
807  a3*fstrsolid%dunode(kkk1-1)
808  fstrcpl%accel(kkk0 ) = -a1*fstrdynamic%ACC(kkk1,1) - a2*fstrdynamic%VEL(kkk1,1) + &
809  a3*fstrsolid%dunode(kkk1)
810  else
811  kkk0 = j*2
812  kkk1 = fstrcpl%coupled_node(j)*2
813 
814  fstrcpl%disp (kkk0-1) = fstrsolid%unode(kkk1-1) + fstrsolid%dunode(kkk1-1)
815  fstrcpl%disp (kkk0 ) = fstrsolid%unode(kkk1 ) + fstrsolid%dunode(kkk1 )
816 
817  fstrcpl%velo (kkk0-1) = -b1*fstrdynamic%ACC(kkk1-1,1) - b2*fstrdynamic%VEL(kkk1-1,1) + &
818  b3*fstrsolid%dunode(kkk1-1)
819  fstrcpl%velo (kkk0 ) = -b1*fstrdynamic%ACC(kkk1,1) - b2*fstrdynamic%VEL(kkk1,1) + &
820  b3*fstrsolid%dunode(kkk1)
821  fstrcpl%accel(kkk0-1) = -a1*fstrdynamic%ACC(kkk1-1,1) - a2*fstrdynamic%VEL(kkk1-1,1) + &
822  a3*fstrsolid%dunode(kkk1-1)
823  fstrcpl%accel(kkk0 ) = -a1*fstrdynamic%ACC(kkk1,1) - a2*fstrdynamic%VEL(kkk1,1) + &
824  a3*fstrsolid%dunode(kkk1)
825  endif
826  enddo
827  call fstr_rcap_send( fstrcpl )
828  endif
829 
830  select case ( fstrparam%fg_couple_type )
831  case (4)
832  call fstr_rcap_get( fstrcpl )
833  case (5)
834  call fstr_get_convergence( revocap_flag )
835  if( revocap_flag==0 ) is_cycle = .true.
836  case (6)
837  call fstr_get_convergence( revocap_flag )
838  if( revocap_flag==0 ) then
839  call fstr_rcap_get( fstrcpl )
840  is_cycle = .true.
841  else
842  if( i /= fstrdynamic%n_step ) call fstr_rcap_get( fstrcpl )
843  endif
844  end select
845  endif
847 
848 end module fstr_dynamic_nlimplicit
This module contains subroutines for nonlinear implicit dynamic analysis.
subroutine fstr_solve_dynamic_nlimplicit_couple_init(fstrPARAM, fstrCPL)
subroutine fstr_solve_dynamic_nlimplicit_couple_post(hecMESH, hecMAT, fstrSOLID, fstrPARAM, fstrDYNAMIC, fstrCPL, a1, a2, a3, b1, b2, b3, i, is_cycle)
subroutine fstr_solve_dynamic_nlimplicit(cstep, hecMESH, hecMAT, fstrSOLID, fstrEIG, fstrDYNAMIC, fstrRESULT, fstrPARAM, fstrCPL, restrt_step_num)
This subroutine provides function of nonlinear implicit dynamic analysis using the Newmark method.
subroutine fstr_solve_dynamic_nlimplicit_couple_pre(hecMESH, hecMAT, fstrSOLID, fstrPARAM, fstrDYNAMIC, fstrCPL, restrt_step_num, PI, i)
subroutine fstr_solve_dynamic_nlimplicit_contactslag(cstep, hecMESH, hecMAT, fstrSOLID, fstrEIG, fstrDYNAMIC, fstrRESULT, fstrPARAM, fstrCPL, hecLagMAT, restrt_step_num, infoCTChange, conMAT)
This subroutine provides function of nonlinear implicit dynamic analysis using the Newmark method....
This module provides functions of reconstructing.
subroutine, public fstr_mat_con_contact(cstep, contact_algo, hecMAT, fstrSOLID, hecLagMAT, infoCTChange, conMAT, is_contact_active)
this subroutine reconstructs node-based (stiffness) matrix structure \corresponding to contact state
subroutine, public fstr_save_originalmatrixstructure(hecMAT)
This subroutine saves original matrix structure constructed originally by hecMW_matrix.
logical function, public fstr_is_matrixstruct_symmetric(fstrSOLID, hecMESH)
this function judges whether sitiffness matrix is symmetric or not
This module provides functions: 1) obtain contact stiffness matrix of each contact pair and assemble ...
subroutine, public fstr_update_ndforce_contact(cstep, hecMESH, hecMAT, hecLagMAT, fstrSOLID, conMAT)
This subroutine obtains contact nodal force vector of each contact pair and assembles it into right-h...
subroutine, public fstr_addcontactstiffness(cstep, iter, hecMAT, hecLagMAT, fstrSOLID)
This subroutine obtains contact stiffness matrix of each contact pair and assembles it into global st...
This module provides functions to initialize variables when initial velocity or acceleration boundary...
subroutine dynamic_init_varibles(hecMESH, hecMAT, fstrSOLID, fstrEIG, fstrDYNAMIC, fstrPARAM)
This module contains functions to set acceleration boundary condition in dynamic analysis.
subroutine dynamic_mat_ass_bc_ac(hecMESH, hecMAT, fstrSOLID, fstrDYNAMIC, fstrPARAM, hecLagMAT, iter, conMAT)
This subrouitne set acceleration boundary condition in dynamic analysis.
This module contains functions to set velocity boundary condition in dynamic analysis.
subroutine dynamic_mat_ass_bc_vl(hecMESH, hecMAT, fstrSOLID, fstrDYNAMIC, fstrPARAM, hecLagMAT, iter, conMAT)
This subrouitne set velocity boundary condition in dynamic analysis.
This module contains functions to set displacement boundary condition in dynamic analysis.
subroutine dynamic_mat_ass_bc(hecMESH, hecMAT, fstrSOLID, fstrDYNAMIC, fstrPARAM, hecLagMAT, iter, conMAT)
This subroutine setup disp bundary condition.
This module contains functions relates to coupling analysis.
subroutine dynamic_mat_ass_couple(hecMESH, hecMAT, fstrSOLID, fstrCPL)
This module contains function to set boundary condition of external load in dynamic analysis.
subroutine dynamic_mat_ass_load(hecMESH, hecMAT, fstrSOLID, fstrDYNAMIC, fstrPARAM, iter)
This function sets boundary condition of external load.
This module provides functions to output result.
subroutine dynamic_output_monit(hecMESH, fstrPARAM, fstrDYNAMIC, fstrEIG, fstrSOLID)
subroutine matvec(y, x, hecMAT, ndof, D, AU, AL)
subroutine fstr_dynamic_output(hecMESH, fstrSOLID, fstrDYNAMIC, fstrPARAM)
Output result.
Set up lumped mass matrix.
subroutine setmass(fstrSOLID, hecMESH, hecMAT, fstrEIG)
subroutine, public fstr_rcap_send(fstrCPL)
subroutine, public fstr_rcap_get(fstrCPL)
subroutine fstr_get_convergence(revocap_flag)
This module provides function to calculate residual of nodal force.
real(kind=kreal) function, public fstr_get_norm_para_contact(hecMAT, hecLagMAT, conMAT, hecMESH)
This module provides functions to read in and write out restart files.
Definition: fstr_Restart.f90:8
subroutine fstr_write_restart_dyna_nl(cstep, hecMESH, fstrSOLID, fstrDYNAMIC, fstrPARAM, contactNode)
write out restart file for nonlinear dynamic analysis
This module provides function to calculate tangent stiffness matrix.
subroutine, public fstr_stiffmatrix(hecMESH, hecMAT, fstrSOLID, time, tincr)
This subroutine creates tangential stiffness matrix.
This module provides function to calculate to do updates.
Definition: fstr_Update.f90:6
subroutine fstr_updatestate(hecMESH, fstrSOLID, tincr)
Update elastiplastic status.
subroutine fstr_updatenewton(hecMESH, hecMAT, fstrSOLID, time, tincr, iter, strainEnergy)
Update displacement, stress, strain and internal forces.
Definition: fstr_Update.f90:26
This module defines common data and basic structures for analysis.
Definition: m_fstr.f90:15
subroutine fstr_recover_initial_config_to_mesh(hecMESH, fstrSOLID, coord)
Definition: m_fstr.f90:1112
integer(kind=kint), parameter imsg
Definition: m_fstr.f90:110
integer(kind=kint), parameter ilog
FILE HANDLER.
Definition: m_fstr.f90:107
subroutine fstr_set_current_config_to_mesh(hecMESH, fstrSOLID, coord)
Definition: m_fstr.f90:1099
integer(kind=kint), parameter ista
Definition: m_fstr.f90:108
This module provides functions to solve sparse system of \linear equitions in the case of contact ana...
subroutine, public solve_lineq_contact_init(hecMESH, hecMAT, hecLagMAT, is_sym)
This subroutine.
subroutine, public solve_lineq_contact(hecMESH, hecMAT, hecLagMAT, conMAT, istat, rf, is_contact_active)
This subroutine.
This module provides functions to calculate contact stiff matrix.
Definition: fstr_contact.f90:6
logical function fstr_is_matrixstructure_changed(infoCTChange)
logical function fstr_is_contact_conv(ctAlgo, infoCTChange, hecMESH)
subroutine fstr_scan_contact_state(cstep, sub_step, cont_step, dt, ctAlgo, hecMESH, fstrSOLID, infoCTChange, B)
Scanning contact state.
subroutine initialize_contact_output_vectors(fstrSOLID, hecMAT)
logical function fstr_is_contact_active()
Data for coupling analysis.
Definition: m_fstr.f90:612
Data for DYNAMIC ANSLYSIS (fstrDYNAMIC)
Definition: m_fstr.f90:505
Package of data used by Lanczos eigenvalue solver.
Definition: m_fstr.f90:594
FSTR INNER CONTROL PARAMETERS (fstrPARAM)
Definition: m_fstr.f90:154