FrontISTR  5.7.0
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%ganma/fstrdynamic%beta - 1.0d0 )*fstrdynamic%t_delta
118  b2 = fstrdynamic%ganma/fstrdynamic%beta - 1.0d0
119  b3 = fstrdynamic%ganma/(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%ganma/fstrdynamic%beta - 1.d0 )*fstrdynamic%t_delta
438  b2 = fstrdynamic%ganma/fstrdynamic%beta - 1.d0
439  b3 = fstrdynamic%ganma/(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
m_addcontactstiffness
This module provides functions: 1) obtain contact stiffness matrix of each contact pair and assemble ...
Definition: fstr_AddContactStiff.f90:13
m_dynamic_mat_ass_bc::dynamic_mat_ass_bc
subroutine dynamic_mat_ass_bc(hecMESH, hecMAT, fstrSOLID, fstrDYNAMIC, fstrPARAM, hecLagMAT, iter, conMAT)
This subroutine setup disp bundary condition.
Definition: dynamic_mat_ass_bc.f90:14
mcontact::fstr_scan_contact_state
subroutine fstr_scan_contact_state(cstep, sub_step, cont_step, dt, ctAlgo, hecMESH, fstrSOLID, infoCTChange, B)
Scanning contact state.
Definition: fstr_contact.f90:212
m_fstr_rcap_io
Definition: fstr_rcap_io.F90:5
m_dynamic_mat_ass_couple::dynamic_mat_ass_couple
subroutine dynamic_mat_ass_couple(hecMESH, hecMAT, fstrSOLID, fstrCPL)
Definition: dynamic_mat_ass_couple.f90:17
m_fstr_rcap_io::fstr_get_convergence
subroutine fstr_get_convergence(revocap_flag)
Definition: fstr_rcap_io.F90:256
fstr_dynamic_nlimplicit::fstr_solve_dynamic_nlimplicit
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.
Definition: fstr_dynamic_nlimplicit.f90:35
m_dynamic_output
This module provides functions to output result.
Definition: dynamic_output.f90:6
m_dynamic_output::fstr_dynamic_output
subroutine fstr_dynamic_output(hecMESH, fstrSOLID, fstrDYNAMIC, fstrPARAM)
Output result.
Definition: dynamic_output.f90:13
m_dynamic_mat_ass_bc_vl::dynamic_mat_ass_bc_vl
subroutine dynamic_mat_ass_bc_vl(hecMESH, hecMAT, fstrSOLID, fstrDYNAMIC, fstrPARAM, hecLagMAT, iter, conMAT)
This subrouitne set velocity boundary condition in dynamic analysis.
Definition: dynamic_mat_ass_bc_vl.f90:14
m_fstr_eig_setmass::setmass
subroutine setmass(fstrSOLID, hecMESH, hecMAT, fstrEIG)
Definition: fstr_EIG_setMASS.f90:16
m_fstr_update
This module provides function to calculate to do updates.
Definition: fstr_Update.f90:6
m_fstr::fstr_eigen
Package of data used by Lanczos eigenvalue solver.
Definition: m_fstr.f90:593
m_solve_lineq_contact
This module provides functions to solve sparse system of \linear equitions in the case of contact ana...
Definition: hecmw_solver_contact.f90:9
fstr_dynamic_nlimplicit::fstr_solve_dynamic_nlimplicit_couple_post
subroutine fstr_solve_dynamic_nlimplicit_couple_post(hecMESH, hecMAT, fstrSOLID, fstrPARAM, fstrDYNAMIC, fstrCPL, a1, a2, a3, b1, b2, b3, i, is_cycle)
Definition: fstr_dynamic_nlimplicit.f90:774
m_fstr_stiffmatrix::fstr_stiffmatrix
subroutine, public fstr_stiffmatrix(hecMESH, hecMAT, fstrSOLID, time, tincr)
This subroutine creates tangential stiffness matrix.
Definition: fstr_StiffMatrix.f90:19
m_fstr::fstr_solid
Definition: m_fstr.f90:238
fstr_matrix_con_contact::fstr_is_matrixstruct_symmetric
logical function, public fstr_is_matrixstruct_symmetric(fstrSOLID, hecMESH)
this function judges whether sitiffness matrix is symmetric or not
Definition: fstr_mat_con_contact.f90:240
fstr_dynamic_nlimplicit
This module contains subroutines for nonlinear implicit dynamic analysis.
Definition: fstr_dynamic_nlimplicit.f90:7
m_fstr::fstr_dynamic
Data for DYNAMIC ANSLYSIS (fstrDYNAMIC)
Definition: m_fstr.f90:504
m_addcontactstiffness::fstr_update_ndforce_contact
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...
Definition: fstr_AddContactStiff.f90:257
m_fstr::fstr_param
FSTR INNER CONTROL PARAMETERS (fstrPARAM)
Definition: m_fstr.f90:154
m_fstr_residual
This module provides function to calculate residual of nodal force.
Definition: fstr_Residual.f90:7
m_dynamic_init_variables
This module provides functions to initialize variables when initial velocity or acceleration boundary...
Definition: dynamic_var_init.f90:9
m_dynamic_mat_ass_load::dynamic_mat_ass_load
subroutine dynamic_mat_ass_load(hecMESH, hecMAT, fstrSOLID, fstrDYNAMIC, fstrPARAM, iter)
This function sets boundary condition of external load.
Definition: dynamic_mat_ass_load.f90:16
mcontact::fstr_is_matrixstructure_changed
logical function fstr_is_matrixstructure_changed(infoCTChange)
Definition: fstr_contact.f90:82
m_dynamic_mat_ass_bc_vl
This module contains functions to set velocity boundary condition in dynamic analysis.
Definition: dynamic_mat_ass_bc_vl.f90:6
m_fstr_eig_setmass
Set up lumped mass matrix.
Definition: fstr_EIG_setMASS.f90:6
m_dynamic_output::dynamic_output_monit
subroutine dynamic_output_monit(hecMESH, fstrPARAM, fstrDYNAMIC, fstrEIG, fstrSOLID)
Definition: dynamic_output.f90:356
fstr_matrix_con_contact::fstr_save_originalmatrixstructure
subroutine, public fstr_save_originalmatrixstructure(hecMAT)
This subroutine saves original matrix structure constructed originally by hecMW_matrix.
Definition: fstr_mat_con_contact.f90:42
m_dynamic_mat_ass_couple
This module contains functions relates to coupling analysis.
Definition: dynamic_mat_ass_couple.f90:6
mcontact::fstr_is_contact_conv
logical function fstr_is_contact_conv(ctAlgo, infoCTChange, hecMESH)
Definition: fstr_contact.f90:61
m_fstr
This module defines common data and basic structures for analysis.
Definition: m_fstr.f90:15
mcontact::initialize_contact_output_vectors
subroutine initialize_contact_output_vectors(fstrSOLID, hecMAT)
Definition: fstr_contact.f90:565
m_dynamic_mat_ass_bc_ac::dynamic_mat_ass_bc_ac
subroutine dynamic_mat_ass_bc_ac(hecMESH, hecMAT, fstrSOLID, fstrDYNAMIC, fstrPARAM, hecLagMAT, iter, conMAT)
This subrouitne set acceleration boundary condition in dynamic analysis.
Definition: dynamic_mat_ass_bc_ac.f90:15
m_fstr::fstr_couple
Data for coupling analysis.
Definition: m_fstr.f90:611
m_solve_lineq_contact::solve_lineq_contact
subroutine, public solve_lineq_contact(hecMESH, hecMAT, hecLagMAT, conMAT, istat, rf, is_contact_active)
This subroutine.
Definition: hecmw_solver_contact.f90:74
m_fstr_residual::fstr_get_norm_para_contact
real(kind=kreal) function, public fstr_get_norm_para_contact(hecMAT, hecLagMAT, conMAT, hecMESH)
Definition: fstr_Residual.f90:240
m_dynamic_mat_ass_load
This module contains function to set boundary condition of external load in dynamic analysis.
Definition: dynamic_mat_ass_load.f90:7
m_dynamic_init_variables::dynamic_init_varibles
subroutine dynamic_init_varibles(hecMESH, hecMAT, fstrSOLID, fstrEIG, fstrDYNAMIC, fstrPARAM)
Definition: dynamic_var_init.f90:17
m_fstr_rcap_io::fstr_rcap_get
subroutine, public fstr_rcap_get(fstrCPL)
Definition: fstr_rcap_io.F90:215
mcontact::fstr_is_contact_active
logical function fstr_is_contact_active()
Definition: fstr_contact.f90:52
m_fstr_update::fstr_updatenewton
subroutine fstr_updatenewton(hecMESH, hecMAT, fstrSOLID, time, tincr, iter, strainEnergy)
Update displacement, stress, strain and internal forces.
Definition: fstr_Update.f90:26
m_fstr::fstr_set_current_config_to_mesh
subroutine fstr_set_current_config_to_mesh(hecMESH, fstrSOLID, coord)
Definition: m_fstr.f90:1098
fstr_dynamic_nlimplicit::fstr_solve_dynamic_nlimplicit_couple_pre
subroutine fstr_solve_dynamic_nlimplicit_couple_pre(hecMESH, hecMAT, fstrSOLID, fstrPARAM, fstrDYNAMIC, fstrCPL, restrt_step_num, PI, i)
Definition: fstr_dynamic_nlimplicit.f90:736
m_fstr::ista
integer(kind=kint), parameter ista
Definition: m_fstr.f90:108
m_dynamic_mat_ass_bc_ac
This module contains functions to set acceleration boundary condition in dynamic analysis.
Definition: dynamic_mat_ass_bc_ac.f90:7
fstr_matrix_con_contact
This module provides functions of reconstructing.
Definition: fstr_mat_con_contact.f90:9
m_solve_lineq_contact::solve_lineq_contact_init
subroutine, public solve_lineq_contact_init(hecMESH, hecMAT, hecLagMAT, is_sym)
This subroutine.
Definition: hecmw_solver_contact.f90:30
m_fstr_restart::fstr_write_restart_dyna_nl
subroutine fstr_write_restart_dyna_nl(cstep, hecMESH, fstrSOLID, fstrDYNAMIC, fstrPARAM, contactNode)
write out restart file for nonlinear dynamic analysis
Definition: fstr_Restart.f90:308
m_addcontactstiffness::fstr_addcontactstiffness
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...
Definition: fstr_AddContactStiff.f90:38
m_fstr_stiffmatrix
This module provides function to calculate tangent stiffness matrix.
Definition: fstr_StiffMatrix.f90:7
m_fstr_update::fstr_updatestate
subroutine fstr_updatestate(hecMESH, fstrSOLID, tincr)
Update elastiplastic status.
Definition: fstr_Update.f90:250
m_dynamic_mat_ass_bc
This module contains functions to set displacement boundary condition in dynamic analysis.
Definition: dynamic_mat_ass_bc.f90:7
fstr_dynamic_nlimplicit::fstr_solve_dynamic_nlimplicit_contactslag
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....
Definition: fstr_dynamic_nlimplicit.f90:339
m_fstr::ilog
integer(kind=kint), parameter ilog
FILE HANDLER.
Definition: m_fstr.f90:107
fstr_matrix_con_contact::fstr_mat_con_contact
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
Definition: fstr_mat_con_contact.f90:53
m_fstr_rcap_io::fstr_rcap_send
subroutine, public fstr_rcap_send(fstrCPL)
Definition: fstr_rcap_io.F90:185
m_fstr::fstr_recover_initial_config_to_mesh
subroutine fstr_recover_initial_config_to_mesh(hecMESH, fstrSOLID, coord)
Definition: m_fstr.f90:1111
fstr_dynamic_nlimplicit::fstr_solve_dynamic_nlimplicit_couple_init
subroutine fstr_solve_dynamic_nlimplicit_couple_init(fstrPARAM, fstrCPL)
Definition: fstr_dynamic_nlimplicit.f90:724
m_fstr_restart
This module provides functions to read in and write out restart files.
Definition: fstr_Restart.f90:8
mcontact
This module provides functions to calculate contact stiff matrix.
Definition: fstr_contact.f90:6
m_dynamic_output::matvec
subroutine matvec(y, x, hecMAT, ndof, D, AU, AL)
Definition: dynamic_output.f90:472
m_fstr::imsg
integer(kind=kint), parameter imsg
Definition: m_fstr.f90:110