FrontISTR  5.8.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%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  if (ndof == 4 .and. hecmesh%my_rank==0) write(*,'(a,i5)')"iter: ",i
473 
474  fstrdynamic%i_step = i
475  fstrdynamic%t_curr = fstrdynamic%t_delta * i
476 
477  if(hecmesh%my_rank==0) then
478  write(ista,'('' time step='',i10,'' time='',1pe13.4e3)') i,fstrdynamic%t_curr
479  write(*,'(A)')'-------------------------------------------------'
480  write(*,'('' time step='',i10,'' time='',1pe13.4e3)') i,fstrdynamic%t_curr
481  endif
482 
483  do j = 1 ,ndof*nnod
484  fstrdynamic%VEC1(j) = a1*fstrdynamic%ACC(j,1) + a2*fstrdynamic%VEL(j,1)
485  fstrdynamic%VEC2(j) = b1*fstrdynamic%ACC(j,1) + b2*fstrdynamic%VEL(j,1)
486  enddo
487 
488  count_step = 0
489  stepcnt = 0
490 
491  !C for couple analysis
492  do
493  fstrsolid%dunode(:) =0.d0
494  ! call fstr_UpdateEPState( hecMESH, fstrSOLID )
495  call fstr_solve_dynamic_nlimplicit_couple_init(fstrparam, fstrcpl)
496 
497  loopforcontactanalysis: do while( .true. )
498  count_step = count_step + 1
499 
500  ! ----- Inner Iteration
501  res0 = 0.d0
502  res1 = 0.d0
503  relres = 1.d0
504 
505  do iter = 1, fstrsolid%step_ctrl(cstep)%max_iter
506  stepcnt=stepcnt+1
507  if (fstrparam%nlgeom) then
508  call fstr_stiffmatrix( hecmesh, hecmat, fstrsolid, fstrdynamic%t_curr, fstrdynamic%t_delta )
509  else
510  if (.not. associated(hecmat0)) then
511  call fstr_stiffmatrix( hecmesh, hecmat, fstrsolid, fstrdynamic%t_curr, fstrdynamic%t_delta )
512  allocate(hecmat0)
513  call hecmw_mat_init(hecmat0)
514  call hecmw_mat_copy_profile(hecmat, hecmat0)
515  call hecmw_mat_copy_val(hecmat, hecmat0)
516  else
517  call hecmw_mat_copy_val(hecmat0, hecmat)
518  endif
519  endif
520 
521  if( fstrdynamic%ray_k/=0.d0 .or. fstrdynamic%ray_m/=0.d0 ) then
522  do j = 1 ,ndof*nnod
523  hecmat%X(j) = fstrdynamic%VEC2(j) - b3*fstrsolid%dunode(j)
524  enddo
525  endif
526  if( fstrdynamic%ray_k/=0.d0 ) then
527  if( hecmesh%n_dof == 3 ) then
528  call hecmw_matvec (hecmesh, hecmat, hecmat%X, fstrdynamic%VEC3)
529  else if( hecmesh%n_dof == 2 ) then
530  call hecmw_matvec (hecmesh, hecmat, hecmat%X, fstrdynamic%VEC3)
531  else if( hecmesh%n_dof == 6 ) then
532  call matvec(fstrdynamic%VEC3, hecmat%X, hecmat, ndof, hecmat%D, hecmat%AU, hecmat%AL)
533  endif
534  endif
535 
536  !C-- mechanical boundary condition
537  call dynamic_mat_ass_load (hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam, iter)
538  do j=1, hecmesh%n_node* hecmesh%n_dof
539  hecmat%B(j)=hecmat%B(j)- fstrsolid%QFORCE(j) + fstreig%mass(j)*( fstrdynamic%VEC1(j)-a3*fstrsolid%dunode(j) &
540  + fstrdynamic%ray_m* hecmat%X(j) ) + fstrdynamic%ray_k*fstrdynamic%VEC3(j)
541  enddo
542 
543  !C for couple analysis
544  call fstr_solve_dynamic_nlimplicit_couple_pre(hecmesh, hecmat, fstrsolid, &
545  & fstrparam, fstrdynamic, fstrcpl, restrt_step_num, pi, i)
546 
547  do j = 1 ,nn*hecmat%NP
548  hecmat%D(j) = c1* hecmat%D(j)
549  enddo
550  do j = 1 ,nn*hecmat%NPU
551  hecmat%AU(j) = c1* hecmat%AU(j)
552  enddo
553  do j = 1 ,nn*hecmat%NPL
554  hecmat%AL(j) = c1*hecmat%AL(j)
555  enddo
556  do j=1,nnod
557  do kk=1,ndof
558  idm = nn*(j-1)+1 + (ndof+1)*(kk-1)
559  imm = ndof*(j-1) + kk
560  hecmat%D(idm) = hecmat%D(idm) + c2*fstreig%mass(imm)
561  enddo
562  enddo
563 
564  call hecmw_mat_clear( conmat )
565  call hecmw_mat_clear_b( conmat )
566  conmat%X = 0.0d0
567 
568  if( fstr_is_contact_active() ) then
569  call fstr_update_ndforce_contact(cstep,hecmesh,hecmat,heclagmat,fstrsolid,conmat)
570  call fstr_addcontactstiffness(cstep,iter,conmat,heclagmat,fstrsolid)
571  endif
572 
573  !C-- geometrical boundary condition
574  call dynamic_mat_ass_bc (hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam, heclagmat, stepcnt, conmat=conmat)
575  call dynamic_mat_ass_bc_vl(hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam, heclagmat, stepcnt, conmat=conmat)
576  call dynamic_mat_ass_bc_ac(hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam, heclagmat, stepcnt, conmat=conmat)
577 
578  ! ----- check convergence
579  res = fstr_get_norm_para_contact(hecmat,heclagmat,conmat,hecmesh)
580 
581  if(iter == 1)then
582  res0 = res
583  endif
584 
585  ! ----- check convergence
586  if( .not.fstr_is_contact_active() ) then
587  maxdlag = 0.0d0
588  elseif( maxdlag == 0.0d0) then
589  maxdlag = 1.0d0
590  endif
591  call hecmw_allreduce_r1(hecmesh, maxdlag, hecmw_max)
592 
593  res = dsqrt(res/res0)
594  if( fstrparam%nlgeom .and. ndof /= 4 ) then
595  if( hecmesh%my_rank==0 ) then
596  write(*,'(a,i5,a,1pe12.4)')"iter: ",iter,", res: ",res
597  write(ista,'(''iter='',I5,''- Residual'',E15.7)')iter,res
598  write(*,'(a,1e15.7)') ' - MaxDLag =',maxdlag
599  write(ista,'(a,1e15.7)') ' - MaxDLag =',maxdlag
600  endif
601  if( res<fstrsolid%step_ctrl(cstep)%converg .and. maxdlag < converg_dlag ) exit
602  endif
603 
604  ! ---- For Parallel Contact with Multi-Partition Domains
605  hecmat%X = 0.0d0
606  call fstr_set_current_config_to_mesh(hecmesh,fstrsolid,coord)
607  call solve_lineq_contact(hecmesh,hecmat,heclagmat,conmat,istat,1.0d0,fstr_is_contact_active())
608  call fstr_recover_initial_config_to_mesh(hecmesh,fstrsolid,coord)
609 
610  ! ----- update external nodal displacement increments
611  call hecmw_update_r (hecmesh, hecmat%X, hecmat%NP, hecmat%NDOF)
612 
613  ! ----- update the strain, stress, and internal force
614  do j=1,hecmesh%n_node*ndof
615  fstrsolid%dunode(j) = fstrsolid%dunode(j)+hecmat%X(j)
616  enddo
617  call fstr_updatenewton( hecmesh, hecmat, fstrsolid, fstrdynamic%t_curr, &
618  & fstrdynamic%t_delta,iter, fstrdynamic%strainEnergy )
619 
620  if(.not. fstrparam%nlgeom) exit
621  if(ndof == 4) exit
622 
623  ! ----- update the Lagrange multipliers
624  if( fstr_is_contact_active() ) then
625  maxdlag = 0.0d0
626  do j=1,heclagmat%num_lagrange
627  heclagmat%lagrange(j) = heclagmat%lagrange(j) + hecmat%X(hecmesh%n_node*ndof+j)
628  if(dabs(hecmat%X(hecmesh%n_node*ndof+j))>maxdlag) maxdlag=dabs(hecmat%X(hecmesh%n_node*ndof+j))
629  ! write(*,*)'Lagrange:', j,hecLagMAT%lagrange(j),hecMAT%X(hecMESH%n_node*ndof+j)
630  enddo
631  endif
632  enddo
633 
634  ! ----- not convergence
635  if( iter>fstrsolid%step_ctrl(cstep)%max_iter ) then
636  if( hecmesh%my_rank==0) then
637  write(ilog,*) '### Fail to Converge : at step=', i
638  write(ista,*) '### Fail to Converge : at step=', i
639  write( *,*) ' ### Fail to Converge : at step=', i
640  endif
641  stop
642  endif
643 
644  call fstr_scan_contact_state(cstep, i, count_step, fstrdynamic%t_delta, ctalgo, hecmesh, fstrsolid, infoctchange, hecmat%B)
645 
646  if( hecmat%Iarray(99)==4 .and. .not. fstr_is_contact_active() ) then
647  write(*,*) ' This type of direct solver is not yet available in such case ! '
648  write(*,*) ' Please use intel MKL direct solver !'
649  call hecmw_abort(hecmw_comm_get_comm())
650  endif
651 
652  is_mat_symmetric = fstr_is_matrixstruct_symmetric(fstrsolid,hecmesh)
653  contact_changed_global=0
654  if( fstr_is_contact_conv(ctalgo,infoctchange,hecmesh) ) then
655  exit loopforcontactanalysis
656  elseif( fstr_is_matrixstructure_changed(infoctchange) ) then
657  call fstr_mat_con_contact( cstep, ctalgo, hecmat, fstrsolid, heclagmat, infoctchange, conmat, fstr_is_contact_active())
658  contact_changed_global=1
659  endif
660  call hecmw_allreduce_i1(hecmesh,contact_changed_global,hecmw_max)
661  if (contact_changed_global > 0) then
662  call hecmw_mat_clear_b( hecmat )
663  call hecmw_mat_clear_b( conmat )
664  call solve_lineq_contact_init(hecmesh,hecmat,heclagmat,is_mat_symmetric)
665  endif
666 
667  if( count_step > max_iter_contact ) exit loopforcontactanalysis
668 
669  enddo loopforcontactanalysis
670 
671  !C for couple analysis
672  call fstr_solve_dynamic_nlimplicit_couple_post(hecmesh, hecmat, fstrsolid, &
673  & fstrparam, fstrdynamic, fstrcpl, a1, a2, a3, b1, b2, b3, i, is_cycle)
674  if(is_cycle) cycle
675  exit
676  enddo
677 
678  !C-- new displacement, velocity and acceleration
679  fstrdynamic%kineticEnergy = 0.0d0
680  do j = 1 ,ndof*nnod
681  fstrdynamic%ACC (j,2) = -a1*fstrdynamic%ACC(j,1) - a2*fstrdynamic%VEL(j,1) + &
682  a3*fstrsolid%dunode(j)
683  fstrdynamic%VEL (j,2) = -b1*fstrdynamic%ACC(j,1) - b2*fstrdynamic%VEL(j,1) + &
684  b3*fstrsolid%dunode(j)
685  fstrdynamic%ACC (j,1) = fstrdynamic%ACC (j,2)
686  fstrdynamic%VEL (j,1) = fstrdynamic%VEL (j,2)
687 
688  fstrsolid%unode(j) = fstrsolid%unode(j)+fstrsolid%dunode(j)
689  fstrdynamic%DISP(j,2) = fstrsolid%unode(j)
690 
691  fstrdynamic%kineticEnergy = fstrdynamic%kineticEnergy + &
692  0.5d0*fstreig%mass(j)*fstrdynamic%VEL(j,2)*fstrdynamic%VEL(j,2)
693  enddo
694 
695  !C-- output new displacement, velocity and acceleration
696  call fstr_dynamic_output(hecmesh, fstrsolid, fstrdynamic, fstrparam)
697 
698  !C-- output result of monitoring node
699  call dynamic_output_monit(hecmesh, fstrparam, fstrdynamic, fstreig, fstrsolid)
700 
701  call fstr_updatestate( hecmesh, fstrsolid, fstrdynamic%t_delta )
702 
703  !--- Restart info
704  if( fstrdynamic%restart_nout > 0 ) then
705  if( mod(i,fstrdynamic%restart_nout).eq.0 .or. i.eq.fstrdynamic%n_step ) then
706  call fstr_write_restart_dyna_nl(i,hecmesh,fstrsolid,fstrdynamic,fstrparam,&
707  infoctchange%contactNode_current)
708  endif
709  endif
710 
711  enddo
712  !C-- end of time step loop
713 
714  if (associated(hecmat0)) then
715  call hecmw_mat_finalize(hecmat0)
716  deallocate(hecmat0)
717  endif
718 
719  time_2 = hecmw_wtime()
720  if( hecmesh%my_rank == 0 ) then
721  write(ista,'(a,f10.2,a)') ' solve (sec) :', time_2 - time_1, 's'
722  endif
723 
724  deallocate(coord)
726 
727  subroutine fstr_solve_dynamic_nlimplicit_couple_init(fstrPARAM, fstrCPL)
728  implicit none
729  type(fstr_param) :: fstrparam
730  type(fstr_couple) :: fstrCPL
731  if( fstrparam%fg_couple == 1) then
732  if( fstrparam%fg_couple_type==1 .or. &
733  fstrparam%fg_couple_type==3 .or. &
734  fstrparam%fg_couple_type==5 ) call fstr_rcap_get( fstrcpl )
735  endif
737 
738  subroutine fstr_solve_dynamic_nlimplicit_couple_pre(hecMESH, hecMAT, fstrSOLID, &
739  & fstrPARAM, fstrDYNAMIC, fstrCPL, restrt_step_num, PI, i)
740  implicit none
741  type(hecmwst_local_mesh) :: hecMESH
742  type(hecmwst_matrix) :: hecMAT
743  type(fstr_solid) :: fstrSOLID
744  type(fstr_param) :: fstrPARAM
745  type(fstr_dynamic) :: fstrDYNAMIC
746  type(fstr_couple) :: fstrCPL
747  integer(kint) :: kkk0, kkk1, j, kk, i, restrt_step_num
748  real(kreal) :: bsize, PI
749 
750  if( fstrparam%fg_couple == 1) then
751  if( fstrparam%fg_couple_first /= 0 ) then
752  bsize = dfloat( i ) / dfloat( fstrparam%fg_couple_first )
753  if( bsize > 1.0 ) bsize = 1.0
754  do kkk0 = 1, fstrcpl%coupled_node_n
755  kkk1 = 3 * kkk0
756  fstrcpl%trac(kkk1-2) = bsize * fstrcpl%trac(kkk1-2)
757  fstrcpl%trac(kkk1-1) = bsize * fstrcpl%trac(kkk1-1)
758  fstrcpl%trac(kkk1 ) = bsize * fstrcpl%trac(kkk1 )
759  enddo
760  endif
761  if( fstrparam%fg_couple_window > 0 ) then
762  j = i - restrt_step_num + 1
763  kk = fstrdynamic%n_step - restrt_step_num + 1
764  bsize = 0.5*(1.0-cos(2.0*pi*dfloat(j)/dfloat(kk)))
765  do kkk0 = 1, fstrcpl%coupled_node_n
766  kkk1 = 3 * kkk0
767  fstrcpl%trac(kkk1-2) = bsize * fstrcpl%trac(kkk1-2)
768  fstrcpl%trac(kkk1-1) = bsize * fstrcpl%trac(kkk1-1)
769  fstrcpl%trac(kkk1 ) = bsize * fstrcpl%trac(kkk1 )
770  enddo
771  endif
772  call dynamic_mat_ass_couple( hecmesh, hecmat, fstrsolid, fstrcpl )
773  endif
775 
776  subroutine fstr_solve_dynamic_nlimplicit_couple_post(hecMESH, hecMAT, fstrSOLID, &
777  & fstrPARAM, fstrDYNAMIC, fstrCPL, a1, a2, a3, b1, b2, b3, i, is_cycle)
778  implicit none
779  type(hecmwst_local_mesh) :: hecMESH
780  type(hecmwst_matrix) :: hecMAT
781  type(fstr_solid) :: fstrSOLID
782  type(fstr_param) :: fstrPARAM
783  type(fstr_dynamic) :: fstrDYNAMIC
784  type(fstr_couple) :: fstrCPL
785  integer(kint) :: kkk0, kkk1, j, i, revocap_flag
786  real(kreal) :: bsize, a1, a2, a3, b1, b2, b3
787  logical :: is_cycle
788 
789  is_cycle = .false.
790 
791  if( fstrparam%fg_couple == 1 ) then
792  if( fstrparam%fg_couple_type>1 ) then
793  do j=1, fstrcpl%coupled_node_n
794  if( fstrcpl%dof == 3 ) then
795  kkk0 = j*3
796  kkk1 = fstrcpl%coupled_node(j)*3
797 
798  fstrcpl%disp (kkk0-2) = fstrsolid%unode(kkk1-2) + fstrsolid%dunode(kkk1-2)
799  fstrcpl%disp (kkk0-1) = fstrsolid%unode(kkk1-1) + fstrsolid%dunode(kkk1-1)
800  fstrcpl%disp (kkk0 ) = fstrsolid%unode(kkk1 ) + fstrsolid%dunode(kkk1 )
801 
802  fstrcpl%velo (kkk0-2) = -b1*fstrdynamic%ACC(kkk1-2,1) - b2*fstrdynamic%VEL(kkk1-2,1) + &
803  b3*fstrsolid%dunode(kkk1-2)
804  fstrcpl%velo (kkk0-1) = -b1*fstrdynamic%ACC(kkk1-1,1) - b2*fstrdynamic%VEL(kkk1-1,1) + &
805  b3*fstrsolid%dunode(kkk1-1)
806  fstrcpl%velo (kkk0 ) = -b1*fstrdynamic%ACC(kkk1,1) - b2*fstrdynamic%VEL(kkk1,1) + &
807  b3*fstrsolid%dunode(kkk1)
808  fstrcpl%accel(kkk0-2) = -a1*fstrdynamic%ACC(kkk1-2,1) - a2*fstrdynamic%VEL(kkk1-2,1) + &
809  a3*fstrsolid%dunode(kkk1-2)
810  fstrcpl%accel(kkk0-1) = -a1*fstrdynamic%ACC(kkk1-1,1) - a2*fstrdynamic%VEL(kkk1-1,1) + &
811  a3*fstrsolid%dunode(kkk1-1)
812  fstrcpl%accel(kkk0 ) = -a1*fstrdynamic%ACC(kkk1,1) - a2*fstrdynamic%VEL(kkk1,1) + &
813  a3*fstrsolid%dunode(kkk1)
814  else
815  kkk0 = j*2
816  kkk1 = fstrcpl%coupled_node(j)*2
817 
818  fstrcpl%disp (kkk0-1) = fstrsolid%unode(kkk1-1) + fstrsolid%dunode(kkk1-1)
819  fstrcpl%disp (kkk0 ) = fstrsolid%unode(kkk1 ) + fstrsolid%dunode(kkk1 )
820 
821  fstrcpl%velo (kkk0-1) = -b1*fstrdynamic%ACC(kkk1-1,1) - b2*fstrdynamic%VEL(kkk1-1,1) + &
822  b3*fstrsolid%dunode(kkk1-1)
823  fstrcpl%velo (kkk0 ) = -b1*fstrdynamic%ACC(kkk1,1) - b2*fstrdynamic%VEL(kkk1,1) + &
824  b3*fstrsolid%dunode(kkk1)
825  fstrcpl%accel(kkk0-1) = -a1*fstrdynamic%ACC(kkk1-1,1) - a2*fstrdynamic%VEL(kkk1-1,1) + &
826  a3*fstrsolid%dunode(kkk1-1)
827  fstrcpl%accel(kkk0 ) = -a1*fstrdynamic%ACC(kkk1,1) - a2*fstrdynamic%VEL(kkk1,1) + &
828  a3*fstrsolid%dunode(kkk1)
829  endif
830  enddo
831  call fstr_rcap_send( fstrcpl )
832  endif
833 
834  select case ( fstrparam%fg_couple_type )
835  case (4)
836  call fstr_rcap_get( fstrcpl )
837  case (5)
838  call fstr_get_convergence( revocap_flag )
839  if( revocap_flag==0 ) is_cycle = .true.
840  case (6)
841  call fstr_get_convergence( revocap_flag )
842  if( revocap_flag==0 ) then
843  call fstr_rcap_get( fstrcpl )
844  is_cycle = .true.
845  else
846  if( i /= fstrdynamic%n_step ) call fstr_rcap_get( fstrcpl )
847  endif
848  end select
849  endif
851 
852 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:1131
integer(kind=kint), parameter imsg
Definition: m_fstr.f90:111
integer(kind=kint), parameter ilog
FILE HANDLER.
Definition: m_fstr.f90:108
subroutine fstr_set_current_config_to_mesh(hecMESH, fstrSOLID, coord)
Definition: m_fstr.f90:1118
integer(kind=kint), parameter ista
Definition: m_fstr.f90:109
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:620
Data for DYNAMIC ANSLYSIS (fstrDYNAMIC)
Definition: m_fstr.f90:513
Package of data used by Lanczos eigenvalue solver.
Definition: m_fstr.f90:602
FSTR INNER CONTROL PARAMETERS (fstrPARAM)
Definition: m_fstr.f90:155